Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A motivação para o VRS
Devido a restrições de desempenho, um renderizador gráfico nem sempre pode se dar ao luxo de oferecer o mesmo nível de qualidade para todas as partes de sua imagem de saída. O sombreamento de taxa variável — ou sombreamento de pixel grosseiro — é um mecanismo que permite alocar desempenho/energia de renderização em taxas que variam na imagem renderizada.
Em alguns casos, a taxa de sombreamento pode ser reduzida com pouca ou nenhuma redução na qualidade de saída percetível; levando a uma melhoria de desempenho essencialmente gratuita.
Sem VRS — suavização de borda com várias amostras com superamostragem
Sem sombreamento de taxa variável, o único meio de controlar a taxa de sombreamento é com anti-aliasing de várias amostras (MSAA) com execução baseada em amostra (também conhecida como superamostragem).
O MSAA é um mecanismo para reduzir o aliasing geométrico e melhorar a qualidade de renderização de uma imagem em comparação com o não uso do MSAA. A contagem de amostras do MSAA, que pode ser 1x, 2x, 4x, 8x ou 16x, controla o número de amostras alocadas por pixel de destino de renderização. A contagem de amostras do MSAA deve ser conhecida antecipadamente quando o destino é alocado e não pode ser alterada posteriormente.
A superamostragem faz com que o sombreador de pixel seja invocado uma vez por amostra, com uma qualidade mais alta, mas também com um custo de desempenho mais alto em comparação com a execução por pixel.
Seu aplicativo pode controlar sua taxa de sombreamento escolhendo entre execução baseada em pixel ou MSAA com superamostragem. Essas duas opções não fornecem um controle muito fino. Além disso, você pode querer uma taxa de sombreamento mais baixa para uma determinada classe de objetos em comparação com o resto da imagem. Tais objetos podem incluir um objeto atrás de um elemento HUD, ou uma transparência, um desfoque (profundidade de campo, movimento, etc.) ou uma distorção ótica devido à ótica VR. Mas isso não seria possível, porque a qualidade e os custos de sombreamento são fixos em toda a imagem.
Com sombreamento de taxa variável (VRS)
O modelo de sombreamento de taxa variável (VRS) estende a superamostragem com MSAA para a direção oposta, "pixel grosseiro", adicionando o conceito de sombreamento grosseiro. É aqui que o sombreamento pode ser realizado a uma frequência mais grosseira do que um pixel. Em outras palavras, um grupo de pixels pode ser sombreado como uma única unidade, e o resultado é então transmitido para todas as amostras no grupo.
Uma API de sombreamento grosseiro permite que seu aplicativo especifique o número de pixels que pertencem a um grupo sombreado ou pixel grosseiro. Você pode variar o tamanho do pixel grosseiro depois de alocar o destino de renderização. Assim, diferentes partes da tela ou diferentes passes de desenho podem ter diferentes taxas de sombreamento.
A seguir está uma tabela descrevendo qual nível MSAA é suportado com qual tamanho de pixel grosso, para plataformas que suportam sombreamento grosseiro:
- Para células marcadas Y, essa combinação está habilitada.
- Para células marcadas Cap, essa combinação é habilitada condicionalmente com base em uma tampa (AdditionalShadingRatesSupported).
- Para células que estão em branco, essa combinação não é suportada.
- Para células com sombreado de meio tom, essa combinação não é suportada, e envolve o rastreamento de mais de 16 amostras por chamada de sombreador de pixel. Para rastrear mais de 16 amostras, há barreiras adicionais de alinhamento de hardware para suporte, em comparação com os outros casos.
Camadas de recursos
Há duas camadas para a implementação do VRS e dois recursos que você pode consultar. Cada camada é descrita com mais detalhes após a tabela.
Nível 1
- A taxa de sombreamento só pode ser especificada por sorteio; não é mais granular do que isso.
- A taxa de sombreamento aplica-se uniformemente ao que é desenhado, independentemente de onde ele está dentro do alvo de renderização.
Nível 2
- A taxa de sombreamento pode ser especificada por sorteio, como no Nível 1. Também pode ser especificado por uma combinação de base por sorteio e de:
- Semântica de cada vértice provocador, e
- uma imagem de espaço de tela.
- As taxas de sombreamento das três fontes são combinadas usando um conjunto de combinadores.
- O tamanho do bloco de imagem com espaço de tela é 16x16 ou menor.
- A taxa de sombreamento solicitada pelo seu aplicativo é garantida para ser entregue exatamente (para precisão de filtros de reconstrução temporal e outros).
- SV_ShadingRate entrada PS é suportada.
- A taxa de sombreamento por vértice provocador (também conhecida como por primitiva) é válida quando um visor é usado e
SV_ViewportArrayIndexnão é gravado. - A taxa de vértice por provocação pode ser usada com mais de um visor se o recurso SupportsPerVertexShadingRateWithMultipleViewports estiver definido como
true. Além disso, nesse caso, essa taxa pode ser usada quandoSV_ViewportArrayIndexé gravado.
Lista de capacidades
-
AdicionalShadingRatesSupported
- Tipo booleano.
- Indica se os tamanhos de pixel grosseiro 2x4, 4x2 e 4x4 são suportados para renderização de amostra única; e se o tamanho de pixel grosseiro 2x4 é suportado para 2x MSAA.
-
SupportsPerVertexShadingRateWithMultipleViewports
- Tipo booleano.
- Indica se mais de uma janela de visualização pode ser usada com a taxa de sombreamento por vértice (também conhecida como por primitiva).
Especificando a taxa de sombreamento
Para flexibilidade nas aplicações, há uma variedade de mecanismos fornecidos para controlar a taxa de sombreamento. Diferentes mecanismos estão disponíveis dependendo da camada de recursos de hardware.
Lista de comandos
Este é o mecanismo mais simples para definir a taxa de sombreamento. Está disponível em todos os níveis.
Seu aplicativo pode especificar um tamanho de pixel grosseiro usando o ID3D12GraphicsCommandList5::RSSetShadingRate método. Essa API usa um único argumento enum. A API fornece um controle geral do nível de qualidade da renderização — a capacidade de definir a taxa de sombreamento por desenho.
Os valores para esse estado são expressos por meio da enumeração D3D12_SHADING_RATE.
Suporte de tamanho de pixel grosseiro
As taxas de sombreamento 1x1, 1x2, 2x1 e 2x2 são suportadas em todos os níveis.
Há um recurso, AdditionalShadingRatesSupported, para indicar se 2x4, 4x2 e 4x4 são suportados no dispositivo.
Imagem de espaço de tela (baseada em imagem)
Na Camada 2 e superior, você pode especificar a taxa de sombreamento de pixels com uma imagem de espaço na tela.
A imagem de espaço de tela permite que seu aplicativo crie uma imagem de "nível de detalhe (LOD)" indicando regiões de qualidade variável, como áreas que serão cobertas por desfoque de movimento, desfoque de profundidade de campo, objetos transparentes ou elementos da interface do usuário HUD. A resolução da imagem é em macroblocks; não está na resolução do destino de renderização. Em outras palavras, os dados da taxa de sombreamento são especificados em uma granularidade de blocos de pixel 8x8 ou 16x16, conforme indicado pelo tamanho do bloco VRS.
Tamanho do mosaico
Seu aplicativo pode consultar uma API para recuperar o tamanho de bloco VRS suportado para seu dispositivo.
As telhas são quadradas, e o tamanho refere-se à largura ou altura da telha em texels.
Se o hardware não suportar sombreamento de taxa variável de Nível 2, a consulta de capacidade para o tamanho do bloco retornará 0.
Se o de hardware suportar sombreamento de taxa variável de Nível 2, o tamanho do bloco será um desses valores.
- 8
- 16
- 32
Tamanho da imagem com espaço de tela
Para um destino de renderização de tamanho {rtWidth, rtHeight}, usando um determinado tamanho de bloco chamado VRSTileSize, a imagem de espaço de tela que o cobrirá é dessas dimensões.
{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }
O canto superior esquerdo da imagem de espaço de tela (0, 0) está bloqueado no canto superior esquerdo do destino de renderização (0, 0).
Para procurar a coordenada (x,y) de um bloco que corresponde a um local específico no destino de renderização, divida as coordenadas de espaço de janela de (x, y) pelo tamanho do bloco, ignorando bits fracionários.
Se a imagem do espaço na tela for maior do que o necessário para um determinado destino de renderização, as partes extras à direita e/ou inferior não serão usadas.
Se a imagem de espaço de tela for muito pequena para um determinado destino de renderização, qualquer tentativa de leitura da imagem além de suas extensões reais produzirá uma taxa de sombreamento padrão de 1x1. Isso ocorre porque o canto superior esquerdo da imagem de espaço na tela (0, 0) está bloqueado no canto superior esquerdo do destino de renderização (0, 0) e "ler além das extensões de destino de renderização" significa ler valores muito grandes para x e y.
Format, layout, propriedades do recurso
O formato desta superfície é uma superfície de 8 bits de canal único (DXGI_FORMAT_R8_UINT).
O recurso é dimensão TEXTURE2D.
Ele não pode ser organizado ou mipped. Deve ter explicitamente um nível de mip.
Tem contagem de amostras 1 e qualidade de amostra 0.
Tem layout de textura DESCONHECIDO. Implicitamente, não pode ser layout de linha principal, porque o adaptador cruzado não é permitido.
A maneira esperada na qual os dados de imagem do espaço de tela são preenchidos é
- Escreva os dados usando um sombreador de computação; a imagem do espaço de tela é vinculada como um UAV, ou
- Copie os dados para a imagem de espaço de tela.
Ao criar a imagem de espaço na tela, essas bandeiras são permitidas.
- NENHUM
- ALLOW_UNORDERED_ACCESS
- DENY_SHADER_RESOURCE
Estas bandeiras não são permitidas.
- ALLOW_RENDER_TARGET
- ALLOW_DEPTH_STENCIL
- ALLOW_CROSS_ADAPTER
- ALLOW_SIMULTANEOUS_ACCESS
- VIDEO_DECODE_REFERENCE_ONLY
O tipo de heap do recurso não pode ser UPLOAD nem READBACK.
O recurso não pode ser SIMULTANEOUS_ACCESS. O recurso não pode ser cross-adapter.
Dados
Cada byte da imagem de espaço de tela corresponde a um valor da enumeração D3D12_SHADING_RATE.
Estado do recurso
Um recurso precisa ser transferido para um estado somente leitura quando usado como uma imagem de espaço na tela. Um estado somente leitura, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE, é definido para essa finalidade.
O recurso de imagem é transferido para fora desse estado para se tornar gravável novamente.
Definição da imagem
A imagem de espaço de tela para especificar a taxa de sombreador é definida na lista de comandos.
Um recurso que foi definido como uma fonte de taxa de sombreamento não pode ser lido ou gravado a partir de qualquer estágio de sombreador.
Uma imagem de espaço de tela null pode ser definida para especificar a taxa de sombreador. Isso tem o efeito de 1x1 ser usado consistentemente como a contribuição da imagem de espaço de tela. Inicialmente, a imagem do espaço de tela pode ser considerada definida como null.
Promoção e decadência
Um recurso de imagem de espaço de tela não tem implicações especiais com relação à promoção ou decadência.
Atributo perprimitivo
Um atributo por primitiva adiciona a capacidade de especificar um termo de taxa de sombreamento como um atributo de um vértice provocador. Esse atributo é de sombra plana, ou seja, é propagado para todos os pixels no triângulo atual ou na primitiva de linha. O uso de um atributo por primitiva pode permitir um controle mais refinado da qualidade da imagem em comparação com os outros especificadores de taxa de sombreamento.
O atributo per-primitive é uma semântica configurável chamada SV_ShadingRate.
SV_ShadingRate existe como parte de HLSL Shader Model 6.4.
Se um VS ou GS definir SV_ShadingRate, mas o VRS não estiver habilitado, a configuração semântica não terá efeito. Se nenhum valor para SV_ShadingRate for especificado por primitivo, um valor de taxa de sombreamento de 1x1 será assumido como a contribuição por primitiva.
Combinação de fatores de taxa de sombreamento
As várias fontes de taxa de sombreamento são aplicadas em sequência usando este diagrama.
Cada par de A e B é combinado usando um combinador.
* Ao especificar uma taxa de sombreador por atributo de vértice.
- Se um sombreador de geometria for usado, a taxa de sombreamento pode ser especificada por meio disso.
- Se um sombreador de geometria não for usado, a taxa de sombreamento será especificada pelo vértice provocador.
Lista de combinadores
Os seguintes combinadores são suportados. Usando um combinador (C) e duas entradas (A e B).
- Passagem. C.xy = A.xy.
- Substituir. C.xy = B.xy.
- Maior qualidade. C.xy = min(A.xy, B.xy).
- Qualidade inferior. C.xy = máx(A.xy, B.xy).
- Aplicar o custo B relativo a A. C.xy = min(maxRate, A.xy + B.xy).
onde maxRate é a maior dimensão permitida de pixel grosseiro no dispositivo. Isso seria
-
D3D12_AXIS_SHADING_RATE_2X (ou seja, um valor de 1), se AdditionalShadingRatesSupported for
false. -
D3D12_AXIS_SHADING_RATE_4X (ou seja, um valor de 2), se AdditionalShadingRatesSupported for
true.
A escolha do combinador para sombreamento de taxa variável é definida na lista de comandos através ID3D12GraphicsCommandList5::RSSetShadingRate.
Se nenhum combinador for definido, eles permanecerão no padrão, que é PASSTHROUGH.
Se a origem de um combinador for um D3D12_AXIS_SHADING_RATE, o que não é permitido na tabela de suporte, a entrada será limpa para uma taxa de sombreamento que é suportada.
Se a saída de um combinador não corresponder a uma taxa de sombreamento suportada na plataforma, o resultado será limpo para uma taxa de sombreamento que é suportada.
Estado padrão e compensação de estado
Todas as fontes de taxa de sombreamento, a saber:
- a taxa especificada pelo estado do pipeline (especificada na lista de comandos),
- a taxa especificada pela imagem no espaço da tela, e
- o atributo per-primitive
têm um padrão de D3D12_SHADING_RATE_1X1. Os combinadores padrão são {PASSTHROUGH, PASSTHROUGH}.
Se nenhuma imagem de espaço de tela for especificada, uma taxa de sombreamento de 1x1 será inferida a partir dessa fonte.
Se nenhum atributo perprimitivo for especificado, uma taxa de sombreamento de 1x1 será inferida a partir dessa fonte.
ID3D12CommandList::ClearState redefine a taxa especificada pelo estado do pipeline para o padrão e a seleção da imagem de espaço de tela para o padrão de "nenhuma imagem de espaço de tela".
Consultando a taxa de sombreamento usando SV_ShadingRate
É útil saber qual taxa de sombreamento foi selecionada pelo hardware em qualquer chamada de sombreador de pixel. Isso pode permitir uma variedade de otimizações no seu código PS. Uma variável de sistema somente PS, SV_ShadingRate, fornece informações sobre a taxa de sombreamento.
Tipo
O tipo desta semântica é uint.
Interpretação dos dados
Os dados são interpretados como um valor da enumeração D3D12_SHADING_RATE.
Se o VRS não estiver a ser utilizado
Se o sombreamento de pixel grosseiro não estiver sendo usado, SV_ShadingRate será lido novamente como um valor de 1x1, indicando pixels finos.
Comportamento sob execução baseada em amostra
Um sombreador de pixel falhará na compilação se inserir SV_ShadingRate e também usar a execução baseada em exemplo — por exemplo, inserindo SV_SampleIndexou usando a palavra-chave de interpolação de exemplo.
Observações sobre sombreamento diferido
Os passes de iluminação de um aplicativo de sombreamento diferido podem precisar saber qual taxa de sombreamento foi usada para qual área da tela. Isto é para que os despachos de passe de iluminação possam ser lançados a uma taxa mais grosseira. A variável
SV_ShadingRatepode ser usada para fazer isso se for gravada no gbuffer.
Profundidade e estêncil
Quando o sombreamento de pixel grosseiro é usado, a profundidade, o estêncil e a cobertura são sempre calculados e emitidos na resolução total da amostra.
Usando a taxa de sombreamento solicitada
Para todas as camadas, espera-se que, se uma taxa de sombreamento for solicitada e for suportada na combinação de nível de dispositivo e MSAA, essa seja a taxa de sombreamento fornecida pelo hardware.
Uma taxa de sombreamento solicitada significa uma taxa de sombreamento calculada como uma saída dos combinadores (consulte a seção Combinando fatores de taxa de sombreamento neste tópico).
Uma taxa de sombreamento suportada é 1x1, 1x2, 2x1 ou 2x2 em uma operação de renderização em que a contagem de amostras é menor ou igual a quatro. Se o recurso AdditionalShadingRatesSupported for true, então 2x4, 4x2 e 4x4 também terão taxas de sombreamento suportadas para algumas contagens de amostra (consulte a tabela na seção Com sombreamento de taxa variável (VRS) neste tópico).
Derivados do espaço de tela
Os cálculos de gradientes de pixel para pixel adjacente são afetados pelo sombreamento de pixel grosseiro. Por exemplo, quando pixels grosseiros 2x2 são usados, um gradiente terá o dobro do tamanho em comparação com quando pixels grosseiros não são usados. Seu aplicativo pode querer ajustar sombreadores para compensar isso — ou não, dependendo da funcionalidade desejada.
Como as mips são escolhidas com base em uma derivada de espaço de tela, o uso de sombreamento de pixel grosseiro afeta a seleção de mip. O uso de sombreamento de pixel grosseiro faz com que mips menos detalhados sejam selecionados em comparação com quando pixels grosseiros não são usados.
Interpolação de atributos
As entradas para um sombreador de pixel podem ser interpoladas com base em seus vértices de origem. Como o sombreamento de taxa variável afeta as áreas do destino gravadas por cada invocação do sombreador de pixel, ele interage com a interpolação de atributos. Os três tipos de interpolação são centro, centróide e amostra.
Centro
O local de interpolação central para um pixel grosseiro é o centro geométrico da área total do pixel grosso.
SV_Position é sempre interpolado no centro da região do pixel grosseiro.
Centróide
Quando o sombreamento de pixel grosseiro é usado com o MSAA, para cada pixel fino ainda haverá gravações no número total de amostras alocadas para o nível MSAA do destino. Assim, o local de interpolação centróide considerará todas as amostras para pixels finos dentro de pixels grosseiros. Dito isto, o local de interpolação centróide é definido como a primeira amostra coberta, em ordem crescente de índice amostral. A cobertura efetiva da amostra é AND-ed com o bit correspondente do estado do rasterizador SampleMask.
Observação
Quando o sombreamento de pixel grosseiro é usado na Camada 1, SampleMask é sempre uma máscara completa. Se SampleMask estiver configurado para não ser uma máscara completa, o sombreamento de pixel grosseiro será desativado na Camada 1.
Execução baseada em amostras
A execução baseada em amostra ou de superamostragem — que é causada pelo uso do recurso de interpolação de amostra — pode ser usada com sombreamento de pixel grosseiro e faz com que o sombreador de pixel seja invocado por amostra. Para destinos de contagem de amostra N, o sombreador de pixel é invocado N vezes por pixel fino.
EvaluateAttributeSnapped
As intrínsecas do modelo pull-model não são compatíveis com sombreamento de pixel grosseiro no Tier 1. Se houver uma tentativa de usar intrínsecos de modelo de tração com sombreamento de pixel grosseiro na Camada 1, o sombreamento de pixel grosseiro será automaticamente desativado.
O EvaluateAttributeSnapped intrínseco pode ser usado com sombreamento de pixel grosseiro no Nível 2. A sua sintaxe é a mesma de sempre.
numeric EvaluateAttributeSnapped(
in attrib numeric value,
in int2 offset);
Para contexto, EvaluateAttributeSnapped tem um parâmetro offset com dois campos. Quando usado sem sombreamento de pixel grosseiro, apenas os quatro bits de ordem inferior dos trinta e dois completos são usados. Estes quatro bits representam o intervalo [-8, 7]. Este intervalo abrange uma grelha de 16x16 dentro de um pixel. O intervalo é tal que as bordas superior e esquerda do pixel estão incluídas, e as bordas inferior e direita não. O deslocamento (-8, -8) está no canto superior esquerdo e o deslocamento (7, 7) está no canto inferior direito. Deslocamento (0, 0) é o centro do pixel.
Quando usado com sombreamento de pixel grosseiro, o parâmetro de deslocamento do EvaluateAttributeSnappedé capaz de especificar uma gama mais ampla de locais. O parâmetro offset seleciona uma grade 16x16 para cada pixel fino, e há vários pixels finos. O intervalo expressível e o consequente número de bits utilizados dependem do tamanho grosseiro do pixel. As bordas superior e esquerda do pixel grosseiro estão incluídas, e as bordas inferior e direita não.
A tabela abaixo descreve a interpretação do parâmetro de deslocamento de EvaluateAttributeSnappedpara cada tamanho de pixel grosseiro.
Intervalo de deslocamento de EvaluateAttributeSnapped
| Tamanho do pixel grosseiro | Intervalo indexável | Tamanho representável do intervalo | Número de bits necessários {x, y} | Máscara binária de bits utilizáveis |
|---|---|---|---|---|
| 1x1 (multa) | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {000000000000xxxx, 00000000000xxxx} |
| 1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {000000000000xxxx, 0000000000xxxxx} |
| 2x1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {00000000000xxxxx, 00000000000xxxx} |
| 2x2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {00000000000xxxxx, 0000000000xxxxx} |
| 2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {00000000000xxxxx, 000000000xxxxxx} |
| 4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {0000000000xxxxxx, 0000000000xxxxx} |
| 4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {000000000xxxxxx, 000000000xxxxxx} |
As tabelas abaixo são um guia para conversão do ponto fixo para representação decimal e fracionária. O primeiro bit utilizável na máscara binária é o bit de sinal, e o resto da máscara binária compreende a parte numérica.
O esquema de números para valores de quatro bits passados para EvaluateAttributeSnapped não é específico para sombreamento de taxa variável. É reiterado aqui para completude.
Para valores de quatro bits.
| Valor binário | Decimal | Fracionário |
|---|---|---|
| 1000 | -0.5f | -8 / 16 |
| 1001 | -0,4375F | -7 / 16 |
| 1010 | -0,375 F | -6 / 16 |
| 1011 | -0,3125F | -5 / 16 |
| 1100 | -0.25f | -4 / 16 |
| 1101 | -0,1875F | -3 / 16 |
| 1110 | -0.125F | -2 / 16 |
| 1111 | -0,0625f | -1 /16 |
| 0000 | 0,0 f | 0 / 16 |
| 0001 | -0,0625f | 1 / 16 |
| 0010 | -0.125F | 2 / 16 |
| 0011 | -0,1875F | 3 / 16 |
| 0100 | -0.25f | 4 / 16 |
| 0101 | -0,3125F | 5 / 16 |
| 0110 | -0,375 F | 6 / 16 |
| 0111 | -0,4375F | 7 / 16 |
Para valores de cinco bits.
| Valor binário | Decimal | Fracionário |
|---|---|---|
| 10000 | -1 | -16 / 16 |
| 10001 | -0.9375 | -15 / 16 |
| 10010 | -0.875 | -14 / 16 |
| 10011 | -0.8125 | -13 / 16 |
| 10100 | -0.75 | -12 / 16 |
| 10101 | -0.6875 | -11 / 16 |
| 10110 | -0.625 | -10 / 16 |
| 10111 | -0.5625 | -9 / 16 |
| 11000 | -0.5 | -8 / 16 |
| 11001 | -0.4375 | -7 / 16 |
| 11010 | -0.375 | -6 / 16 |
| 11011 | -0.3125 | -5 / 16 |
| 11100 | -0.25 | -4 / 16 |
| 11101 | -0.1875 | -3 / 16 |
| 11110 | -0.125 | -2 / 16 |
| 11111 | -0.0625 | -1 / 16 |
| 00000 | 0 | 0 / 16 |
| 00001 | 0.0625 | 1 / 16 |
| 00010 | 0.125 | 2 / 16 |
| 00011 | 0.1875 | 3 / 16 |
| 00100 | 0.25 | 4 / 16 |
| 00101 | 0.3125 | 5 / 16 |
| 00110 | 0.375 | 6 / 16 |
| 00111 | 0.4375 | 7 / 16 |
| 01000 | 0.5 | 8 / 16 |
| 01001 | 0.5625 | 9 / 16 |
| 01010 | 0.625 | 10 / 16 |
| 01011 | 0.6875 | 11 / 16 |
| 01100 | 0.75 | 12 / 16 |
| 01101 | 0.8125 | 13 / 16 |
| 01110 | 0.875 | 14 / 16 |
| 01111 | 0.9375 | 15 / 16 |
Para valores de seis bits.
| Valor binário | Decimal | Fracionário |
|---|---|---|
| 100000 | -2 | -32 / 16 |
| 100001 | -1.9375 | -31 / 16 |
| 100010 | -1.875 | -30 / 16 |
| 100011 | -1.8125 | -29 / 16 |
| 100100 | -1.75 | -28 / 16 |
| 100101 | -1.6875 | -27 / 16 |
| 100110 | -1.625 | -26 / 16 |
| 100111 | -1.5625 | -25 / 16 |
| 101000 | -1.5 | -24 / 16 |
| 101001 | -1.4375 | -23 / 16 |
| 101010 | -1.375 | -22 / 16 |
| 101011 | -1.3125 | -21 / 16 |
| 101100 | -1.25 | -20 / 16 |
| 101101 | -1.1875 | -19 / 16 |
| 101110 | -1.125 | -18 / 16 |
| 101111 | -1.0625 | -17 / 16 |
| 110000 | -1 | -16 / 16 |
| 110001 | -0.9375 | -15 / 16 |
| 110010 | -0.875 | -14 / 16 |
| 110011 | -0.8125 | -13 / 16 |
| 110100 | -0.75 | -12 / 16 |
| 110101 | -0.6875 | -11 / 16 |
| 110110 | -0.625 | -10 / 16 |
| 110111 | -0.5625 | -9 / 16 |
| 111000 | -0.5 | -8 / 16 |
| 111001 | -0.4375 | -7 / 16 |
| 111010 | -0.375 | -6 / 16 |
| 111011 | -0.3125 | -5 / 16 |
| 111100 | -0.25 | -4 / 16 |
| 111101 | -0.1875 | -3 / 16 |
| 111110 | -0.125 | -2 / 16 |
| 111111 | -0.0625 | -1 / 16 |
| 000000 | 0 | 0 / 16 |
| 000001 | 0.0625 | 1 / 16 |
| 000010 | 0.125 | 2 / 16 |
| 000011 | 0.1875 | 3 / 16 |
| 000100 | 0.25 | 4 / 16 |
| 000101 | 0.3125 | 5 / 16 |
| 000110 | 0.375 | 6 / 16 |
| 000111 | 0.4375 | 7 / 16 |
| 001000 | 0.5 | 8 / 16 |
| 001001 | 0.5625 | 9 / 16 |
| 001010 | 0.625 | 10 / 16 |
| 001011 | 0.6875 | 11 / 16 |
| 001100 | 0.75 | 12 / 16 |
| 001101 | 0.8125 | 13 / 16 |
| 001110 | 0.875 | 14 / 16 |
| 001111 | 0.9375 | 15 / 16 |
| 010000 | 1 | 16 / 16 |
| 010001 | 1.0625 | 17 / 16 |
| 010010 | 1.125 | 18 / 16 |
| 010011 | 1.1875 | 19 / 16 |
| 010100 | 1.25 | 20 / 16 |
| 010101 | 1.3125 | 21 / 16 |
| 010110 | 1.375 | 22 / 16 |
| 010111 | 1.4375 | 23 / 16 |
| 011000 | 1.5 | 24 / 16 |
| 011001 | 1.5625 | 25 / 16 |
| 011010 | 1.625 | 26 / 16 |
| 011011 | 1.6875 | 27 / 16 |
| 011100 | 1.75 | 28 / 16 |
| 011101 | 1.8125 | 29 / 16 |
| 011110 | 1.875 | 30 / 16 |
| 011111 | 1.9375 | 31 / 16 |
Da mesma forma que com pixels finos, a grade de locais avaliáveis de EvaluateAttributeSnappedé centralizada no centro de pixels grosseiros ao usar sombreamento de pixel grosseiro.
SetSamplePositions
Quando a API ID3D12GraphicsCommandList1::SetSamplePositions é usada com sombreamento grosseiro, a API define as posições de exemplo para pixels finos.
SV_Coverage
Se SV_Coverage for declarado como uma entrada ou saída de sombreador na Camada 1, o sombreamento de pixel grosseiro será desativado.
Você pode usar a semântica SV_Coverage com sombreamento de pixel grosseiro na Camada 2 e ela reflete quais amostras de um destino MSAA estão sendo gravadas.
Quando o sombreamento de pixel grosseiro é usado, permitindo que vários pixels de origem componham um bloco, a máscara de cobertura representa todas as amostras provenientes desse bloco.
Dada a compatibilidade do sombreamento de pixel grosseiro com o MSAA, o número de bits de cobertura necessários para ser especificado pode variar. Por exemplo, com um recurso MSAA 4x usando D3D12_SHADING_RATE_2x2, cada pixel grosseiro grava em quatro pixels finos e cada pixel fino tem quatro amostras. Isto significa que cada pixel grosseiro grava num total de 4 * 4 = 16 amostras.
Número de bits de cobertura necessários
A tabela a seguir indica quantos bits de cobertura são necessários para cada combinação de tamanho de pixel grosseiro e nível MSAA.
Conforme indicado na tabela, não é possível usar pixels grosseiros para gravar em mais de 16 amostras de cada vez usando o recurso de sombreamento de taxa variável exposto por meio do Direct3D 12. Essa restrição se deve às restrições do Direct3D 12 em relação a quais níveis de MSAA são permitidos com qual tamanho de pixel grosseiro (consulte a tabela na seção Com sombreamento de taxa variável (VRS) neste tópico).
Ordenação e formato de bits na máscara de cobertura
Os bits da máscara de cobertura obedecem a uma ordem bem definida. A máscara consiste em coberturas de pixels da esquerda para a direita e, em seguida, de cima para baixo (coluna maior). Os bits de cobertura são os bits de baixa ordem da semântica de cobertura e são densamente agrupados.
A tabela abaixo mostra o formato da máscara de cobertura para combinações suportadas de tamanho de pixel grosseiro e nível MSAA.
A tabela a seguir retrata 2x pixels MSAA, onde cada pixel tem duas amostras de índices 0 e 1.
O posicionamento das etiquetas das amostras nos pixels são para fins ilustrativos, e não necessariamente transmitem as localizações espaciais {X, Y} das amostras nesse pixel; especialmente dado que as posições da amostra podem ser alteradas programaticamente. As amostras são referidas pelo seu índice baseado em 0.
A tabela a seguir mostra 4x pixels MSAA, onde cada pixel tem quatro amostras de índices 0, 1, 2 e 3.
Rejeitar
Quando a discard semântica HLSL é usada com sombreamento de pixel grosseiro, pixels grosseiros são descartados.
Rasterização independente do alvo (TIR)
O TIR não é suportado quando é utilizado sombreamento de píxeis grosseiro.
Visualizações de ordem raster (ROVs)
Os intertravamentos ROV são especificados como operando com granularidade de pixel fina. Se o sombreamento for realizado por amostra, os intertravamentos estarão operando na granularidade da amostra.
Rasterização conservadora
Você pode usar rasterização conservadora com sombreamento de taxa variável. Quando a rasterização conservadora é usada com sombreamento de pixel grosseiro, pixels finos dentro de pixels grosseiros são rasterizados conservadoramente recebendo cobertura total.
Cobertura
Quando a rasterização conservadora é usada, a semântica de cobertura contém máscaras completas para pixels finos que são cobertos e 0 para pixels finos que não são cobertos.
Pacotes
Você pode chamar APIs de sombreamento de taxa variável em um pacote.
Renderizar passes
Você pode chamar APIs de sombreamento de taxa variável em um passo de renderização .
Chamando as APIs do VRS
Esta próxima seção descreve a maneira como o sombreamento de taxa variável é acessível ao seu aplicativo por meio do Direct3D 12.
Consulta de capacidade
Para consultar a capacidade de sombreamento de taxa variável do adaptador, chame ID3D12Device::CheckFeatureSupport com D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6e forneça uma estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS6 para a função ser preenchida para você. A estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS6 contém vários membros, incluindo um que é do tipo enumerado D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) e um que indica se o processamento em segundo plano é suportado (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).
Para consultar o recurso de Nível 1, por exemplo, você pode fazer isso.
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return
SUCCEEDED(m_device->CheckFeatureSupport(
D3D12_FEATURE_D3D12_OPTIONS6,
&options,
sizeof(options))) &&
options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;
Taxas de sombreamento
Os valores no de enumeraçãoD3D12_SHADING_RATE são organizados de modo que as taxas de sombreamento sejam facilmente decomponíveis em dois eixos, onde os valores de cada eixo são compactamente representados no espaço logarítmico de acordo com o D3D12_AXIS_SHADING_RATE enumeração.
Você pode criar uma macro para compor duas taxas de sombreamento de eixo em uma taxa de sombreamento como esta.
#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
D3D12_AXIS_SHADING_RATE_2X,
D3D12_AXIS_SHADING_RATE_1X)
A plataforma também fornece essas macros, definidas em d3d12.h.
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )
Estes podem ser usados para dissecar e compreender SV_ShaderRate.
Observação
Essa interpretação de dados é voltada para descrever a imagem do espaço da tela, que pode ser manipulada por sombreadores. Isso é discutido mais adiante nas seções acima. Mas não há razão para não ter uma definição consistente dos tamanhos de pixels grosseiros a serem usados em todos os lugares, inclusive ao definir a taxa de sombreamento no nível de comando.
Definindo a taxa de sombreamento no nível de comando e combinadores
A taxa de sombreamento e, opcionalmente, os combinadores são especificados por meio do método ID3D12GraphicsCommandList5::RSSetShadingRate. Você passa um valor D3D12_SHADING_RATE para a taxa de sombreamento base e uma matriz opcional de valores D3D12_SHADING_RATE_COMBINER.
Preparando a imagem do espaço de tela
O estado do recurso somente leitura que designa uma imagem de taxa de sombreamento utilizável é definido como D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.
Definindo a imagem de espaço de tela
Você especifica a imagem de espaço de tela por meio do métodoID3D12GraphicsCommandList5::RSSetShadingRateImage.
m_commandList->RSSetShadingRateImage(screenSpaceImage);
Consultando o tamanho do bloco
Você pode consultar o tamanho do bloco a partir do membroD3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize. Consulte de consulta de capacidade acima.
Uma dimensão é recuperada, uma vez que as dimensões horizontal e vertical são sempre as mesmas. Se a capacidade do sistema for D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, o tamanho do bloco retornado será 0.