Mapeando uma Textura de "1D" para "2D" com Transformações de Matrizes OpenGL

(Com esta pergunta, estou tentando investigar uma ideia que tive para resolveresse outro)

Se eu tiver uma matriz 2D padrão de dimensõeslargura ealtura na memória, posso transformar isso em uma matriz 1D de comprimentolargura * altura e depois indexe-o viaíndice = x + y * largura. Esse mapeamento é extremamente útil ao alocar e liberar memória para a matriz, pois o gerenciador de memória não precisa se preocupar em empacotar as estruturas em 2D, mas apenas no tamanho geral de cada matriz alocada, se expresso em 1D.

Estou tentando ver se posso usar essa mesma abordagem para gerenciamento de memória de imagem para texturas OpenGL. A idéia (conforme descrito na pergunta vinculada acima) é combinar um monte de texturas necessárias em uma única maior,embalagem de lixo eles (ou seja, desenhando-os um ao lado do outro) na grande textura. Isso ajuda a minimizar as caras operações de ligação de textura durante a renderização.

Digamos que minha textura grande seja 8 × 8 pixels (ou seja, 64 pixels no 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 | . . . . . . . .

E eu gostaria de armazenar uma imagem 5 × 5 e uma imagem 4 × 5 (ou seja, 25 + 20 = 45 pixels no total). Tecnicamente, tenho muitos pixels disponíveis, mas não posso colocar essas imagens uma na outra na textura grande, pois isso exigiria uma dimensão mínima de 9 em uma direção e 5 na outra.

Se eu pudesse simplesmente tratar minha textura 8 × 8 como 64 pixels contínuos de memória e mapear as duas imagens em blocos de memória 1D, poderia organizar as imagens da seguinte maneira dentro da 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 | . . . . . . . .

Se eu desenhar todas as minhas imagens em uma escala de 1: 1, ou seja, sem coordenadas fracionárias de pixel em nenhum lugar e sem necessidade de filtragem linear ou outra mistura de pixels, é possível criar uma matriz de transformação que eu possa usar para desenhar as 4 Imagem × 5 usando esta textura?

Com sombreadores de vértices e fragmentos, parece que pode ser bastante fácil (a menos que eu esteja esquecendo alguma coisa; eu não tentei isso):

O sombreador de vértice mapeia os quatro cantos da imagem para desenhar a textura expressa como uma imagem de 64 × 1:

a: (0, 0) → (0 + 0 * 4 + 25, 0) = (25, 0) em que 25 é o deslocamento da imagem 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)

A interpolação de outras coordenadas dentro da texturadevemos (?) também mapeia para o deslocamento correto ao longo desta linha para coordenadas inteiras

O shader de fragmento converte essa coordenada de 64 × 1 na coordenada final de 8 × 8, simplesmente tomando o quociente e o restante de uma divisão por 8, por exemplo: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)

Infelizmente, os sombreadores personalizados exigem o OpenGL ES v2.0 ou superior, que não está disponível em todos os dispositivos.

De alguma forma, é possível obter esse mapeamento apenas através das transformações matriciais oferecidas pelo OpenGL ES 1.1?

questionAnswers(1)

yourAnswerToTheQuestion