Regras de rasterização
As regras de rasterização definem como os dados vetoriais são mapeados em dados raster. Os dados raster são ajustados para locais inteiros que são selecionados e recortados (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 primitivo que está sendo mapeado, bem como se os dados usam ou não multisampling para reduzir o aliasing. As ilustrações a seguir demonstram como os casos extremos 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 na regra superior esquerda. A regra superior esquerda é que um centro de pixel é definido para estar dentro de um triângulo se estiver na borda superior ou na borda esquerda de um triângulo.
em que:
- Uma borda superior é uma borda exatamente horizontal e está acima das outras bordas.
- Uma borda esquerda, é uma borda 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.
A cobertura cinza claro e escuro dos pixels os mostra como grupos de pixels para indicar em qual triângulo eles estão.
Regras de rasterização de linha (com alias, sem multiamostragem)
As regras de rasterização de linha usam uma área de teste de losango para determinar se uma linha cobre um pixel. Para linhas x-maiores (linhas com -1 <= inclinação <= +1), a área de teste de losango inclui (mostrada sólida) a aresta inferior esquerda, a aresta inferior direita e o canto inferior; o losango exclui (mostrado pontilhado) a aresta superior esquerda, a aresta superior direita, a ordem superior, o canto esquerdo e o canto direito. Uma linha y maior é qualquer linha que não seja uma linha x maior; A área do losango de teste é a mesma descrita para a linha X-Maior, exceto que o canto direito também está incluído.
Dada a área de losango, 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 faixa de linha se comporta da mesma forma, pois é desenhada como uma sequência de linhas.
A ilustração a seguir mostra alguns exemplos.
Regras de rasterização de linha (suavizadas, sem multiamostragem)
Uma linha suavizada é 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á antialiasing pré-formado 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 custo. O Direct3D 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 contra essa referência devem ter tolerâncias "razoáveis", guiadas por alguns dos princípios listados 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 por meio do Direct3D aos aplicativos, além de simplesmente desenhar linhas e observar/medir sua aparência.
Este algoritmo gera linhas relativamente suaves, com intensidade uniforme, com bordas irregulares mínimas ou tranças. O padrão de moiré para linhas fechadas é minimizado. Há uma boa cobertura para junções entre segmentos de linha colocados de ponta a ponta.
O kernel de filtro é uma compensação razoável entre a quantidade de desfoque de borda e as mudanças na intensidade causadas por correções de gama. O valor de cobertura é multiplicado em sombreador de pixel o0.a (srcAlpha) de acordo com a seguinte fórmula pelo estágio OM (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 de 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á seleção de pontos.
A ilustração a seguir mostra alguns exemplos.
Regras de rasterização anti-aliasing de várias amostras
O MSAA (Multisample Antialiasing) reduz o aliasing de geometria usando testes de cobertura de pixel e estêncil de profundidade em vários locais de subamostra. Para melhorar o desempenho, os cálculos por pixel são executados uma vez para cada pixel coberto, compartilhando saídas de sombreador entre subpixels cobertos. A suavização 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 do hardware.
A ilustração a seguir mostra alguns exemplos.
O número de locais de amostra depende do modo de várias amostras. Os atributos de vértice são interpolados nos centros de pixels, pois é aqui que 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 pelo centroide, 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 dar suporte a cálculos derivados (que usam deltas x e y). Isso significa que as invocações do sombreador ocorrem mais do que o mostrado para preencher o quanta mínimo de 2x2 (que é independente da multiamostragem). O resultado do sombreador é gravado para cada amostra coberta que passa no teste de estêncil de profundidade por amostra.
As regras de rasterização para primitivas são, em geral, inalteradas pelo antialiasing de várias amostras, exceto:
Para um triângulo, um teste de cobertura é executado para cada local de amostra (não para um centro de pixels). Se mais de um local de exemplo for coberto, um sombreador de pixel será executado uma vez com atributos interpolados no centro de pixels. 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 é executado para cada local de amostra (não para um centro de pixels).
Os formatos de várias amostras podem ser usados em destinos de renderização que podem ser lidos de volta em sombreadores usando load, pois 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.
Os formatos sem tipo dão suporte a várias amostras para permitir que uma exibição de recursos interprete os 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 multisampling por meio do número de níveis de qualidade. Por exemplo, um nível de qualidade 0 significa que o hardware não suporta multisampling (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 dê suporte ao mesmo número de níveis de qualidade para todos os formatos dessa família.
- Cada formato que suporta multiamostragem e tem os formatos _UNORM, _SRGB, _SNORM ou _FLOAT também suporta resolução.
Amostragem de centroide de atributos ao suavizar várias amostras
Por padrão, os atributos de vértice são interpolados para um centro de pixels durante a suavização de serrilhado 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 do centroide (supondo que o pixel não esteja totalmente coberto) será amostrada em algum lugar dentro da área coberta do pixel, possivelmente em um dos locais de exemplo cobertos. Uma máscara de amostra (especificada pelo estado do rasterizador) é aplicada antes da computação do centroide. Portanto, uma amostra mascarada não será usada como um local de centroide.
O rasterizador de referência escolhe um local de amostra para amostragem de centróide semelhante a este:
- A máscara de amostra permite todas as amostras. Use um centro de pixels se o pixel estiver coberto ou se nenhuma das amostras estiver coberta. Caso contrário, a primeira amostra coberta é escolhida, começando do centro do pixel e movendo-se para fora.
- A máscara de exemplo desativa todas as amostras, exceto uma (um cenário comum). Um aplicativo pode implementar a superamostragem de várias passagens alternando entre os valores de máscara de amostra de bit único e renderizando novamente a cena para cada amostra usando a amostragem de centroide. Isso exigiria que um aplicativo ajustasse os derivados para selecionar mips de textura adequadamente mais detalhados para a densidade de amostragem de textura mais alta.
Cálculos de derivativos ao fazer várias amostras
Os sombreadores de pixel sempre são executados usando uma área mínima de 2x2 pixels para dar suporte a cálculos derivativos, que são calculados tomando deltas entre dados de pixels adjacentes (supondo que os dados em cada pixel foram amostrados com espaçamento unitário horizontal ou vertical). Isso não é afetado pela multiamostragem.
Se as derivadas forem solicitadas em um atributo que foi amostrado pelo centróide, o cálculo de hardware não será ajustado, o que pode causar derivadas imprecisas. Um sombreador esperará um vetor unitário no espaço de destino de renderização, mas pode obter um vetor não unitário em relação a algum outro espaço vetorial. Portanto, é responsabilidade de um aplicativo ter cuidado ao solicitar derivadas de atributos que são amostrados por centróide.
Na verdade, é recomendável que você não combine derivados e amostragem de centróide. A amostragem de centroide pode ser útil para situações em que é crítico que os atributos interpolados de um primitivo 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.
Tópicos relacionados