Compartilhar via


Rasterização Conservadora do Direct3D 12

A rasterização conservadora adiciona alguma certeza à renderização de pixels, o que é útil em particular para algoritmos de detecção de colisão.

Visão geral

Rasterização conservadora significa que todos os pixels que são pelo menos parcialmente cobertos por um primitivo renderizado são rasterizados, o que significa que o sombreador de pixel é invocado. O comportamento normal é a amostragem, que não será usada se a Rasterização Conservadora estiver habilitada.

A rasterização conservadora é útil em várias situações, incluindo a certeza na detecção de colisão, no abate de oclusão e na renderização em blocos.

Por exemplo, a figura a seguir mostra um triângulo verde renderizado usando Rasterização Conservadora, como seria exibido no rasterizador (ou seja, usando 16,8 coordenadas de vértice de ponto fixo). A área marrom é conhecida como uma "região de incerteza" - uma região conceitual que representa os limites estendidos do triângulo, necessários para garantir que o primitivo no rasterizador seja conservador em relação às coordenadas de vértice de ponto flutuante originais. Os quadrados vermelhos em cada vértice mostram como a região de incerteza é calculada: como um quadrado varrido.

Os grandes quadrados cinza mostram os pixels que serão renderizados. Os quadrados cor-de-rosa mostram pixels renderizados usando a "Regra superior esquerda", que entra em jogo à medida que a borda do triângulo cruza a borda dos pixels. Pode haver falsos positivos (conjunto de pixels que não deveria ter sido) que o sistema normalmente, mas nem sempre será eliminado.

a regra superior esquerda

Interações com o pipeline

Interação de regras de rasterização

No modo de rasterização conservadora, as Regras de Rasterização se aplicam da mesma maneira que quando o modo de Rasterização Conservadora não está habilitado com exceções para a Regra de Top-Left, descrita acima, e a Cobertura de Pixel. 16,8 Fixed-Point precisão de rasterizador deve ser usada.

Pixels que não seriam cobertos se o hardware estivesse usando coordenadas de vértice de ponto flutuante completo só poderão ser incluídos se estiverem dentro de uma região de incerteza sem meio pixel maior no domínio de ponto fixo. Espera-se que o hardware futuro atinja a região de incerteza mais apertada especificada na Camada 2. Observe que esse requisito impede que os triângulos de lasca se estendam mais do que o necessário.

Uma região de incerteza válida semelhante também se aplica, InnerCoverage mas é mais apertada, pois nenhuma implementação requer uma região de incerteza maior para este caso. Consulte Interação innercoverage para obter mais detalhes.

As regiões de incerteza interna e externa devem ser maiores ou iguais ao tamanho de metade da grade de sub pixels, ou 1/512 de um pixel, no domínio de ponto fixo. Essa é a região de incerteza mínima válida. 1/512 vem da representação de coordenadas de rasterizador de ponto fixo de 16,8 e da regra de volta para mais próxima que se aplica ao converter coordenadas de vértice de ponto flutuante em coordenadas de ponto fixo de 16,8. 1/512 pode ser alterado se a precisão do Rasterizer for alterada. Se uma implementação implementar essa região de incerteza mínima, ela deverá seguir a Regra de Top-Left quando uma borda ou canto da região de incerteza cair ao longo da borda ou canto de um pixel. As bordas recortadas da região de incerteza devem ser tratadas como o vértice mais próximo, o que significa que ela conta como duas bordas: as duas que se juntam ao vértice associado. Top-Left Regra é necessária quando a região de incerteza mínima é usada porque, se não for, uma implementação de Rasterização Conservadora falhará em rasterizar pixels que poderiam ser cobertos quando o modo de Rasterização Conservadora for desabilitado.

O diagrama a seguir ilustra uma região de incerteza externa válida produzida pela limpeza de um quadrado ao redor das bordas do primitivo no domínio de ponto fixo (ou seja, os vértices foram quantificados pela representação de ponto fixo de 16,8). As dimensões desse quadrado são baseadas no tamanho válido da região de incerteza externa: para o 1/2 de um pixel, o quadrado tem 1 pixel de largura e altura, para 1/512 de um pixel, o quadrado é 1/256 de um pixel de largura e altura. O triângulo verde representa um determinado primitivo, a linha pontilhada vermelha representa o limite na Rasterização Conservadora Superestimada, os quadrados pretos sólidos representam o quadrado que é varrido ao longo das bordas primitivas, e a área quadriculada azul é a região de incerteza externa:

região de incerteza externa.

Interação multisampling

Independentemente do número de amostras em superfícies deDepthStencilrendertarget/ (ou se ForcedSampleCount está sendo usado ou não), todos os exemplos são cobertos por pixels rasterizados pela Rasterização Conservadora. Locais de exemplo individuais não são testados para se eles se enquadram no primitivo ou não.

Interação de SampleMask

O Estado do Rasterizador SampleMask aplica-se da mesma maneira que quando a Rasterização Conservadora não está habilitada para InputCoverage, mas não afeta InnerCoverage (ou seja, não é AND'ed em uma entrada declarada com InnerCoverage). Isso ocorre porque InnerCoverage não está relacionado a se os exemplos de MSAA estão mascarados: 0 InnerCoverage significa apenas que o pixel não tem garantia de ser totalmente coberto, não que nenhum exemplo seja atualizado.

Interação de teste de profundidade/estêncil

O Teste de Profundidade/Estêncil prossegue para um pixel rasterizado conservadoramente da mesma maneira que se todas as amostras forem cobertas quando a Rasterização Conservadora não estiver habilitada.

Continuar com todos os exemplos abordados pode causar Extrapolação de Profundidade, que é válida e deve ser fixada no visor conforme especificado quando a Rasterização Conservadora não está habilitada. Isso é semelhante a quando os modos de interpolação de frequência de pixel são usados em um RenderTarget com contagem de exemplo maior que 1, embora, no caso da Rasterização Conservadora, seja o valor de profundidade que vai para o teste de profundidade de função fixa que pode ser extrapolado.

O comportamento de extrapolação de profundidade inicial com Extrapolação de Profundidade é indefinido. Isso ocorre porque alguns hardwares de eliminação de profundidade inicial não podem dar suporte adequado a valores de profundidade extrapolados. No entanto, o comportamento de extrapolação de profundidade inicial na presença da Extrapolação de Profundidade é problemático mesmo com hardware que pode dar suporte a valores de profundidade extrapolados. Esse problema pode ser resolvido fixando a profundidade de entrada do Sombreador de Pixel aos valores de profundidade mínima e máxima do primitivo sendo rasterizado e gravando esse valor oDepth em (o registro de profundidade de saída do sombreador de pixel). As implementações são necessárias para desabilitar o abate de Profundidade Inicial nesse caso, devido à gravação oDepth .

Interação do Pixel auxiliar

As regras de Pixel auxiliar se aplicam da mesma maneira que quando a Rasterização Conservadora não está habilitada. Como parte disso, todos os pixels, incluindo pixels auxiliares, devem relatar InputCoverage com precisão, conforme especificado na InputCoverage seção de interação. Portanto, pixels totalmente não cobertos relatam cobertura 0.

Interação de Cobertura de Saída

A Cobertura de Saída (oMask) se comporta para um pixel rasterizado conservadoramente como quando a Rasterização Conservadora não está habilitada com todos os exemplos cobertos.

Interação InputCoverage

No modo de Rasterização Conservadora, esse registro de entrada é preenchido como se todas as amostras forem cobertas quando a Rasterização Conservadora não estiver habilitada para um determinado pixel rasterizado conservadoramente. Ou seja, todas as interações existentes se aplicam (por exemplo, SampleMask é aplicado) e os primeiros n bits do InputCoverage LSB são definidos como 1 para um pixel rasterizado conservadoramente, dado um n exemplo por pixel RenderTarget e/ou buffer DepthStencil associado à Fusão de Saída, ou um n exemplo ForcedSampleCount. O restante dos bits são 0.

Essa entrada está disponível em um sombreador, independentemente do uso da Rasterização Conservadora, embora a Rasterização Conservadora altere seu comportamento para mostrar apenas todos os exemplos cobertos (ou nenhum para Pixels Auxiliares).

Interação innercoverage

Esse recurso é exigido e disponível apenas na Camada 3. O runtime falhará na criação do sombreador para sombreadores que usam esse modo quando uma implementação dá suporte a uma Camada menor que a Camada 3.

O Sombreador de Pixel tem um inteiro escalar de 32 bits Valor de Geração de Sistema disponível: InnerCoverage. Esse é um campo de bits que tem o bit 0 do LSB definido como 1 para um determinado pixel rasterizado conservadoramente, somente quando esse pixel é garantido estar inteiramente dentro do primitivo atual. Todos os outros bits de registro de entrada devem ser definidos como 0 quando o bit 0 não está definido, mas são indefinidos quando o bit 0 é definido como 1 (essencialmente, esse campo de bits representa um valor booliano em que false deve ser exatamente 0, mas true pode ser qualquer valor ímpar (ou seja, bit 0 definido) não zero). Essa entrada é usada para informações subestimadas de rasterização conservadora. Ele informa ao Sombreador de Pixel se o pixel atual está completamente dentro da geometria.

Isso deve levar em conta o erro de encaixe em resoluções maiores ou iguais à resolução na qual o Draw atual está operando. Não deve haver falsos positivos (configurando InnerCoverage bits quando o pixel não está totalmente coberto para qualquer erro de ajuste em resoluções maiores ou iguais à resolução na qual o Draw atual está operando), mas falsos negativos são permitidos. Em resumo, a implementação não deve identificar incorretamente pixels como totalmente cobertos que não seriam com coordenadas de vértice de ponto flutuante completas no Rasterizador.

Pixels que seriam totalmente cobertos se o hardware estivesse usando coordenadas de vértice de ponto flutuante completo só poderão ser omitidos se cruzarem a região de incerteza interna, que não deve ser maior que o tamanho da grade de sub pixels, ou 1/256 de um pixel, no domínio de ponto fixo. Dito de outra forma, pixels inteiramente dentro do limite interno da região de incerteza interna devem ser marcados como totalmente cobertos. O limite interno da região de incerteza é ilustrado no diagrama abaixo pela linha pontilhada preta em negrito. 1/256 vem da representação da coordenada rasterizador de ponto fixo 16,8, que pode ser alterada se a precisão do Rasterizer for alterada. Essa região de incerteza é suficiente para considerar o erro de ajuste causado pela conversão de coordenadas de vértice de ponto flutuante em coordenadas de vértice de ponto fixo no Rasterizador.

Os mesmos requisitos mínimos de região de incerteza de 1/512 definidos na interação de Regras de Rasterização também se aplicam aqui.

O diagrama a seguir ilustra uma região de incerteza interna válida produzida pela limpeza de um quadrado ao redor das bordas do primitivo no domínio de ponto fixo (ou seja, os vértices foram quantificados pela representação de ponto fixo de 16,8). As dimensões desse quadrado são baseadas no tamanho válido da região de incerteza interna: para 1/256 de um pixel, o quadrado é 1/128 de um pixel de largura e altura. O triângulo verde representa um determinado primitivo, a linha pontilhada preta em negrito representa o limite da região de incerteza interna, os quadrados pretos sólidos representam o quadrado que é varrido ao longo das bordas primitivas, e a área quadriculada laranja é a região de incerteza interna:

reqion de incerteza interna.

O uso de InnerCoverage não afeta se um pixel é rasterizado conservadoramente, ou seja, usar um desses InputCoverage modos não afeta quais pixels são rasterizados quando o modo de Rasterização Conservadora está habilitado. Portanto, quando InnerCoverage for usado e o Sombreador de Pixel estiver processando um pixel que não esteja completamente coberto pela geometria, seu valor será 0, mas a invocação do Sombreador de Pixel terá amostras atualizadas. Isso é diferente de quando InputCoverage é 0, o que significa que nenhum exemplo será atualizado.

Essa entrada é mutuamente exclusiva com InputCoverage : ambos não podem ser usados.

Para acessar InnerCoverage, ele deve ser declarado como um único componente de um dos registros de entrada do Sombreador de Pixel. O modo de interpolação na declaração deve ser constante (a interpolação não se aplica).

O InnerCoverage campo de bits não é afetado por testes de profundidade/estêncil, nem é ANDed com o estado SampleMask Rasterizer.

Essa entrada só é válida no modo de Rasterização Conservadora. Quando a Rasterização Conservadora não está habilitada, InnerCoverage produz um valor indefinido.

As invocações do Sombreador de Pixel causadas pela necessidade de Pixels auxiliares, mas não cobertas pelo primitivo, devem ter o InnerCoverage registro definido como 0.

Interação de interpolação de atributo

Os modos de interpolação de atributo não são alterados e prossiga da mesma maneira que quando a Rasterização Conservadora não está habilitada, em que os vértices dimensionados pelo visor e convertidos por ponto fixo são usados. Como todos os exemplos em um pixel rasterizado conservadoramente são considerados cobertos, é válido que os valores sejam extrapolados, semelhante a quando modos de interpolação de frequência de pixel são usados em um RenderTarget com contagem de exemplo maior que 1. Os modos de interpolação centroides produzem resultados idênticos ao modo de interpolação não centralide correspondente; a noção de centroide não tem sentido neste cenário , em que a cobertura de exemplo é apenas completa ou 0.

A rasterização conservadora permite que triângulos degenerados produzam invocações de Sombreador de Pixel, portanto, triângulos degenerados devem usar os valores atribuídos ao Vértice 0 para todos os valores interpolados.

Interação de recorte

Quando o modo de Rasterização Conservadora está habilitado e o clipe de profundidade é desabilitado (quando o Estado do Rasterizador DepthClipEnable é definido como FALSE), pode haver variações na interpolação de atributo para segmentos de um primitivo que ficam fora do intervalo 0 <= z <= w, dependendo da implementação: os valores constantes são usados de um ponto em que o primitivo cruza o plano relevante (próximo ou distante), ou a interpolação de atributo se comporta como quando o modo de rasterização conservador está desabilitado. No entanto, o comportamento do valor de profundidade é o mesmo, independentemente do modo de rasterização conservador, ou seja, primitivos que ficam fora do intervalo de profundidade ainda devem receber o valor do limite mais próximo do intervalo de profundidade do visor. O comportamento de interpolação de atributo dentro do intervalo 0 <= z <= w deve permanecer inalterado.

Interação de distância de clipe

A Distância de Clipe é válida quando o modo de Rasterização Conservadora está habilitado e se comporta para um pixel rasterizado conservadoramente como quando a Rasterização Conservadora não está habilitada com todos os exemplos cobertos.

Observe que a rasterização conservadora pode causar extrapolação da coordenada de vértice W, o que pode causar W <= 0. Isso pode fazer com que as implementações de Distância de Clipe por pixel operem em uma Distância de Clipe que tenha sido a Perspectiva Dividida por um valor W inválido. As implementações de distância de clipe devem se proteger contra a invocação de rasterização para pixels em que a coordenada de vértice W <= 0 (por exemplo, devido à extrapolação quando está no modo de rasterização conservadora).

Interação de Rasterização Independente de Destino

O modo de rasterização conservadora é compatível com a TIR (Rasterização Independente de Destino). As regras e restrições de TIR se aplicam, comportando-se para um pixel rasterizado conservadoramente como se todos os exemplos forem cobertos.

Interação de Topologia Primitiva de IA

A rasterização conservadora não é definida para primitivos de linha ou ponto. Portanto, topologias primitivas que especificam pontos ou linhas produzem um comportamento indefinido se forem alimentadas para a unidade de rasterizador quando a Rasterização Conservadora estiver habilitada.

A validação da camada de depuração verifica se os aplicativos não usam essas Topologias Primitivas.

Interação de consulta

Para um pixel rasterizado conservadoramente, as consultas se comportam como quando a Rasterização Conservadora não está habilitada quando todas as amostras são cobertas. Por exemplo, para um pixel rasterizado conservadoramente, D3D12_QUERY_TYPE_OCCLUSION e D3D12_QUERY_TYPE_PIPELINE_STATISTICS (de D3D12_QUERY_TYPE) devem se comportar como se fossem quando a Rasterização Conservadora não estiver habilitada quando todas as amostras forem cobertas.

As invocações do Sombreador de Pixel devem ser incrementadas para cada pixel rasterizado conservadoramente no modo de Rasterização Conservadora.

Interação do Estado cull

Todos os Estados Cull são válidos no modo de rasterização conservadora e seguem as mesmas regras de quando a Rasterização Conservadora não está habilitada.

Ao comparar a rasterização conservadora entre resoluções a si mesma ou sem a rasterização conservadora habilitada, há a possibilidade de que alguns primitivos possam ter uma facetização incompatível (ou seja, uma voltada para trás, a outra voltada para a frente). Os aplicativos podem evitar essa incerteza usando D3D12_CULL_MODE_NONE (de D3D12_CULL_MODE) e não usando o IsFrontFace Valor Gerado pelo Sistema.

Interação isFrontFace

O IsFrontFace Valor Gerado pelo Sistema é válido para uso no modo de Rasterização Conservadora e segue o comportamento definido quando a Rasterização Conservadora não está habilitada.

Interação de modos de preenchimento

O único D3D12_FILL_MODE válido para rasterização conservadora é D3D12_FILL_SOLID, qualquer outro modo de preenchimento é um parâmetro inválido para o Estado do Rasterizer.

Isso ocorre porque a especificação funcional D3D12 especifica que o modo de preenchimento de wireframe deve converter bordas de triângulo em linhas e seguir as regras de rasterização de linha e o comportamento de rasterização de linha conservadora não foi definido.

Detalhes de implementação

O tipo de rasterização com suporte no Direct3D 12 às vezes é chamado de "Rasterização Conservadora Superestimada". Há também o conceito de "Rasterização Conservadora Subestimada", o que significa que apenas pixels totalmente cobertos por um primitivo renderizado são rasterizados. Informações de rasterização conservadora subestimadas estão disponíveis por meio do sombreador de pixels por meio do uso de dados de cobertura de entrada e apenas a Rasterização Conservadora superestimada está disponível como um modo de rasterização.

Se qualquer parte de um primitivo se sobrepor a um pixel, esse pixel será considerado coberto e, em seguida, será rasterizado. Quando uma borda ou canto de um primitivo cai ao longo da borda ou canto de um pixel, a aplicação da "regra superior esquerda" é específica da implementação. No entanto, para implementações que dão suporte a triângulos degenerados, um triângulo degenerado ao longo de uma borda ou canto deve cobrir pelo menos um pixel.

As implementações de rasterização conservadora podem variar em hardwares diferentes e produzir falsos positivos, o que significa que elas podem decidir incorretamente que os pixels são cobertos. Isso pode ocorrer devido a detalhes específicos da implementação, como o crescimento primitivo ou erros de encaixe inerentes às coordenadas de vértice de ponto fixo usadas na rasterização. O motivo pelo qual os falsos positivos (em relação às coordenadas de vértice de ponto fixo) são válidos porque algumas quantidades de falsos positivos são necessárias para permitir que uma implementação faça a avaliação de cobertura em vértices pós-ajustados (ou seja, coordenadas de vértice que foram convertidas do ponto flutuante para o ponto fixo 16,8 usado no rasterizador), mas honram a cobertura produzida pelas coordenadas de vértice de ponto flutuante originais.

Implementações de rasterização conservadoras não produzem falsos negativos em relação às coordenadas de vértice de ponto flutuante para primitivos pós-snap não degenerados: se qualquer parte de um primitivo se sobrepor a qualquer parte de um pixel, esse pixel será rasterizado.

Triângulos degenerados (índices duplicados em um buffer de índice ou collinear em 3D) ou se tornam degenerados após a conversão de ponto fixo (vértices collineares no rasterizador), podem ou não ser eliminados; ambos são comportamentos válidos. Triângulos degenerados devem ser considerados voltados para trás, portanto, se um comportamento específico for exigido por um aplicativo, ele poderá usar o abate de rostos invertidos ou o teste para frente. Triângulos degenerados usam os valores atribuídos ao Vértice 0 para todos os valores interpolados.

Há três camadas de suporte a hardware, além da possibilidade de que o hardware não dê suporte a esse recurso.

  • A camada 1 impõe uma região de incerteza máxima de 1/2 pixel e não dá suporte a degenerados pós-snap. Isso é bom para renderização em blocos, um atlas de textura, uma geração de mapa de luz e mapas de sombra de sub pixel.
  • A camada 2 reduz a região de incerteza máxima para 1/256 e exige que os degenerados pós-snap não sejam abatidos. Essa camada é útil para aceleração de algoritmo baseada em CPU (como voxelization).
  • A camada 3 mantém uma região de incerteza máxima de 1/256 e adiciona suporte para cobertura de entrada interna. A cobertura de entrada interna adiciona o novo valor SV_InnerCoverage à HLSL (Linguagem de Sombreamento de Alto Nível). Esse é um inteiro escalar de 32 bits que pode ser especificado na entrada para um sombreador de pixel e representa as informações subestimadas de Rasterização Conservadora (ou seja, se um pixel é garantido para ser totalmente coberto). Essa camada é útil para o abate de oclusão.

Resumo da API

Os seguintes métodos, estruturas, enumerações e classes auxiliares fazem referência à Rasterização Conservadora:

Tutoriais de vídeo de aprendizado avançado do DirectX: Rasterização conservadora

Modos de exibição ordenados do rasterizador

Renderização