Отрисовка сетки с несколькими индексами

У меня есть некоторые данные вершин. Позиции, нормали, координаты текстуры. Я, наверное, зарядил его из А.файл obj или другой формат. Может, я рисую куб. Но каждый фрагмент данных вершин имеет свой собственный индекс. Могу ли я отобразить эти данные сетки с помощью OpenGL / Direct3D?

1 ответов


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

поэтому, если у вас есть куб, где каждая грань имеет свой собственный нормальный, вам нужно будет много реплицировать положение и нормальные данные. Вам понадобится 24 позиции и 24 нормали, хотя куб будет иметь только 8 уникальный позиции и 6 уникальных нормалы.

лучше всего просто принять, что ваши данные будут больше. Многие форматы моделей будут использовать несколько индексов; вам нужно будет зафиксировать эти данные вершин, прежде чем вы сможете сделать с ними рендеринг. Многие инструменты загрузки сетки, такие как Open Asset Importer, выполнят это исправление для вас.

GL 3.x и D3D10

для D3D10 / OpenGL 3.оборудование x-класса, можно избежать выполнения исправления и использовать несколько индексированных атрибутов напрямую. Однако, имейте в виду что это, вероятно, снизит производительность рендеринга.

в следующем обсуждении будет использоваться терминология OpenGL, но Direct3D v10 и выше имеет эквивалентную функциональность.

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

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

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

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

OpenGL ES 3.0 также предоставляет текстуры буфера. Более высокие версии OpenGL позволяют читать объекты буфера более непосредственно через SSBOs а не буфер текстуры, которые могут иметь лучшие характеристики производительности.