Rasterização Conservadora do Direct3D 11.3
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
A 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 detecção de visibilidade.
Por exemplo, a figura a seguir mostra um triângulo verde renderizado usando rasterização conservadora. A área marrom é conhecida como uma "região de incerteza" - uma região onde erros de arredondamento e outros problemas adicionam alguma incerteza às dimensões exatas do triângulo. Os triângulos vermelhos em cada vértice mostram como a região de incerteza é calculada. Os grandes quadrados cinza mostram os pixels que serão renderizados. Os quadrados 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.
Interações com o pipeline
Para obter muitos detalhes sobre como a rasterização conservadora interage com o pipeline de gráficos, consulte Rasterização conservadora D3D12.
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 conservadoras 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 dá suporte a regiões de incerteza de 1/2 pixel e nenhum degenerado 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 adiciona degenerados pós-snap e regiões de incerteza de 1/256. Ele também adiciona suporte para aceleração de algoritmo baseada em CPU (como voxelization).
- A camada 3 adiciona regiões de incerteza 1/512, cobertura de entrada interna e dá suporte ao abate de oclusão. A cobertura de entrada 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 de rasterização conservadora subestimadas (ou seja, se um pixel é garantido para ser totalmente coberto).
Resumo da API
Os seguintes métodos, estruturas, enumerações e classes auxiliares fazem referência à rasterização conservadora:
- D3D11_RASTERIZER_DESC2 : estrutura que contém a descrição do rasterizador, observando a classe auxiliar CD3D12_RASTERIZER_DESC2 para criar descrições de rasterizador.
- D3D11_CONSERVATIVE_RASTERIZATION_MODE : enumerar valores para o modo (ativado ou desativado).
- D3D11_FEATURE_DATA_D3D11_OPTIONS2 : estrutura que contém a camada de suporte.
- D3D11_CONSERVATIVE_RASTERIZATION_TIER : enumerar valores para cada camada de suporte pelo hardware.
- ID3D11Device::CheckFeatureSupport : método para acessar os recursos com suporte.