2013-05-14 7 views
0

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

Submesh 1

Индекс [1, 3, 4, 5, 6, 2, 7, 8, 10 ...] Текстура 1

Индекс [12, 15, 16, 12, 13 , 19] Текстура 2

Если есть 1000 подстановок и 20 текстур, количество обменов текстурой становится нелепым, даже факторинг в видимости.

У меня есть все мои подпрограммы последовательно в VBO. Я пытался выяснить, как лучше оптимизировать рендеринг и устранить все ненужные текстурные свопы. Если я просто сортирую VBO, я теряю подпольные соединения, и данные видимости становятся бесполезными. Или есть лучший способ сделать это?

Или я должен создать список индексов для каждого кадра на основе видимости или слишком медленно?

Редактировать: Вот разбивка моей текущей настройки.

VBO со всеми вершинами в порядке от субместа 1 текстура 1, подстроить 1 текстуру 2, полностью подавать n, текстуру n.

У меня есть IBO, который является всего лишь индексом для всех ячеек, в том же относительном порядке.

Когда я визуализую, я проконсультируюсь с подпрограммой и присваиваю начальный индекс и счет, которые являются начальным индексом в IBO для этого субтеста и текстуры, а затем счетчиком, который является числом, имеющим эту текстуру.

Именно по этой причине я делаю так много обмена, что действительно замедляет работу.

+0

Есть ли возможность слияния нескольких этих текстур с более крупным? – Aleks

+0

@Aleks Возможно. Я бы предпочел не использовать атлас текстуры, хотя. –

+0

Что значит подделка текстуры? У вас должно быть по крайней мере 32 текстурных блока. – Grimmy

ответ

5

VBO со всеми вершинами в порядке от субместа 1 текстура 1, подстроить 1 текстуру 2, полностью подавать n, текстуру n.

У вас возникли проблемы. «Подтверждение» должно быть одним вызовом рендеринга, а не несколько вызовов рендеринга. Каждый «субмаш» должен быть эквивалентен вашим парам «subesh X, texture Y». В определенном сумере используется конкретный набор вызовов glVertexAttribPointer, вызовы glBindTexture и один вызов для визуализации glDrawElements.

В каждом подполе в этой схеме используется конкретная текстура. Поэтому вы можете отсортировать порядок рисования, с помощью которого они используют текстуры. Таким образом, все подмастеры, которые используют текстуру 1, могут быть отображены одновременно, с одним вызовом glBindTexture.

Для обеспечения максимальной производительности, поскольку все ваши подмешивания используют одни и те же буферы (и, следовательно, это хорошее изменение, что все они используют один и тот же формат вершин), вы также должны попытаться сделать use glDrawElementsBaseVertex, чтобы отобразить конкретный «субмаш», , вместо того, чтобы делать отдельные glVertexAttribPointer звонки для каждого субшета.

Идея состоит в том, чтобы сделать ваш VBO эффективным одним длинным массивом со всеми вершинами субмеша в том же массиве. Каждый субмеш сохраняет смещение базы по своим индексным данным, количество вершин для рендеринга и смещение базовой вершины, которое представляет, где индекс, который данные субместа начинаются в большом массиве.

В начале рендеринга всех подстановок вы делаете один набор glVertexAttribPointer звонков. И тогда это всего лишь glBindTexture и glDrawElementsBaseVertex с тех пор. Вы не вызываете glVertexAttribPointer за каждый субмеш. Вы используете BaseVertex, чтобы определить, откуда берутся данные субмеша в VBO.

0

У вас также есть буфер индекса, вы переходите в glDrawElements. Я предлагаю переупорядочить содержимое в индексном буфере. Или, если вы не хотите изменять данные, вызовите glDrawElements для каждого субместа отдельно с правильным смещением и количеством вершин и сортируйте сетки по текстуре.

+0

Если он не рисует все, что ему нужно, чтобы вызвать glDrawElements несколько раз. Вероятно, один для каждой сетки или найдите смежные и запустите только один glDrawElements с большей длиной. – Trax

+0

datenwolf, если я переупорядочиваю содержимое в буфере индекса, мне нужен указатель на правильную позицию в индексе? То, как я делаю это сейчас, это то, что у меня есть большой VBO и мой IBO. Каждая сетка имеет индекс в VBO и несколько вершин, соответствующих этой текстуре. Поэтому, если бы я хотел отобразить всю текстуру в subesh 8, я бы использовал glDrawElements и начал с сохраненного индекса. Как я могу сделать его более гибким, чтобы при сортировке моего IBO я все еще могу иметь правильное местоположение? Должен ли я строить свой IBO более разумно и, может быть, сортировать его, поскольку я держу сортированное смещение? –

+0

Добавлено редактирование для уточнения. –

1

После правки:

Вам нужен середина шаг, который будет короткая Сетка для визуализации, основанный на текстуру идах. Вам необходимо сделать запрос на рисование (glDrawElements), на каждый субсеть. Имея это в виду, вы можете сделать следующее:

В основном вы делаете то же самое, но вместо рендеринга вещи храните эту сетку в списке отображения необходимой ей текстуры.

Создайте объект, называемый отображаемым списком, который содержит массив подстановок (указателей) для визуализации. Создайте массив таких объектов, по 1 на один идентификатор текстуры.

В своем алгоритме перед обработкой материала заполните указанную выше структуру и ничего не визуализируйте.

Когда вы закончите работу над тем, что видимо и нуждается в рендеринге, перейдите по массиву отображаемых списков (0 .... num_textures) и отрисуйте подпоры для этой текстуры.HINT: На этом шаге вы можете найти соседние подпрограммы и просто выполнить один звонок до glDrawElements.

Оптимизированная идея выше.

Это легко реализовать и свести к минимуму изменения состояния текстуры.