Coordenadas de muestreo de textura para hacer un Sprite

Digamos que tenemos una textura (en este caso 8x8 píxeles) que queremos usar como hoja de sprites. Una de las subimágenes (sprite) es una subregión de 4x3 dentro de la textura, como en esta imagen:

(Se muestran las coordenadas de textura normalizadas de las cuatro esquinas)

Ahora, hay básicamente dos formas de asignar coordenadas de textura a un cuadrante de tamaño 4px x 3px para que se convierta efectivamente en el sprite que estamos buscando; Lo primero y más sencillo es muestrear la textura en las esquinas de la subregión:

// Texture coordinates

GLfloat sMin = (xIndex0                  ) / imageWidth;
GLfloat sMax = (xIndex0 + subregionWidth ) / imageWidth;
GLfloat tMin = (yIndex0                  ) / imageHeight;
GLfloat tMax = (yIndex0 + subregionHeight) / imageHeight;

Aunque cuando se implementa por primera vez este método, ca. 2010, me di cuenta de que los sprites parecían ligeramente "distorsionados". Después de un poco de búsqueda, encontré una publicación en los foros de cocos2d que explica que la "manera correcta" de muestrear una textura al renderizar un sprite es la siguiente:

// Texture coordinates

GLfloat sMin = (xIndex0                   + 0.5) / imageWidth;
GLfloat sMax = (xIndex0 + subregionWidth  - 0.5) / imageWidth;
GLfloat tMin = (yIndex0                   + 0.5) / imageHeight;
GLfloat tMax = (yIndex0 + subregionHeight - 0.5) / imageHeight;

... y después de arreglar mi código, estuve feliz por un tiempo. Pero en algún punto del camino, y creo que es alrededor de la introducción de iOS 5, comencé a sentir que mis sprites no se veían bien. Después de algunas pruebas, volví al método "azul" (segunda imagen) y ahora parecen estar bien, perono siempre.

¿Me estoy volviendo loco, o algo cambió con iOS 5 relacionado con el mapeo de texturas de GL ES? Tal vez estoy haciendo algo mal? (por ejemplo, ¿las coordenadas de la posición del vértice están ligeramente deshabilitadas? ¿Parámetros de configuración de la textura incorrectos?) Pero mi base de código no cambió, por lo que quizás estoy haciendo algo mal desde el principio ...

Quiero decir, al menos con mi código,siente como si el método "rojo" solía ser correcto pero ahora el método "azul" da mejores resultados.

En este momento, mi juego se ve bien, pero creo que hay algo a medias que debo arreglar tarde o temprano ...

¿Ideas / experiencias / opiniones?

APÉNDICE

Para representar el sprite de arriba, dibujaría un cuadrángulo que mide 4x3 en proyección ortográfica, con cada vértice asignado a las coordes de textura implicadas en el código mencionado anteriormente, como esto:

// Top-Left Vertex
{ sMin, tMin };

// Bottom-Left Vertex
{ sMin, tMax };

// Top-Right Vertex
{ sMax, tMin };

// Bottom-right Vertex
{ sMax, tMax };

El quad original se crea de (-0.5, -0.5) a (+0.5, +0.5); es decir, es una unidad cuadrada en el centro de la pantalla, luego se escala al tamaño de la subregión (en este caso, 4x3), y su centro se ubica en las coordenadas de enteros (x, y). Huelo que esto también tiene algo que hacer, especialmente cuando el ancho, la altura o ambos no son iguales.

ANEXO 2

También encontré este artículo, pero sigo intentando armarlo (aquí son las 4:00 AM)http://www.mindcontrol.org/~hplus/graphics/opengl-pixel-perfect.html

Respuestas a la pregunta(1)

Su respuesta a la pregunta