Индексы OpenGLBuffer их стоит использовать? - PullRequest
0 голосов
/ 26 июня 2018

В настоящее время я изучаю OpenGL для 3D-рендеринга, и я не могу полностью обдумать некоторые вещи, касающиеся шейдеров и VBO, я получаю, что все VBO имеют один индекс, и поэтому вам необходимо дублировать некоторые данные

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

Есть ли какой-то аспект индексов, которых я не вижу?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Утилита индексных буферов, как и утилита всех функций спецификации вершин, зависит от данных вашей сетки.

Большинство мешей, которые используются в высокопроизводительной графике, особенно со значительной плотностью многоугольников, являются гладкими. Нормы в таких сетках в основном гладкие, поскольку модельер обычно аппроксимирует в основном изогнутую поверхность. О, да, здесь и там могут быть некоторые острые края, но по большей части каждая позиция в таких моделях имеет одну нормаль.

Координаты текстуры, как правило, также плавно меняются в разных сетках. Конечно, есть текстурные координаты ребер; хорошо оптимизированная УФ-распаковка часто приводит к подобным вещам. Но если у вас есть сетка реального размера (10K + вершины), большинство позиций имеют одну текстурную координату. А касательные / битангенты основаны на изменениях координат текстуры, поэтому они будут соответствовать топологии текстуры.

Существуют ли сетки, в которых нормальная топология сильно не пересекается с топологией позиции? Да. Кубики, являющиеся очевидным примером. Но часто возникает необходимость в сильно ограненной геометрии, либо для достижения особого вида, либо для использования с низкими полигонами. В этих случаях нормальный индексированный рендеринг может не принести вам пользы.

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

0 голосов
/ 26 июня 2018

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

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

Индексы - твой друг. Узнай их.

Обновление

Обычно нормали и т. Д. Хранятся на карте нормалей или интерполируются между вершинами.

Если вам нужен рендеринг с гранями или «плоский оттенок», используйте перекрестное произведение dFdx() и dFdy() (или, в HLSL, ddx() и ddy()), чтобы сгенерировать нормаль на пиксель в ваш фрагмент шейдера. Дублирование данных является плохим и необходимо только в очень особых и необычных обстоятельствах. Ничто из того, что вы упомянули, не наводит меня на мысль, что это необходимо для вашего варианта использования.

...