Partilhar via


Regras de Rasterização

As regras de rasterização definem como os dados vetoriais são mapeados em dados rasterizados. Os dados raster são ajustados a locais inteiros que são então eliminados e cortados (para desenhar o número mínimo de pixels), e os atributos por pixel são interpolados (de atributos por vértice) antes de serem passados para um sombreador de pixel.

Existem vários tipos de regras, que dependem do tipo de primitiva que está sendo mapeada, bem como se os dados usam ou não multiamostragem para reduzir o aliasing. As ilustrações a seguir demonstram como os casos de canto são tratados.

Regras de Rasterização de Triângulo (Sem Multiamostragem)

Qualquer centro de pixel que caia dentro de um triângulo é desenhado; Presume-se que um pixel esteja dentro se passar a regra superior esquerda. A regra superior esquerda é que um centro de pixel é definido para estar dentro de um triângulo se ele estiver na borda superior ou na borda esquerda de um triângulo.

Em que:

  • Uma borda superior, é uma aresta que é exatamente horizontal e está acima das outras bordas.
  • Uma borda esquerda, é uma aresta que não é exatamente horizontal e está no lado esquerdo do triângulo. Um triângulo pode ter uma ou duas bordas esquerdas.

A regra superior esquerda garante que os triângulos adjacentes sejam desenhados uma vez.

Esta ilustração mostra exemplos de pixels que são desenhados porque estão dentro de um triângulo ou seguem a regra superior esquerda.

ilustração de exemplos de rasterização de triângulo superior esquerdo

A cobertura cinza claro e escuro dos pixels os mostra como grupos de pixels para indicar qual triângulo eles estão dentro.

Regras de rasterização de linha (aliased, sem multiamostragem)

As regras de rasterização de linha usam uma área de teste de diamante para determinar se uma linha cobre um pixel. Para linhas x maiores (linhas com -1 <= inclinação <= +1), a área de teste de diamante inclui (mostrada sólida) a borda inferior esquerda, a borda inferior direita e o canto inferior; O diamante exclui (mostrado pontilhado) a borda superior esquerda, a borda superior direita, a ordem superior, o canto esquerdo e o canto direito. Uma linha y-major é qualquer linha que não seja uma linha x-major; A área do diamante de teste é a mesma descrita para a linha X-Major, exceto que o canto direito também está incluído.

Dada a área do diamante, uma linha cobre um pixel se a linha sair da área de teste de diamante do pixel ao viajar ao longo da linha do início ao fim. Uma tira de linha comporta-se da mesma forma, pois é desenhada como uma sequência de linhas.

A ilustração a seguir mostra alguns exemplos.

ilustração de exemplos de rasterização de linha aliased

Regras de rasterização de linha (antialiased, sem multiamostragem)

Uma linha antialiased é rasterizada como se fosse um retângulo (com largura = 1). O retângulo se cruza com um destino de renderização produzindo valores de cobertura por pixel, que são multiplicados em componentes alfa de saída do sombreador de pixel. Não há suavização de borda pré-formada ao desenhar linhas em um destino de renderização com várias amostras.

Considera-se que não existe uma única "melhor" maneira de executar a renderização de linha com suavização de serrilhado. O Direct3D 10 adota como diretriz o método mostrado na ilustração a seguir. Este método foi derivado empiricamente, exibindo uma série de propriedades visuais consideradas desejáveis. O hardware não precisa corresponder exatamente a esse algoritmo; Os testes com base nesta referência devem ter tolerâncias "razoáveis", guiadas por alguns dos princípios listados mais abaixo, permitindo várias implementações de hardware e tamanhos de kernel de filtro. Nenhuma dessas flexibilidades permitidas na implementação de hardware, no entanto, pode ser comunicada através do Direct3D 10 para aplicativos, além de simplesmente desenhar linhas e observar/medir sua aparência.

ilustração de exemplos de rasterização de linha antialiased

Este algoritmo gera linhas relativamente suaves, com intensidade uniforme, com bordas irregulares ou tranças mínimas. A padronização Moire para linhas próximas é minimizada. Há uma boa cobertura para junções entre segmentos de linha colocados de ponta a ponta. O kernel do filtro é uma compensação razoável entre a quantidade de borramento de borda e as mudanças de intensidade causadas por correções gama. O valor de cobertura é multiplicado em pixel shader o0.a (srcAlpha) de acordo com a seguinte fórmula pelo estágio de fusão de saída: srcColor * srcAlpha + destColor * (1-srcAlpha).

Regras de rasterização de pontos (sem multiamostragem)

Um ponto é interpretado como se fosse composto por dois triângulos em um padrão Z, que usam regras de rasterização de triângulos. A coordenada identifica o centro de um quadrado de um pixel de largura. Não há abate de pontos.

A ilustração a seguir mostra alguns exemplos.

ilustração de exemplos de rasterização pontual

Regras de rasterização de suavização de borda com várias amostras

A suavização de borda de várias amostras (MSAA) reduz o aliasing de geometria usando cobertura de pixel e testes de estêncil de profundidade em vários locais de subamostragem. Para melhorar o desempenho, os cálculos por pixel são realizados uma vez para cada pixel coberto, compartilhando saídas de sombreador entre subpixels cobertos. A suavização de borda de várias amostras não reduz o aliasing de superfície. Os locais de amostra e as funções de reconstrução dependem da implementação de hardware.

A ilustração a seguir mostra alguns exemplos.

ilustração de exemplos de rasterização de antialias com várias amostras

O número de locais de amostragem depende do modo de várias amostras. Os atributos de vértice são interpolados em centros de pixels, uma vez que é onde o sombreador de pixel é invocado (isso se torna extrapolação se o centro não for coberto). Os atributos podem ser sinalizados no sombreador de pixel para serem amostrados centróides, o que faz com que pixels não cobertos interpolem o atributo na interseção da área do pixel e do primitivo. Um sombreador de pixel é executado para cada área de pixel 2x2 para suportar cálculos derivados (que usam deltas x e y). Isso significa que as invocações de sombreador ocorrem mais do que é mostrado para preencher o quanta mínimo 2x2 (que é independente da multiamostragem). O resultado do sombreador é escrito para cada amostra coberta que passa no teste de estêncil de profundidade por amostra.

As regras de rasterização para primitivos são, em geral, inalteradas por suavização de serrilhado de várias amostras, exceto:

  • Para um triângulo, um teste de cobertura é realizado para cada local de amostra (não para um centro de pixel). Se mais de um local de amostra for coberto, um sombreador de pixel será executado uma vez com atributos interpolados no centro do pixel. O resultado é armazenado (replicado) para cada local de amostra coberto no pixel que passa no teste de profundidade/estêncil.

    Uma linha é tratada como um retângulo composto por dois triângulos, com uma largura de linha de 1,4.

  • Para um ponto, um teste de cobertura é realizado para cada local de amostra (não para um centro de pixel).

Muitos formatos suportam multiamostragem (consulte Suporte de hardware para formatos Direct3D 10), alguns formatos podem ser resolvidos (ResolveSubresource; que reduz a resolução de um formato com várias amostras para um tamanho de amostra de 1). Formatos de multiamostragem podem ser usados em destinos de renderização que podem ser lidos de volta em sombreadores usando carregar, uma vez que nenhuma resolução é necessária para amostras individuais acessadas pelo sombreador. Os formatos de profundidade não são suportados para recursos de várias amostras, portanto, os formatos de profundidade são restritos apenas a destinos de renderização.

Formatos sem tipo (R8G8B8A8_TYPELESS por exemplo) suportam multiamostragem para permitir que uma visualização de recursos interprete dados de maneiras diferentes. Por exemplo, você pode criar um recurso de várias amostras usando R8G8B8A8_TYPELESS, renderizar para ele usando um recurso render-target-view com um formato R8G8B8A8_UINT e, em seguida, resolver o conteúdo para outro recurso com um formato de dados R8G8B8A8_UNORM.

Suporte de hardware

A API relata o suporte de hardware para amostragem múltipla através do número de níveis de qualidade. Por exemplo, um nível de qualidade 0 significa que o hardware não suporta multiamostragem (em um determinado formato e nível de qualidade). Um 3 para níveis de qualidade significa que o hardware suporta três layouts de amostra diferentes e/ou algoritmos de resolução. Você também pode assumir o seguinte:

  • Qualquer formato que suporte multiamostragem, suporta o mesmo número de níveis de qualidade para cada formato nessa família.
  • Todos os formatos que suportam multiamostragem e têm os formatos _UNORM, _SRGB, _SNORM ou _FLOAT, também suportam a resolução.

Amostragem centróide de atributos ao antialiasing de várias amostras

Por padrão, os atributos de vértice são interpolados para um centro de pixels durante a suavização de várias amostras; Se o centro de pixels não for coberto, os atributos serão extrapolados para um centro de pixels. Se uma entrada de sombreador de pixel que contém a semântica centróide (supondo que o pixel não está totalmente coberto) será amostrada em algum lugar dentro da área coberta do pixel, possivelmente em um dos locais de amostra cobertos. Uma máscara de amostra (especificada pelo estado do rasterizador) é aplicada antes do cálculo centróide. Portanto, uma amostra mascarada não será usada como um local centróide.

O rasterizador de referência escolhe um local de amostra para amostragem centróide semelhante a este:

  • A máscara de amostra permite todas as amostras. Use uma central de pixels se o pixel estiver coberto ou se nenhuma das amostras estiver coberta. Caso contrário, a primeira amostra coberta é escolhida, começando a partir do centro do pixel e movendo-se para fora.
  • A máscara de amostra desativa todas as amostras, exceto uma (um cenário comum). Um aplicativo pode implementar a superamostragem de passagem múltipla alternando os valores de máscara de amostra de bit único e renderizando novamente a cena para cada amostra usando amostragem centróide. Tal exigiria que uma aplicação ajustasse os derivados para selecionar adequadamente parâmetros de textura mais detalhados para a maior densidade de amostragem de textura.

Cálculos de derivativos ao multiamostragem

Os sombreadores de pixel sempre são executados usando uma área mínima de 2x2 pixels para suportar cálculos derivados, que são calculados tomando deltas entre dados de pixels adjacentes (assumindo que os dados em cada pixel foram amostrados com espaçamento entre unidades horizontal ou verticalmente). Isso não é afetado pela multiamostragem.

Se as derivações forem solicitadas em um atributo que foi amostrado com centróide, o cálculo de hardware não será ajustado, o que pode causar derivadas imprecisas. Um sombreador esperará um vetor de unidade no espaço de renderização-destino, mas pode obter um vetor não-unidade em relação a algum outro espaço vetorial. Portanto, é responsabilidade de um aplicativo demonstrar cautela ao solicitar derivados de atributos que são amostrados centróides. Na verdade, recomenda-se que você não combine derivados e amostragem centróide. A amostragem centróide pode ser útil para situações em que é crítico que os atributos interpolados de uma primitiva não sejam extrapolados, mas isso vem com compensações como atributos que parecem saltar onde uma borda primitiva cruza um pixel (em vez de mudar continuamente) ou derivados que não podem ser usados por operações de amostragem de textura que derivam LOD.

Estágio Rasterizer