Ler em inglês

Compartilhar via


Sombreamento de taxa variável (VRS)

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 para 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 entre sua 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 MSAA (anti-aliasing) de várias amostras com execução baseada em exemplo (também conhecida como supersampling).

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 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 superesampação faz com que o sombreador de pixel 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 fino. 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 à ótica VR. Mas isso não seria possível, porque a qualidade e os custos de sombreamento são corrigidos em toda a imagem.

Com o sombreamento de taxa variável (VRS)

O modelo vrs (sombreamento de taxa variável) estende supersampling-with-MSAA na 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 Y, essa combinação está habilitada.
  • Para células marcadas 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 com sombreamento de 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.

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

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.

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 provocante (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 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 quando SV_ViewportArrayIndex é gravado.

Lista de recursos

  • 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 do 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 de hardware oferecer 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 irá cobri-la é 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 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 na parte 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 de 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 é TEXTURE2Dde dimensão.

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 layout de textura DESCONHECIDO. Ele implicitamente não pode ser um layout principal de linha, porque o adaptador cruzado não é permitido.

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

  1. Escreva os dados usando um sombreador de computação; a imagem de espaço de 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.

  • NENHUM
  • 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 transicionado 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.

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 qualquer estágio de sombreador.

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

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, é propagado para todos os pixels no triângulo atual ou primitivo de linha. O uso de um atributo por primitivo pode habilitar o 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 HLSL Shader Model 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 primitivo.

Combinando fatores de taxa de sombreamento

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

Diagrama mostra um estado de pipeline, rotulado como A, com taxa de sombreamento de vértice provocante, rotulado B, aplicado em um Combinador e, em seguida, taxa de sombreamento baseada em imagem, rotulada 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).

  • de passagem. C.xy = A.xy.
  • substituir. C.xy = B.xy.
  • de qualidade superior. C.xy = min(A.xy, B.xy).
  • de qualidade inferior. C.xy = max(A.xy, B.xy).
  • Aplicar 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 de um combinador for um D3D12_AXIS_SHADING_RATE, o que não é permitido na tabela de suporte, a entrada será higienizada para uma taxa de sombreamento que tem 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 que tem 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 por imagem de espaço de tela e
  • o atributo por primitivo

tem 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 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 de "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 uma determinada invocação de sombreador de pixel. 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.

Tipo

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, SV_ShadingRate será 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, inserindo SV_SampleIndexou usando a 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 variável SV_ShadingRate pode 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 de exemplo completa.

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 computada como uma saída dos combinadores (consulte a seção Combinando fatores de taxa de sombreamento seção 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 o recurso AdditionalShadingRatesSupported for true, 2x4, 4x2 e 4x4 também têm suporte para taxas de sombreamento para algumas contagens de exemplo (consulte a tabela na seção Com sombreamento de taxa variável (VRS) neste tópico).

Derivados de espaço na tela

Cálculos de gradientes pixel a pixel adjacentes são afetados pelo sombreamento de pixels grosseiros. 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 forem usados. Talvez seu aplicativo queira 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 centro, centroide e exemplo.

Centro

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

Centróide

Quando o sombreamento de pixels grosseiros é usado com MSAA, para cada pixel fino ainda haverá gravações no número total 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, em ordem crescente de í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 de sobresampling — que é 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 do modelo de pull não são compatíveis com 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 EvaluateAttributeSnapped intrínseco 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 o 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 estão incluídas, e as bordas inferior e direita não estão. Deslocamento (-8, -8) está no canto superior esquerdo e deslocamento (7, 7) é pelo canto inferior direito. Deslocamento (0, 0) é o centro do pixel.

Quando usado com sombreamento de pixels grosseiros, o parâmetro de deslocamento do EvaluateAttributeSnappedé 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 consequente número 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 deslocamento de EvaluateAttributeSnappedpara 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} {000000000000xxxxx, 00000000000xxxxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {000000000000xxxxx, 0000000000xxxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {00000000000xxxxxx, 00000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {00000000000xxxxxx, 0000000000xxxxx}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {00000000000xxxxxx, 000000000xxxxxx}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {0000000000xxxxxx, 0000000000xxxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {0000000000xxxxxxx, 000000000xxxxxx}

As tabelas abaixo são um guia para conversão 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 forma que com pixels finos, EvaluateAttributeSnappedgrade 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 semântica SV_Coverage com sombreamento de pixels grosseiros na Camada 2 e isso reflete quais exemplos de um destino MSAA estão sendo gravados.

Quando o sombreamento de pixels grosseiros é usado, permitindo que vários pixels de origem componham um bloco, a máscara de cobertura representa todos os exemplos provenientes desse bloco.

Dada a compatibilidade do sombreamento de pixels grosseiros 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 exemplos. 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.

Tabela mostra o tamanho do pixel grosseiro, o número de pixels finos e os níveis de M S A A. bits de cobertura

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 o qual o tamanho de pixel grosseiro (consulte a tabela no Com o sombreamento de taxa variável (VRS) seção neste tópico).

Ordenação e formato de bits na máscara de cobertura

Os bits da máscara de cobertura aderem 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 principal). Os bits de cobertura são os bits de baixa ordem da semântica de cobertura e são densamente embalados juntos.

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

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

A tabela a seguir retrata 2x pixels MSAA, em que cada pixel tem dois exemplos 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 exemplos nesse pixel; especialmente considerando que as posições de exemplo podem ser alteradas programaticamente. Os exemplos são referenciados pelo índice baseado em 0.

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

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

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

Descartar

Quando a semântica HLSL discard é 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 raster)

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 conservadoramente rasterizados 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.

Passes 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_OPTIONS6e forneça uma estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS6 para que a função seja 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 tem suporte (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 decompactáveis em dois eixos, em que os valores de cada eixo são representados compactamente no espaço logarítmico de acordo com o de enumeraçãoD3D12_AXIS_SHADING_RATE.

Você pode criar uma macro para compor taxas de sombreamento de dois eixos 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 )

Elas podem ser usadas 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, inclusive ao definir a taxa de sombreamento no nível de comando.

Definindo a taxa de sombreamento no nível de comando e os 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 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étodoID3D12GraphicsCommandList5::RSSetShadingRateImage.

m_commandList->RSSetShadingRateImage(screenSpaceImage);

Consultando o tamanho do bloco

Você pode consultar o tamanho do bloco do membroD3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize. Consulte Consulta de funcionalidades 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.