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
-
interações com o pipeline
- de interação de Regras de Rasterização
- de interação multisampling
- de interação sampleMask
- interação de teste de profundidade/estêncil
- de interação do Pixel auxiliar
- de interação de Cobertura de Saída
- de interação InputCoverage
- de interação innercoverage
- de interação de interpolação de atributo
- de interação de recorte de
- de interação de distância do clipe
- de interação de Rasterização Independente de Destino
- de interação de topologia primitiva de IA
- de interação de consulta
- de interação do Estado de Cull
- de interação IsFrontFace
- interação dos Modos de Preenchimento
- detalhes da implementação
- resumo da API
- tópicos relacionados
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 é 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 coordenadas de vértice de ponto fixo 16,8). A área marrom é conhecida como uma "região de incerteza" - uma região conceitual que representa os limites estendidos do triângulo, necessária para garantir que o primitivo no rasterizador seja conservador em relação às coordenadas de vértice do ponto flutuante original. Os quadrados vermelhos em cada vértice mostram como a região de incerteza é calculada: como um quadrado varrido.
Os grandes quadrados cinzas mostram os pixels que serão renderizados. Os quadrados cor-de-rosa mostram pixels renderizados usando a " regraTop-Left", que entra em jogo à medida que a borda do triângulo cruza a borda dos pixels. Pode haver falsos positivos (pixels definidos que não deveriam ter sido) que o sistema normalmente, mas nem sempre será descartado.
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 Conservador 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 reforçada 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 a InnerCoverage
, mas é mais apertada, pois nenhuma implementação exige uma região de incerteza maior para este caso. Consulte de 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. Esta é a região mínima de incerteza válida. 1/512 vem da representação da coordenada rasterizador de ponto fixo 16,8 e da regra de volta para a mais próxima que se aplica ao converter coordenadas de vértice de ponto flutuante em coordenadas de ponto fixo 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 unem 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 não poderá rasterizar pixels que poderiam ser cobertos quando o modo de rasterização conservador estiver desabilitado.
O diagrama a seguir ilustra uma região de incerteza externa válida produzida pela varredura de um quadrado em torno das bordas do primitivo no domínio de ponto fixo (ou seja, os vértices foram quantificados pela representação de ponto fixo 16,8). As dimensões deste quadrado baseiam-se 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:
Interação multisampling
Independentemente do número de amostras em rendertarget/superfícies de depthStencil (ou se ForcedSampleCount está sendo usado ou não), todas as amostras são cobertas 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 SampleMask Estado do Rasterizador aplica-se da mesma forma 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 se os exemplos 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 todos os exemplos forem cobertos 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 corretamente 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 para oDepth
(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 Helper Pixel
As regras do Helper Pixel 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 seção de interação InputCoverage
. Portanto, pixels totalmente não cobertos relatam a 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 de InputCoverage
No modo de Rasterização Conservadora, esse registro de entrada é preenchido como se todos os exemplos forem cobertos 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 em InputCoverage
do LSB são definidos como 1 para um pixel rasterizado conservadoramente, dado um n exemplo por pixel RenderTarget e/ou buffer depthStencil associado ao de fusão de saídaou 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 valor de geração de sistema escalar de 32 bits 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 tem a garantia de 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) diferente de zero). Essa entrada é usada para informações de rasterização conservadoras subestimadas. Ele informa ao Sombreador de Pixel se o pixel atual está completamente dentro da geometria.
Isso deve levar em conta o erro de ajuste 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 estiver totalmente coberto para qualquer erro de ajuste em resoluções maiores ou iguais à resolução em que 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 estariam com coordenadas de vértice de ponto flutuante completo 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 totalmente 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 em preto negrito. 1/256 vem da representação da coordenada rasterizador de ponto fixo 16,8, que pode ser alterada se a precisão do rasterizador 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 varredura 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 16,8). As dimensões deste quadrado baseiam-se no tamanho válido da região de incerteza interna: para 1/256 de um pixel, o quadrado é 1/128 de um pixel em 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:
O uso de InnerCoverage
não afeta se um pixel é rasterizado conservadoramente, ou seja, usar um desses modos de InputCoverage
não afeta quais pixels são rasterizados quando o modo de rasterização conservador está habilitado. Portanto, quando InnerCoverage
é usado e o Sombreador de Pixel está processando um pixel que não é 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 nenhuma amostra será atualizada.
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 campo de bits InnerCoverage
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 registro InnerCoverage
definido como 0.
Interação de interpolação de atributo
Os modos de interpolação de atributos não são alterados e seguem da mesma maneira que quando a Rasterização Conservadora não está habilitada, em que os vértices convertidos por ponto de exibição e dimensionados por visor 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 os 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 centroide 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 Conservador está habilitado e o clipe de profundidade é desabilitado (quando o DepthClipEnable Estado do Rasterizador é 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, primitivas 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 de 0 <= z <= w deve permanecer inalterado.
Interação de Distância do Clipe
A Distância de Clipe é válida quando o modo de Rasterização Conservador está habilitado e se comporta para um pixel rasterizado conservadoramente como quando a Rasterização Conservadora não está habilitada com todas as amostras cobertas.
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 estiver no modo de rasterização conservador).
Interação de Rasterização Independente de Destino
O modo de rasterização conservador é compatível com a TIR (Rasterização Independente de Destino). As regras e restrições do 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 com o Estado de 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 facetura 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 valor gerado pelo sistema IsFrontFace
.
Interação com 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 dos 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 Rasterizador.
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 da 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", que significa que apenas pixels totalmente cobertos por um primitivo renderizado são rasterizados. Informações de rasterização conservadoras 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.
Implementações de rasterização conservadoras podem variar em hardware diferente 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 erros primitivos de crescimento ou ajuste inerentes às coordenadas de vértice de ponto fixo usadas na rasterização. A razão pela qual os falsos positivos (em relação às coordenadas de vértice de ponto fixo) são válidos é porque uma quantidade de falsos positivos é necessária 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 honrem 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 degenerados após 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 ou o teste de face invertida 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 de 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, 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 eliminados. Essa camada é útil para aceleração de algoritmo baseada em CPU (como voxelização).
- 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). Este é 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-to-be-totalmente coberto). Essa camada é útil para o abate de oclusão.
Resumo da API
Os seguintes métodos, estruturas, enumes e classes auxiliares fazem referência à Rasterização Conservadora:
- D3D12_RASTERIZER_DESC: estrutura que contém a descrição do rasterizador.
- D3D12_CONSERVATIVE_RASTERIZATION_MODE: enumerar valores para o modo (ativado ou desativado).
- D3D12_FEATURE_DATA_D3D12_OPTIONS: estrutura que contém a camada de suporte.
- D3D12_CONSERVATIVE_RASTERIZATION_TIER: enumerar valores para cada camada de suporte pelo hardware.
- CheckFeatureSupport: método para acessar os recursos com suporte.
- CD3DX12_RASTERIZER_DESC: classe auxiliar para criar descrições de rasterizador.
Tópicos relacionados
-
tutoriais de vídeo de aprendizado avançado do DirectX: de Rasterização Conservadora