VRS (sombreamento de taxa variável)

A motivação para VRS

Devido a restrições de desempenho, um renderizador de gráficos nem sempre pode oferecer o mesmo nível de qualidade a cada parte de sua imagem de saída. O sombreamento de taxa variável ou sombreamento de pixels grosseiros é um mecanismo que permite alocar desempenho/energia de renderização a taxas que variam em toda a imagem renderizada.

Em alguns casos, a taxa de sombreamento pode ser reduzida com pouca ou nenhuma redução na qualidade de saída perceptível; levando a uma melhoria de desempenho essencialmente gratuita.

Sem VRS — anti-aliasing de vários exemplos com supersampling

Sem sombreamento de taxa variável, o único meio de controlar a taxa de sombreamento é com a MSAA (anti-aliasing) de vários exemplos com execução baseada em exemplo (também conhecida como supersampling).

O MSAA é um mecanismo para reduzir o aliasamento 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 exemplos msaa, que pode ser 1x, 2x, 4x, 8x ou 16x, rege o número de amostras alocadas por pixel de destino de renderização. A contagem de exemplos msaa deve ser conhecida antecipadamente quando o destino é alocado e não pode ser alterado depois disso.

A substituição faz com que o sombreador de pixels seja invocado uma vez por exemplo, com uma qualidade mais alta, mas também 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 a execução baseada em pixel ou MSAA-with-supersampling. Essas duas opções não fornecem um controle muito bom. Além disso, talvez você queira uma taxa de sombreamento mais baixa para uma determinada classe de objetos em comparação com o restante da imagem. Esses objetos podem incluir um objeto por trás de um elemento HUD ou uma transparência, um desfoque (profundidade de campo, movimento etc.) ou uma distorção óptica devido à óptica VR. Mas isso não seria possível, porque a qualidade e os custos de sombreamento são corrigidos em toda a imagem.

Com vrs (sombreamento de taxa variável)

O modelo vrs (sombreamento de taxa variável) estende supersampling-with-MSAA para a direção oposta, "pixel grosseiro", adicionando o conceito de sombreamento grosseiro. É aí que o sombreamento pode ser executado em uma frequência mais grosseira do que um pixel. Em outras palavras, um grupo de pixels pode ser sombreado como uma única unidade e, em seguida, o resultado é transmitido para todos os exemplos no grupo.

Uma API de sombreamento grosseiro permite que seu aplicativo especifique o número de pixels que pertencem a um grupo sombreado ou pixels grosseiros. Você pode variar o tamanho do pixel grosseiro depois de alocar o destino de renderização. Portanto, diferentes partes da tela ou diferentes passes de desenho podem ter taxas de sombreamento diferentes.

Veja a seguir uma tabela que descreve qual nível msaa tem suporte com qual tamanho de pixel grosseiro, para plataformas que dão suporte a sombreamento grosseiro:

  • Para células marcadas como Y, essa combinação está habilitada.
  • Para células marcadas como Cap, essa combinação é habilitada condicionalmente com base em um limite (AdditionalShadingRatesSupported).
  • Para células em branco, essa combinação não tem suporte.
  • Para células sombreadas por meio tom, essa combinação não tem suporte e envolve o acompanhamento de mais de 16 amostras por invocação de sombreador de pixel. Para acompanhar mais de 16 exemplos, há barreiras adicionais de alinhamento de hardware para dar suporte, em comparação com os outros casos.

A tabela mostra o tamanho do pixel grosseiro para níveis de M S A A.

Camadas de recursos

Há duas camadas para a implementação do VRS e duas funcionalidades que você pode consultar. Cada camada é descrita com mais detalhes após a tabela.

Tabela mostra os recursos disponíveis nas Camadas 1 e 2.

Camada 1

  • A taxa de sombreamento só pode ser especificada por desenho; não mais granular do que isso.
  • A taxa de sombreamento aplica-se uniformemente ao que é desenhado independentemente de onde ela está dentro do destino de renderização.

Camada 2

  • A taxa de sombreamento pode ser especificada por sorteio, como na Camada 1. Ele também pode ser especificado por uma combinação de base por desenho e de:
    • Semântica de cada vértice provocante, e
    • uma imagem de espaço na tela.
  • As taxas de sombreamento das três fontes são combinadas usando um conjunto de combinadores.
  • O tamanho do bloco da imagem de espaço na tela é 16x16 ou menor.
  • A taxa de sombreamento solicitada pelo aplicativo é garantida para ser entregue exatamente (para precisão de filtros temporais e outros filtros de reconstrução).
  • SV_ShadingRate entrada PS tem suporte.
  • A taxa de sombreamento por vértice de provocação (também conhecida como por primitivo) é válida quando um visor é usado e SV_ViewportArrayIndex não é gravado.
  • A taxa de vértice por provocação poderá ser usada com mais de um visor se a funcionalidade SupportsPerVertexShadingRateWithMultipleViewports for definida truecomo . Além disso, nesse caso, essa taxa pode ser usada quando SV_ViewportArrayIndex é gravada.

List of capabilities

  • AdditionalShadingRatesSupported
    • Tipo booliano.
    • Indica se os tamanhos de pixels 2x4, 4x2 e 4x4 são compatíveis com a renderização de amostra única; e se o tamanho do pixel 2x4 é compatível com 2x MSAA.
  • SupportsPerVertexShadingRateWithMultipleViewports
    • Tipo booliano.
    • Indica se mais de um visor pode ser usado com a taxa de sombreamento por vértice (também conhecida como por primitivo).

Especificando a taxa de sombreamento

Para flexibilidade em aplicativos, há uma variedade de mecanismos fornecidos para controlar a taxa de sombreamento. Mecanismos diferentes estão disponíveis dependendo da camada de recursos de hardware.

Lista de comandos

Esse é o mecanismo mais simples para definir a taxa de sombreamento. Ele está disponível em todas as camadas.

Seu aplicativo pode especificar um tamanho de pixel grosseiro usando o método ID3D12GraphicsCommandList5::RSSetShadingRate. Essa API usa um único argumento de enumeração. A API fornece um controle geral do nível de qualidade para 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 ao tamanho do pixel grosseiro

As taxas de sombreamento 1x1, 1x2, 2x1 e 2x2 têm suporte em todas as camadas.

Há uma funcionalidade , AdditionalShadingRatesSupported, para indicar se há suporte para 2x4, 4x2 e 4x4 no dispositivo.

Imagem de espaço na 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 na tela permite que seu aplicativo crie uma imagem de "máscara lod (nível de detalhes) 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 do HUD. A resolução da imagem está em macroblocks; não está na resolução do destino de renderização. Em outras palavras, os dados de taxa de sombreamento são especificados em uma granularidade de blocos de 8x8 ou 16 x 16 pixels, conforme indicado pelo tamanho do bloco VRS.

Tamanho de bloco

Seu aplicativo pode consultar uma API para recuperar o tamanho do bloco VRS com suporte para seu dispositivo.

Os blocos são quadrados e o tamanho refere-se à largura ou altura do bloco em texels.

Se o hardware não der suporte ao sombreamento de taxa variável de Camada 2, a consulta de funcionalidade para o tamanho do bloco retornará 0.

Se o hardware der suporte ao sombreamento de taxa variável de Camada 2, o tamanho do bloco será um desses valores.

  • 8
  • 16
  • 32

Tamanho da imagem de espaço na tela

Para um destino de renderização de tamanho {rtWidth, rtHeight}, usando um determinado tamanho de bloco chamado VRSTileSize, a imagem de espaço na tela que a cobrirá é dessas dimensões.

{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }

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).

Para pesquisar 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 de espaço na tela for maior do que precisa ser 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 na 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.

Formatar, layout, propriedades de recurso

O formato dessa superfície é uma superfície de 8 bits de canal único (DXGI_FORMAT_R8_UINT).

O recurso é a dimensão TEXTURE2D.

Ele não pode ser matrizizado ou mipped. Ele deve ter explicitamente um nível de mip.

Ele tem a contagem de exemplo 1 e a qualidade de exemplo 0.

Ele tem o layout de textura UNKNOWN. Ele implicitamente não pode ser um layout principal de linha, porque o adaptador cruzado não é permitido.

A maneira esperada em que os dados de imagem de espaço de tela são preenchidos é para

  1. Gravar os dados usando um sombreador de computação; a imagem de espaço na tela é associada como um UAV ou
  2. Copie os dados para a imagem de espaço na tela.

Ao criar a imagem de espaço na tela, esses sinalizadores são permitidos.

  • Nenhuma
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

Esses sinalizadores não são permitidos.

  • 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 tem permissão para ser adaptador cruzado.

Dados

Cada byte da imagem de espaço na 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 de 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.

Definindo a imagem

A imagem de espaço na 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 em nenhum estágio de sombreador.

Uma null imagem de espaço na tela 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 na tela. Inicialmente, a imagem de espaço na tela pode ser considerada como definida nullcomo .

Promoção e decadência

Um recurso de imagem de espaço na tela não tem implicações especiais em relação à promoção ou à decadência.

Atributo por primitivo

Um atributo por primitivo adiciona a capacidade de especificar um termo de taxa de sombreamento como um atributo de um vértice provocante. Esse atributo é de sombreamento plano, ou seja, ele é propagado para todos os pixels no triângulo atual ou primitivo de linha. O uso de um atributo por primitivo pode habilitar um controle mais refinado da qualidade da imagem em comparação com os outros especificadores de taxa de sombreamento.

O atributo por primitivo é uma semântica configurável chamada SV_ShadingRate. SV_ShadingRate existe como parte do Modelo de Sombreador HLSL 6.4.

Se um VS ou GS definir SV_ShadingRate, mas 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á considerado como a contribuição por primitiva.

Combinando fatores de taxa de sombreamento

As várias fontes de taxa de sombreamento são aplicadas em sequência usando este diagrama.

O diagrama mostra um estado de pipeline, rotulado como A, com taxa de sombreamento de vértice provocante, rotulada como B, aplicada em um Combinador e, em seguida, taxa de sombreamento baseada em imagem, rotulada como B, aplicada em um Combinador.

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 poderá ser especificada por meio disso.
  • Se um sombreador de geometria não for usado, a taxa de sombreamento será especificada pelo vértice provocante.

Lista de combinadores

Há suporte para os combinadores a seguir. Usando um Combinador (C) e duas entradas (A e B).

  • Passagem. C.xy = A.xy.
  • Substituição. C.xy = B.xy.
  • Qualidade mais alta. C.xy = min(A.xy, B.xy).
  • Qualidade mais baixa. C.xy = max(A.xy, B.xy).
  • Aplique o custo B em relação a A. C.xy = min(maxRate, A.xy + B.xy).

em que maxRate é a maior dimensão permitida de pixels grosseiros 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 por meio de ID3D12GraphicsCommandList5::RSSetShadingRate.

Se nenhum combinador for definido, eles permanecerão no padrão, que é PASSTHROUGH.

Se a origem para um combinador for um D3D12_AXIS_SHADING_RATE, o que não é permitido na tabela de suporte, a entrada será sanitizada para uma taxa de sombreamento com suporte .

Se a saída de um combinador não corresponder a uma taxa de sombreamento com suporte na plataforma, o resultado será higienizado para uma taxa de sombreamento com suporte .

Estado padrão e limpeza de estado

Todas as fontes de taxa de sombreamento, ou seja,

  • a taxa especificada pelo estado do pipeline (especificada na lista de comandos),
  • a taxa especificada pela imagem de espaço de tela e
  • o atributo por primitivo

têm um padrão de D3D12_SHADING_RATE_1X1. Os combinadores padrão são {PASSTHROUGH, PASSTHROUGH}.

Se nenhuma imagem de espaço na tela for especificada, uma taxa de sombreamento de 1x1 será inferida dessa origem.

Se nenhum atributo por primitivo for especificado, uma taxa de sombreamento de 1x1 será inferida dessa origem.

ID3D12CommandList::ClearState redefine a taxa especificada pelo estado do pipeline para o padrão e a seleção da imagem de espaço na tela para o padrão "sem imagem de espaço na tela".

Consultando a taxa de sombreamento usando SV_ShadingRate

É útil saber qual taxa de sombreamento foi selecionada pelo hardware em qualquer invocação de sombreador de pixel fornecida. Isso pode habilitar uma variedade de otimizações em seu código PS. Uma variável de sistema somente PS, SV_ShadingRate, fornece informações sobre a taxa de sombreamento.

Type

O tipo dessa semântica é uint.

Interpretação de dados

Os dados são interpretados como um valor da enumeração D3D12_SHADING_RATE .

Se VRS não estiver sendo usado

Se o sombreamento de pixels grosseiros não estiver sendo usado, será SV_ShadingRate lido novamente como um valor de 1x1, indicando pixels finos.

Comportamento em execução baseada em exemplo

Um sombreador de pixel falhará na compilação se ele inserir SV_ShadingRate e também usar a execução baseada em exemplo, por exemplo, inserindo SV_SampleIndexou usando o palavra-chave de interpolação de exemplo.

Comentários sobre sombreamento adiado

As passagens de iluminação de um aplicativo de sombreamento adiado podem precisar saber qual taxa de sombreamento foi usada para qual área da tela. Isso é para que os despachos de passagem de iluminação possam ser iniciados a uma taxa mais grosseira. A SV_ShadingRate variável poderá ser usada para fazer isso se for gravada no gbuffer.

Profundidade e estêncil

Quando o sombreamento de pixels grosseiros é usado, a profundidade e o estêncil e a cobertura são sempre computados e emitidos na resolução completa da amostra.

Usando a taxa de sombreamento solicitada

Para todas as camadas, espera-se que, se uma taxa de sombreamento for solicitada e tiver suporte na combinação de nível de dispositivo e MSAA, essa será 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 com suporte é 1x1, 1x2, 2x1 ou 2x2 em uma operação de renderização em que a contagem de exemplo é menor ou igual a quatro. Se a funcionalidade AdditionalShadingRatesSupported for true, as taxas de sombreamento 2x4, 4x2 e 4x4 também serão suportadas para algumas contagens de exemplo (consulte a tabela na seção Com sombreamento de taxa variável (VRS) neste tópico).

Derivativos de espaço na tela

Os cálculos de gradientes de pixel para pixel adjacente são afetados pelo sombreamento de pixels grosseiros. Por exemplo, quando pixels 2x2 grosseiros são usados, um gradiente terá o dobro do tamanho em comparação com quando pixels grosseiros não forem usados. Seu aplicativo pode querer ajustar sombreadores para compensar isso, ou não, dependendo da funcionalidade desejada.

Como os mips são escolhidos com base em um derivado de espaço na tela, o uso de sombreamento de pixels grosseiros afeta a seleção de mip. O uso de sombreamento de pixels grosseiros faz com que mips menos detalhados sejam selecionados em comparação com quando pixels grosseiros não são usados.

Interpolação de atributo

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 atributo. Os três tipos de interpolação são center, centroid e sample.

Centro

O local de interpolação central para um pixel grosseiro é o centro geométrico da área de pixels grosseira completa. SV_Position é sempre interpolado no centro da região de pixels grosseiros.

Centróide

Quando o sombreamento de pixels grosseiros for usado com MSAA, para cada pixel fino ainda haverá gravações no número completo de amostras alocadas para o nível MSAA do destino. Portanto, o local de interpolação centroide considerará todos os exemplos de pixels finos em pixels grosseiros. Dito isto, o local de interpolação centroide é definido como o primeiro exemplo coberto, na ordem crescente do índice de exemplo. A cobertura efetiva do exemplo é and-ed com o bit correspondente do estado de rasterizador SampleMask.

Observação

Quando o sombreamento de pixels grosseiros é 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 pixels grosseiros será desabilitado na Camada 1.

Execução baseada em exemplo

A execução baseada em exemplo, ou supersampling, causada pelo uso do recurso de interpolação de exemplo, pode ser usada com sombreamento de pixels grosseiros e faz com que o sombreador de pixel seja invocado por exemplo. Para destinos da contagem de exemplo N, o sombreador de pixel é invocado N vezes por pixel fino.

EvaluateAttributeSnapped

Os intrínsecos de modelo de pull não são compatíveis com o sombreamento de pixels grosseiros na Camada 1. Se houver uma tentativa de usar intrínsecos de modelo de pull com sombreamento de pixels grosseiros na Camada 1, o sombreamento de pixels grosseiros será desabilitado automaticamente.

O intrínseco EvaluateAttributeSnapped tem permissão para ser usado com sombreamento de pixels grosseiros na Camada 2. Sua sintaxe é a mesma que sempre foi.

numeric EvaluateAttributeSnapped(	
    in attrib numeric value, 
    in int2 offset);

Para contexto, EvaluateAttributeSnapped tem um parâmetro de deslocamento com dois campos. Quando usado sem sombreamento de pixels grosseiros, apenas os quatro bits de ordem inferior dos trinta e dois completos são usados. Esses quatro bits representam o intervalo [-8, 7]. Esse intervalo abrange uma grade 16x16 em um pixel. O intervalo é tal que as bordas superior e esquerda do pixel são incluídas, e as bordas inferior e direita não são. O deslocamento (-8, -8) está no canto superior esquerdo e o deslocamento (7, 7) é no canto inferior direito. Deslocamento (0, 0) é o centro do pixel.

Quando usado com sombreamento de pixels grosseiros, EvaluateAttributeSnappedo parâmetro de deslocamento é capaz de especificar um intervalo mais amplo de locais. O parâmetro de deslocamento seleciona uma grade 16x16 para cada pixel fino e há vários pixels finos. O intervalo expressível e o número conseqüente de bits usados dependem do tamanho do pixel grosseiro. As bordas superior e esquerda do pixel grosseiro estão incluídas e as bordas inferior e direita não estão.

A tabela a seguir descreve a interpretação do parâmetro de EvaluateAttributeSnappeddeslocamento para cada tamanho de pixel grosseiro.

Intervalo de deslocamento de EvaluateAttributeSnapped

Tamanho do pixel grosseiro Intervalo indexável Tamanho do intervalo representável 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, 00000000000xxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {000000000000xxxx, 0000000000xxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {00000000000xxxxx, 00000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {00000000000xxxxx, 0000000000xxxx}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {00000000000xxxxx, 000000000xxxxx}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {0000000000xxxxx, 0000000000xxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {0000000000xxxxx, 000000000xxxxx}

As tabelas abaixo são um guia para conversão para do ponto fixo para a representação decimal e fracionária. O primeiro bit utilizável na máscara binária é o bit de sinal e o restante da máscara binária compreende a parte numérica.

O esquema de número para valores de quatro bits passados para EvaluateAttributeSnapped não é específico para sombreamento de taxa variável. É reiterado aqui para integridade.

Para valores de quatro bits.

Valor binário Decimal Fracionário
1000 -0,5f -8 / 16
1001 -0,4375f -7 / 16
1010 -0,375f -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.0f 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,375f 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 maneira que com pixels finos, EvaluateAttributeSnappeda grade de locais avaliáveis é centralizada no centro de pixels grosseiro ao usar sombreamento de pixels grosseiros.

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 pixels grosseiros será desabilitado.

Você pode usar a SV_Coverage semântica com sombreamento de pixels grosseiros na Camada 2 e ela reflete quais amostras de um destino MSAA estão sendo gravadas.

Quando o sombreamento de pixels grosseiros é usado, permitindo que vários pixels de origem incluam um bloco, a máscara de cobertura representa todas as amostras provenientes desse bloco.

Dada a compatibilidade do sombreamento de pixels grosseiros com MSAA, o número de bits de cobertura necessários para serem especificados pode variar. Por exemplo, com um recurso MSAA de 4x usando D3D12_SHADING_RATE_2x2, cada pixel grosseiro grava em quatro pixels finos e cada pixel fino tem quatro amostras. Isso significa que cada pixel grosseiro grava em um 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.

A tabela mostra o tamanho de pixels grosseiros, o número de pixels finos e os níveis de M S A A.

Conforme indicado na tabela, não é possível usar pixels grosseiros para gravar em mais de 16 amostras por vez usando o recurso de sombreamento de taxa variável exposto por meio do Direct3D 12. Essa restrição ocorre devido às restrições do Direct3D 12 sobre quais níveis 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 seguem 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 principal). Os bits de cobertura são os bits de baixa ordem da semântica de cobertura e são densamente empacotados juntos.

A tabela a seguir mostra o formato de máscara de cobertura para combinações com suporte de tamanho de pixel grosseiro e nível MSAA.

A tabela mostra o tamanho do pixel grosseiro, o diagrama de pixels grosseiros e os bits de cobertura de 1 x M S A A.

A tabela a seguir retrata 2x pixels MSAA, em que cada pixel tem duas amostras de índices 0 e 1.

O posicionamento dos rótulos de exemplos nos pixels é para fins ilustrativos e não necessariamente transmite os locais espaciais {X, Y} de amostras nesse pixel; especialmente considerando que as posições de exemplo podem ser alteradas programaticamente. Os exemplos são referenciados pelo índice baseado em 0.

A tabela mostra o tamanho do pixel grosseiro, o diagrama de pixels grosseiros e os bits de cobertura de 2 x M S A A.

A tabela a seguir mostra 4x pixels MSAA, em que cada pixel tem quatro amostras de índices 0, 1, 2 e 3.

A tabela mostra o tamanho do pixel grosseiro, o diagrama de pixels grosseiros e os bits de cobertura de 4 x M S A A.

Descartar

Quando a semântica discard HLSL é usada com sombreamento de pixels grosseiros, pixels grosseiros são descartados.

TIR (rasterização independente de destino)

Não há suporte para TIR quando o sombreamento de pixels grosseiros é usado.

ROVs (exibições de ordem de varredura)

Os intertravamentos ROV são especificados como operando com granularidade de pixel fina. Se o sombreamento for executado por exemplo, os intertravamentos estarão operando na granularidade de exemplo.

Rasterização conservadora

Você pode usar a rasterização conservadora com sombreamento de taxa variável. Quando a rasterização conservadora é usada com sombreamento de pixels grosseiros, pixels finos dentro de pixels grosseiros são rasterizados conservadoramente por receberem cobertura completa.

Cobertura

Quando a rasterização conservadora é usada, a semântica de cobertura contém máscaras completas para pixels finos 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.

Passagens de renderização

Você pode chamar APIs de sombreamento de taxa variável em uma passagem de renderização.

Chamando as APIs 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 funcionalidade

Para consultar a funcionalidade de sombreamento de taxa variável do adaptador, chame ID3D12Device::CheckFeatureSupport com D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6 e forneça uma estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS6 para a função preencher para você. A estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS6 contém vários membros, incluindo um do tipo enumerado D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) e um que indica se há suporte para processamento em segundo plano (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).

Para consultar a funcionalidade de Camada 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 na enumeração D3D12_SHADING_RATE são organizados para que as taxas de sombreamento sejam facilmente decompostas em dois eixos, em que os valores de cada eixo são representados compactamente no espaço logarítmico de acordo com a enumeração D3D12_AXIS_SHADING_RATE.

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 )

Eles podem ser usados para dissecar e entender SV_ShaderRate.

Observação

Essa interpretação de dados é voltada para descrever a imagem de espaço na 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, incluindo ao definir a taxa de sombreamento no nível de comando.

Definindo a taxa de sombreamento e os combinadores no nível do comando

A taxa de sombreamento e, opcionalmente, os combinadores são especificados por meio do método ID3D12GraphicsCommandList5::RSSetShadingRate . Você passa um valor de D3D12_SHADING_RATE para a taxa de sombreamento base e uma matriz opcional de valores D3D12_SHADING_RATE_COMBINER .

Preparando a imagem de espaço na tela

O estado de 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 na tela

Especifique a imagem de espaço na tela por meio do método ID3D12GraphicsCommandList5::RSSetShadingRateImage .

m_commandList->RSSetShadingRateImage(screenSpaceImage);

Consultando o tamanho do bloco

Você pode consultar o tamanho do bloco do membro D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize . Consulte Consulta de funcionalidade acima.

Uma dimensão é recuperada, pois as dimensões horizontal e vertical são sempre as mesmas. Se a funcionalidade do sistema for D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, o tamanho do bloco retornado será 0.