Рендеринг сетки с несколькими индексами

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

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

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

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

GL 3.x и D3D10

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

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

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

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

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

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

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

Давайте будем гением компьютера.