2012-09-11 16 views
6

Por definición, el GL_TEXTURE_MIN_FILTER se usa cuando el pixel con textura se asigna a un área que es más grande que un elemento de textura.¿Cuándo debería establecer GL_TEXTURE_MIN_FILTER y GL_TEXTURE_MAG_FILTER?

Digamos que tengo una textura con una resolución de 1024 * 768 y quiero asignarla a un rectángulo. La matriz de proyección se establece usando:

glOrtho(0, 1024, 0, 768, 0, 1); 

y el rectángulo se establece con:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(1024.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(1024.0f, 768.0f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 768.0f, 0.0f); 

Con la configuración actual, mi entendimiento es cada píxel en el rectángulo se asigna a un único píxel de la textura .

Sin embargo, después de la prueba descubrí que MIN_FILTER está trabajando para esta configuración. Incluso si duplico el tamaño del rectángulo, concretamente 2048 * 1536 y solo se muestra la esquina inferior izquierda en la ventana gráfica, sigue siendo el MIN_FILTER el que está funcionando.

En tal situación, mi comprensión personal es que cada píxel en la ventana gráfica está mapeado a solo un cuarto de píxel en la textura, ¿por qué todavía está trabajando MIN_FILTER?

Para probar qué filtro está funcionando, simplemente comente la línea para establecer ese filtro y vea si el resultado es incorrecto. Si comento la línea de configuración MIN_FILTER, el resultado sería totalmente amarillo, porque no configuré el nivel máximo de textura para que coincida con su nivel. Pero si hago un comentario en la línea MAG_FILTER, el resultado sigue siendo el correcto.

+4

¿Qué quiere decir con "está trabajando" y "no está funcionando"? –

+1

Si en su caso la ventana es más pequeña que 1024 × 768, entonces efectivamente haría una minificación. – datenwolf

Respuesta

11

Según tengo entendido, usted comenta la configuración de GL_TEXTURE_MIN_FILTER y la textura ya no funciona. De esto se concluye que durante la texturización se usa el filtro min. Y exactamente esta dedicación es incorrecta.

Cuando no se establece el filtro mínimo, no va a funcionar mágicamente no funciona. En su lugar, se utiliza el valor predeterminado GL_NEAREST_MIPMAP_LINEAR y, como no se especifican las imágenes de textura para las otras capas de mipmap, no funcionará (como usted mismo ha adivinado, creo). Pero no es que el resultado solo sea incorrecto si el filtro min se usa realmente para cierto píxel. La textura no funcionará nunca, sin importar el filtro que se use, ya que está incompleto (es decir, utilizando mipmapping sin tener imágenes válidas para cada nivel de mipmap). Por lo tanto, tampoco funcionará para el filtrado magnético. No es el filtro el que está roto, es toda la textura.

Por otro lado, el GL_TEXTURE_MAG_FILTER no tiene modos de mipmapping y cuando no lo establece, usa el valor predeterminado GL_LINEAR. Entonces la textura siempre está completa y funciona, no importa si configuras el filtro magnético o no.

Por lo tanto, su método para verificar si se usa un filtro determinado es basura y su implementación probablemente esté haciendo exactamente lo que pensaba en teoría.

Para concluir:

  1. No es necesario configurar los filtros min y mag para un objeto textura. Si no lo hace, usarán valores predeterminados. Pero de forma predeterminada, el minilimpiador usa mipmapping y requiere que especifique imágenes para cada nivel de mipmap; de lo contrario, la textura estará incompleta (es decir, no funcionará), sin importar qué filtro se use para un fragmento en particular.

  2. Es una buena idea establecer siempre explícitamente los modos de filtro para que cada objeto de textura no dependa de ningún valor predeterminado del que no esté seguro.

  3. Cuando el tamaño de un píxel exactamente (lo que es "exactamente" en este Contex de todos modos?) Coincide con el tamaño de un Texel, es difícil decir cuál de los dos modos de filtrado se utiliza, pero no hay fácil forma de verificar cuál se usa para un fragmento en particular. Pero si necesita texturas perfectas de píxeles de todos modos (como dibujar un mapa de bits en una pantalla 2D), usar GL_NEAREST para filtros mínimos y magnéticos es probablemente la mejor idea y lo libera de pensar en qué filtro se usa en realidad.

Cuestiones relacionadas