Отображение текстуры из «1D» в «2D» с помощью преобразования матрицы OpenGL

(С помощью этого вопроса я пытаюсь исследовать идею, которую я имел для решенияэтот другой)

Если у меня есть стандартный 2D-массив размеровширина а такжерост в памяти, я могу превратить это в одномерный массив длиныширина * рост а затем индексировать его черезиндекс = x + y * ширина, Это отображение чрезвычайно полезно при выделении и освобождении памяти для массива, поскольку диспетчеру памяти не нужно беспокоиться об упаковке структур в 2D, а нужно только беспокоиться об общей длине каждого выделенного массива, если он выражен в 1D.

Я пытаюсь понять, могу ли я использовать этот же подход для управления памятью изображений для текстур OpenGL. Идея (как описано в приведенном выше связанном вопросе) состоит в том, чтобы объединить целую кучу необходимых текстур в одну большую.бен-упаковка их (то есть рисуя их рядом друг с другом) в большую текстуру. Это помогает минимизировать дорогостоящие операции связывания текстуры во время рендеринга.

Допустим, моя большая текстура имеет размер 8 × 8 пикселей (т.е. всего 64 пикселя):

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 | . . . . . . . .

И я хотел бы сохранить изображение 5 × 5 и изображение 4 × 5 (т.е. всего 25 + 20 = 45 пикселей). Технически у меня достаточно пикселей, но я не могу поместить эти изображения рядом друг с другом в большую текстуру, поскольку для этого потребуется минимальный размер 9 в одном направлении и 5 в другом.

Если бы я мог просто обработать свою текстуру 8 × 8 как 64 непрерывных пикселя памяти и отобразить два изображения в одномерные блоки памяти внутри нее, я мог бы расположить изображения следующим образом внутри текстуры: текстура 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 | . . . . . . . .

Если я рисую все свои изображения в масштабе 1: 1, то есть без дробных координат пикселей и без необходимости какой-либо линейной фильтрации или другого смешения пикселей, возможно ли придумать матрицу преобразования, которую я могу использовать для × 5 изображений с использованием этой текстуры?

С вершинными и фрагментными шейдерами это выглядит так, что это может быть довольно легко (если я не забуду что-то; я не пробовал это):

Вершинный шейдер отображает четыре угла изображения для рисования на текстуру, представленную как изображение 64 × 1:

a: (0, 0) → (0 + 0 * 4 + 25, 0) = (25, 0) где 25 - смещение изображения 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)

Интерполяция других координат внутри текстурыдолжен (?), затем также отобразите смещение вправо вдоль этой линии для целочисленных координат

Фрагментный шейдер преобразует эту координату 64 × 1 в конечную координату 8 × 8, просто взяв частное и остаток от деления на 8, например: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)

К сожалению, для пользовательских шейдеров требуется OpenGL ES v2.0 или выше, что доступно не на всех устройствах.

Возможно ли каким-то образом добиться этого отображения только с помощью матричных преобразований, предлагаемых OpenGL ES 1.1?

Ответы на вопрос(1)

Ваш ответ на вопрос