2011-09-01 16 views
5

¿Cómo puedo hacer que mis texturas se alineen con los píxeles de la pantalla para gráficos perfectos en píxeles en OpenGL ES 2.0? Esto es crítico para un proyecto en el que estoy trabajando y que utiliza gráficos de pixel art. ¡Cualquier ayuda con esto sería genial!iPhone OpenGL ES 2.0 - Pixel Perfect Textures

+1

Una cosa más ... asegúrese de tener 'flotación de alta precisión;' en la parte superior del sombreador. Si su textura es más grande que 1024x1024, mediump no le dará la precisión suficiente para muestrear cada píxel de la textura. –

Respuesta

9

Véase mi respuesta aquí: OpenGL Texture Coordinates in Pixel Space


Esto se ha pedido un par de veces, pero no tengo los enlaces a mano, por lo que una explicación rápida y áspero. Digamos que la textura es de 8 píxeles de ancho:

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 
^ ^^^^^^^^
0.0 | | | | | | | 1.0 
| | | | | | | | | 
0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8 

Los dígitos indican los píxeles de la textura, las barras de los bordes de la textura y en caso de filtración de la cercana frontera entre píxeles. Sin embargo, desea golpear los centros de los píxeles. Así que usted está interesado en las coordenadas de textura

(0/8 + 1/8)/2 = 1/(2 * 8)

(1/8 + 2/8)/2 = 3/(2 * 8)

...

(7/8 + 8/8)/2 = 15/(2 * 8)

o más generalmente por píxel i en una amplia textura N la coordenada de textura adecuada es

(2i + 1)/(2N)

Sin embargo, si desea alinear perfectamente su textura con los píxeles de la pantalla, recuerde que lo que especifique como coordenadas no son los píxeles de un cuadrángulo, sino bordes, que según la proyección pueden alinearse con los bordes de los píxeles de la pantalla, requiere otras coordenadas de textura.

+0

Gracias! Esto ayudó. – Marc

+1

No estoy de acuerdo, no hay ninguna razón para hacer algo especial. GL garantiza que la muestra variable siempre se calcule en algún lugar dentro del píxel (generalmente el centro), por lo que no hay necesidad de hacer nada especial. Simplemente dibuje la textura como un cuadrángulo, use GL_NEAREST para texturizar la textura y (0,0,1,1) como coordenadas de su textura. Siempre que la textura tenga el mismo tamaño que el cuadrante en el espacio de la pantalla, su dibujo de textura será de un pixelperfecto. –

1

Este enlace puede ser útil:

http://glprogramming.com/red/appendixg.html#name1

Mira "Si se desea exacta rasterización de dos dimensiones ...". Este consejo de OpenGl te dice cómo configurar mejor tu matriz orto para 2D.

Además, es posible que deba desactivar cualquier tipo de filtrado de textura.

+0

Es un buen consejo para OpenGL heredado, pero no se aplica directamente a ES 2.0 – andrewmu

+0

@andrewmu: No lo sabía. ¿Podría explicar por qué? Es ES tan diferente? – neodelphi

+0

Muchas gracias pero, como dijo ardrewmu, tales operaciones de matriz no están disponibles en ES 2.0. Aunque lo había visto antes, podría haber ayudado. – Marc