Использование более одного списка индексов в одной VAO - PullRequest
2 голосов
/ 21 ноября 2011

Я, наверное, все об этом ошибаюсь, но эй.

Я отрисовываю большое количество сегментов стены (ради аргумента, скажем, 200).Каждый сегмент высотой в одну единицу, ровный и прямой, без диагоналей.Все изменения в направлении - это изменение на 90 градусов.
Я представляю каждого из них как четырехконечный веер, AKA - четырехугольник.С каждой вершиной связана трехмерная текстурная координата, например, 0,0,0, 0,1,7 или 10,1129.

Все это прекрасно работает, но я не могу не думать об этомможет быть намного лучше.Например, каждая точка дублируется, по крайней мере, дважды (каждая стена представляет собой непрерывную линию сегментов и имеется несколько трех- и четырехсторонних пересечений), и исходные координаты текстуры угла (0,0, X и 0,1, X) собираютсядублироваться для каждой стены с номером текстуры X на ней.Это можно еще больше сжать, переместив координату O в третий атрибут и индексировав координаты S и T по отдельности.

Проблема в том, что я не могу понять, как это сделать.Кажется, VAO допускают только один индекс, и, взятые как единое целое, каждая позиция и координата текстуры образуют уникальную снежинку, которая никогда не будет повторяться.(Следует признать, что это может быть не так в некоторых поворотах, но это очень сложный случай)

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

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

каждая вершина и координаты текстуры образуют уникальную снежинку, которую никогда не повторить

Вершина - это не просто позиция, а целый вектор, образованный позицией, текстуройкоординаты и все остальные атрибуты.Это то, что вы называли «снежинкой».

И только для 200 стен я бы не стал беспокоиться о потреблении памяти.Все сводится к эффективности кэширования.А графические процессоры используют вершины - и это означает, что вся позиция и вектор других атрибутов - в качестве ключа кэширования.Любая «оптимизация», подобная той, которую вы хотите выполнить, вероятно, отрицательно скажется на производительности.

Но наличие дублированных вершин не повредит так сильно, если они не слишком далеко друг от друга в списке примитивных индексов.,В настоящее время графические процессоры могут содержать от 30 до 1000 вершин (то есть после преобразования, то есть стадии шейдера) в своем кэше, в зависимости от количества подаваемых атрибутов вершин и количества переменных переменных, передаваемых на стадию шейдера фрагмента.Таким образом, если вершина (входной ключ) была кэширована, шейдер не будет выполнен, но кэшированный результат передается непосредственно для обработки фрагмента.

Так что оптимизация, к которой вы действительно должны стремиться, это локальность кэша, то есть пакетированиеВ некотором смысле, общие / дублированные вершины отправляются в графический процессор в быстрой последовательности.

2 голосов
/ 21 ноября 2011

Это зависит от того, сколько работы вы хотите сделать.

OpenGL не напрямую позволяет использовать несколько индексов. Но вы можете получить тот же эффект.

Самый прямой способ - использовать текстуру буфера для доступа к списку индексов (используя gl_VertexID), который вы затем используете для доступа ко второй текстуре буфера, содержащей ваши позиции или координаты текстуры. По сути, вы будете делать вручную то, что автоматически делает OpenGL. Это, естественно, будет медленнее для каждой вершины, так как атрибуты предназначены для быстрого доступа. Вы также теряете некоторые функции сжатия, так как буферные текстуры не поддерживают столько форматов.

...