Mapear una textura de "1D" a "2D" con transformaciones de matriz OpenGL

(Con esta pregunta estoy tratando de investigar una idea que tuve para resolvereste otro)

Si tengo una matriz de dimensiones 2D estándaranchura yaltura en la memoria, puedo convertir eso en una matriz 1D de longitudanchura * altura y luego indexarlo a través deíndice = x + y * anchura. Este mapeo es extremadamente útil cuando se asigna y libera memoria para la matriz, ya que el administrador de memoria no necesita preocuparse por empacar las estructuras en 2D, sino que solo debe preocuparse por la longitud total de cada matriz asignada si se expresa en 1D.

Estoy tratando de ver si puedo usar este mismo enfoque para la gestión de memoria de imagen para texturas OpenGL. La idea (como se describe en la pregunta vinculada anterior) es combinar un montón de texturas necesarias en una sola más grandeembalaje de basura ellos (es decir, dibujándolos uno al lado del otro) en la gran textura. Esto ayuda a minimizar las costosas operaciones de unión de texturas durante el renderizado.

Digamos que mi gran textura es de 8 × 8 píxeles (es decir, 64 píxeles en total):

8x8 texture:                5x5 image:            4x5 image:

   | 0 1 2 3 4 5 6 7           | 0 1 2 3 4           | 0 1 2 3
---+-----------------       ---+-----------       ---+---------
 0 | . . . . . . . .         0 | A B C D E         0 | a b c d
 1 | . . . . . . . .         1 | F G H I J         1 | e f g h
 2 | . . . . . . . .         2 | K L M N O         2 | i j k l
 3 | . . . . . . . .         3 | P Q R S T         3 | m n o p
 4 | . . . . . . . .         4 | U V W X Y         4 | q r s t
 5 | . . . . . . . .
 6 | . . . . . . . .
 7 | . . . . . . . .

Y me gustaría almacenar una imagen de 5 × 5 y una imagen de 4 × 5 (es decir, 25 + 20 = 45 píxeles en total). Técnicamente, tengo muchos píxeles disponibles, pero no puedo colocar estas imágenes una al lado de la otra en la gran textura, ya que eso requeriría una dimensión mínima de 9 en una dirección y 5 en la otra.

Si pudiera simplemente tratar mi textura 8 × 8 como 64 píxeles continuos de memoria y mapear las dos imágenes en bloques de memoria 1D dentro de eso, podría organizar las imágenes de la siguiente manera dentro de la textura: textura 8x8:

   | 0 1 2 3 4 5 6 7
---+-----------------
 0 | A B C D E F G H
 1 | I J K L M N O P             
 2 | Q R S T U V W X
 3 | Y a b c d e f g             
 4 | h i j k l m n o             
 5 | p q r s t . . .
 6 | . . . . . . . .
 7 | . . . . . . . .

Si dibujo todas mis imágenes en una escala de 1: 1, es decir, no hay coordenadas de píxeles fraccionales en ningún lado y no necesito ningún filtro lineal u otra combinación de píxeles, ¿es posible obtener una matriz de transformación que pueda usar para dibujar los 4 × 5 imagen usando esta textura?

Con los sombreadores de vértices y fragmentos, parece que podría ser bastante fácil (a menos que esté olvidando algo; no lo he intentado):

El sombreador de vértices asigna las cuatro esquinas de la imagen para dibujar la textura expresada como una imagen de 64 × 1:

a: (0, 0) → (0 + 0 * 4 + 25, 0) = (25, 0) donde 25 es el desplazamiento de la imagen 4 × 5d: (3, 0) → (3 + 0 * 4 + 25, 0) = (28, 0)q: (0, 4) → (0 + 4 * 4 + 25, 0) = (41, 0)t: (3, 4) → (3 + 4 * 4 + 25, 0) = (44, 0)

La interpolación de otras coordenadas dentro de la textura.debería (?) también se asigna al desplazamiento derecho a lo largo de esta línea para coordenadas enteras

El sombreador de fragmentos convierte esta coordenada de 64 × 1 en la coordenada final de 8 × 8 simplemente tomando el cociente y el resto de una división entre 8, por ejemplo:a: (0, 25) → (25% 8, 25/8) = (1, 3)d: (0, 28) → (28% 8, 28/8) = (4, 3)k: (0, 35) → (35% 8, 35/8) = (3, 4)q: (0, 41) → (41% 8, 41/8) = (1, 5)t: (0, 44) → (44% 8, 44/8) = (4, 5)

Lamentablemente, los sombreadores personalizados requieren OpenGL ES v2.0 o superior, que no está disponible en todos los dispositivos.

¿De alguna manera es posible lograr este mapeo solo a través de las transformaciones matriciales ofrecidas por OpenGL ES 1.1?

Respuestas a la pregunta(1)

Su respuesta a la pregunta