Partilhar via


Amostragem de Nearest-Point (Direct3D 9)

Não é necessário que as aplicações usem filtragem de textura. O Direct3D pode ser definido para que ele calcule o endereço texel, que muitas vezes não avalia como inteiros, e copia a cor do texel com o endereço inteiro mais próximo. Este processo é chamado de amostragem de ponto mais próximo. Esta pode ser uma maneira rápida e eficiente de processar texturas se o tamanho da textura for semelhante ao tamanho da imagem do primitivo na tela. Caso contrário, a textura deve ser ampliada ou minificada. O resultado pode ser uma imagem volumosa, com alias ou desfocada.

Seu aplicativo C++ pode selecionar a amostragem de ponto mais próximo chamando o IDirect3DDevice9::SetSamplerState método. Defina o valor do primeiro parâmetro para o número de índice inteiro (0-7) da textura para a qual você está selecionando um método de filtragem de textura. Passe D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER ou D3DSAMP_MIPFILTER para o segundo parâmetro para definir o filtro de ampliação, minificação ou mipmapping. Passe D3DTEXF_POINT no terceiro parâmetro.

Você deve usar a amostragem de 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

Observe que os dois quadrados no canto superior direito do grupo parecem diferentes de seus vizinhos, com deslocamentos diagonais correndo através deles. 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 nos limites do texel.

Para um exemplo simples, imagine um aplicativo que renderiza polígonos com o modo de endereçamento de textura D3DTADDRESS_WRAP. Usando o mapeamento utilizado pelo Direct3D, o índice de textura u é apresentado no diagrama abaixo para uma textura com uma largura de 4 texels.

diagrama de coordenadas de textura 0.0 e 1.0 no limite entre texels

Observe que as coordenadas de textura, 0,0 e 1,0 para esta ilustração, estão exatamente no limite entre texels. 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