Partilhar via


Amostragem no ponto mais próximo

Não é obrigatório que as aplicações usem filtragem de textura. O Direct3D pode ser configurado para que ele calcule o endereço do texel, que geralmente não resulta em inteiros, de modo a copiar a cor do texel correspondente ao endereço inteiro mais próximo. Este processo é designado amostragem do ponto mais próximo. A amostragem mais próxima pode ser como se o tamanho da textura fosse semelhante ao tamanho da imagem do primitivo na tela. Caso contrário, a textura deve ser ampliada ou minificada. O resultado da incompatibilidade de tamanhos de textura com o tamanho primitivo da imagem pode ser uma imagem volumosa, com alias ou desfocada.

Use a amostragem do ponto mais próximo com cuidado, porque às vezes pode causar artefatos gráficos quando a textura é amostrada no limite entre dois texels. Este limite é a posição ao longo da textura (u ou v) na qual o texel amostrado transita de um texel para o seguinte. Quando a amostragem pontual é usada, o sistema escolhe um texel de amostra ou outro, e o resultado pode mudar abruptamente de um texel para o próximo texel à medida que o limite é cruzado. Esse efeito pode aparecer como artefatos gráficos indesejados na textura exibida. Quando a filtragem linear é usada, o texel resultante é calculado a partir de ambos os texels adjacentes e mistura-se suavemente entre eles à medida que o índice de textura se move através do limite.

Este efeito pode ser visto ao mapear uma textura muito pequena em um polígono muito grande: uma operação muitas vezes chamada de ampliação. Por exemplo, ao usar uma textura que se parece com um tabuleiro de xadrez, a amostragem de ponto mais próximo resulta em um tabuleiro de xadrez maior que mostra bordas distintas. Por outro lado, a filtragem linear de textura resulta em uma imagem onde as cores do tabuleiro de xadrez variam suavemente em todo o polígono.

Na maioria dos casos, as aplicações recebem os melhores resultados, evitando amostras pontuais mais próximas sempre que possível. Atualmente, a maioria do hardware é otimizada para filtragem linear, portanto, seu aplicativo não deve sofrer um desempenho degradado. Se o efeito desejado exigir absolutamente o uso da amostragem de ponto mais próximo - como ao usar texturas para exibir caracteres de texto legíveis - então seu aplicativo deve ser extremamente cuidadoso para evitar a amostragem nos limites do texel, o que pode resultar em efeitos indesejados. A ilustração a seguir mostra como esses artefatos podem parecer.

ilustração de uma caixa dividida em seis secções com linhas horizontais interrompidas nos dois quadrados no canto superior direito

Os dois quadrados no canto superior direito do grupo parecem diferentes de seus vizinhos, com deslocamentos diagonais atravessando-os. Para evitar artefatos gráficos como esses, você deve estar familiarizado com as regras de amostragem de textura Direct3D para filtragem de ponto mais próximo. O Direct3D mapeia uma coordenada de textura de ponto flutuante que varia de [0,0, 1,0] (0,0 a 1,0, inclusive) para um valor de espaço texel inteiro que varia de [ - 0,5, n - 0,5], onde n é o número de texels em uma determinada dimensão na textura. O índice de textura resultante é arredondado para o número inteiro mais próximo. Este mapeamento pode introduzir imprecisões de amostragem nas fronteiras dos texels.

Para um exemplo simples, imagine um aplicativo que renderiza polígonos com o modo de endereçamento de textura Wrap. Usando o mapeamento empregado pelo Direct3D, o índice de textura u mapeia conforme mostrado no diagrama a seguir para uma textura com uma largura de 4 texels.

diagrama de coordenadas de textura 0.0 e 1.0 na fronteira entre texels

As coordenadas de textura, 0.0 e 1.0 para esta ilustração, estão exatamente no limite entre texéis. Usando o método pelo qual o Direct3D mapeia valores, as coordenadas de textura variam de [ - 0,5, 4 - 0,5], onde 4 é a largura da textura. Para este caso, o texel amostrado é o texel 0 para um índice de textura de 1,0. No entanto, se a coordenada de textura fosse apenas ligeiramente inferior a 1,0, o texel amostrado seria o n texel em vez do 0 texel.

A implicação disso é que ampliar uma pequena textura usando coordenadas de textura de exatamente 0,0 e 1,0 com filtragem de ponto mais próximo em um triângulo alinhado ao espaço da tela resulta em pixels para os quais o mapa de textura é amostrado no limite entre texels. Qualquer imprecisão no cálculo das coordenadas de textura, por menor que seja, resulta em artefatos ao longo das áreas na imagem renderizada que correspondem às bordas texel do mapa de textura.

Realizar esse mapeamento de coordenadas de textura de ponto flutuante para texels inteiros com precisão perfeita é difícil, computacionalmente demorado e, geralmente, não é necessário. A maioria das implementações de hardware usa uma abordagem iterativa para calcular coordenadas de textura em cada local de pixel dentro de um triângulo. As abordagens iterativas tendem a ocultar essas imprecisões porque os erros são acumulados uniformemente durante a iteração.

O rasterizador de referência Direct3D usa uma abordagem de avaliação direta para calcular índices de textura em cada local de pixel. A avaliação direta difere da abordagem iterativa na medida em que qualquer imprecisão na operação exibe uma distribuição de erro mais aleatória. O resultado disso é que os erros de amostragem que ocorrem nos limites podem ser mais percetíveis porque o rasterizador de referência não executa esta operação com precisão perfeita.

A melhor abordagem é usar a filtragem de ponto mais próximo apenas quando necessário. Quando for necessário usá-la, é recomendável que se desloquem ligeiramente as coordenadas de textura das posições de limite para evitar artefactos.

Filtragem de textura