Compartilhar via


Amostragem do ponto mais próximo

Os aplicativos não são necessários para usar a filtragem de textura. O Direct3D pode ser definido para calcular o endereço texel, que geralmente não é avaliado como inteiros, e copia a cor do texel com o endereço inteiro mais próximo. Esse processo é chamado de amostragem do ponto mais próximo. A amostragem do ponto mais próximo 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 reduzida. 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, pois às vezes ela pode causar artefatos gráficos quando a textura é amostrada no limite entre dois texels. Esse limite é a posição ao longo da textura (u ou v) na qual o texel amostrado faz a transição de um texel para o próximo. Quando a amostragem de ponto é usada, o sistema escolhe um texel de amostra ou outro, e o resultado pode mudar abruptamente de um texel para o próximo à 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 se mistura suavemente entre eles à medida que o índice de textura se move através do limite.

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

Na maioria dos casos, os aplicativos obtêm os melhores resultados, evitando a amostra do ponto mais próximo sempre que possível. A maioria do hardware hoje é otimizada para filtragem linear, portanto, seu aplicativo não deve sofrer desempenho degradado. Se o efeito desejado exigir absolutamente o uso da amostragem do ponto mais próximo, como ao usar texturas para exibir caracteres de texto legíveis, seu aplicativo deverá 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 ser.

ilustração de uma caixa de seis seções com linhas horizontais não contínuas nos dois quadrados superiores direitos

Os dois quadrados no canto superior direito do grupo parecem diferentes de seus vizinhos, com deslocamentos diagonais passando por eles. Para evitar artefatos gráficos como esses, você deve estar familiarizado com as regras de amostragem de textura do 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) a um valor de espaço de texel inteiro que varia de [ - 0,5, n - 0,5], em que n é o número de texels em uma determinada dimensão na textura. O índice de textura resultante é arredondado para o inteiro mais próximo. Esse mapeamento pode introduzir imprecisões de amostragem nos limites de texel.

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 é mapeado 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 no limite entre texels

As coordenadas de textura, 0,0 e 1,0 para esta ilustração, estão exatamente no limite entre os texels. Usando o método pelo qual o Direct3D mapeia valores, as coordenadas de textura variam de [ - 0,5, 4 - 0,5], em que 4 é a largura da textura. Para esse caso, o texel amostrado é o texel 0 para um índice de textura de 1,0. No entanto, se a coordenada de textura for apenas um pouco menor que 1,0, o texel amostrado será o texel n em vez do texel 0.

A implicação disso é que ampliar uma textura pequena 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 os texels. Quaisquer imprecisões no cálculo de coordenadas de textura, por menores que sejam, resultam em artefatos ao longo das áreas na imagem renderizada que correspondem às bordas de texel do mapa de textura.

Executar esse mapeamento de coordenadas de textura de ponto flutuante para texels inteiros com precisão perfeita é difícil, computacionalmente demorado e geralmente desnecessá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 do 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, pois 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 perceptíveis porque o rasterizador de referência não executa essa operação com precisão perfeita.

A melhor abordagem é usar a filtragem de ponto mais próximo somente quando necessário. Quando você precisar usá-lo, é recomendável deslocar ligeiramente as coordenadas de textura das posições de limite para evitar artefatos.

Filtragem de textura