(С этим вопросом я пытаюсь исследовать идею я имел для решения this other one)Отображение текстуры из «1D» в «2D» с матрицей OpenGL преобразований
Если у меня есть стандартный 2D массив размеры ширина и высота в памяти, можно превратить это в 1D массив длины ширина * высота, а затем индекс его через индекс = х + у * ширина. Это сопоставление чрезвычайно полезно при распределении и освобождении памяти для массива, поскольку менеджеру памяти не нужно беспокоиться о том, чтобы упаковать структуры в 2D, но нужно только беспокоиться об общей длине каждого выделенного массива, если он выражен в 1D.
Я пытаюсь посмотреть, могу ли я использовать этот же подход для управления памятью изображений для текстур OpenGL. Идея (как описано в вышеупомянутом связанном вопросе) состоит в том, чтобы объединить целую кучу необходимых текстур в одну большую ее часть (т. Е. Нарисовать их рядом друг с другом) в большую текстуру. Это помогает минимизировать дорогостоящие операции связывания текстур во время рендеринга.
Скажем, моя большая текстура 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 изображений и 5 изображений в нем (то есть 25 + 20 = 45 пикселей). Технически, у меня есть много доступных пикселей, но я не могу разместить эти изображения рядом друг с другом в большой текстуре, поскольку для этого потребуется минимальный размер 9 в одном направлении и 5 в другом.
Если бы я мог просто относиться к моим 8 текстуру 64 продолжают пиксели памяти и отображать два изображения в 1D блоки памяти внутри, что я мог бы расположить изображения следующим образом внутри текстуры: x8 текстуры:
| 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 × 5 изображенияd
: (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, например:
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?
Обратите внимание, что процент активных устройств, которые не поддерживают по меньшей мере ES 2.0, упал настолько низко что Google прекратил отслеживать его (http://developer.android.com/about/dashboards). Я считаю, что это было около 1-2%, когда они публиковали последние номера для ES 1.1. На самом деле я бы больше беспокоился о том, насколько хорошо реализованы версии ES 1.1 на новых устройствах, учитывая, насколько они устарели. –
Насколько я знаю, это не так, поскольку это не было бы линейным преобразованием и поэтому не может быть представлено матрицей. – chbaker0
@RetoKoradi Хорошая точка. Я должен обязательно проверить последствия для производительности. В целом я стараюсь поддерживать как можно больше устройств, если это не вызовет проблемы для более современных. Однако я был бы удивлен, если бы стандартные преобразования матриц стали более медленными на современных устройствах. Это все еще стандартный способ делать что-то, нет? –