Есть ли смысл использовать индексный буфер с текстурой в OpenGL ES (Android)? - PullRequest
5 голосов
/ 22 сентября 2009

Я использую OpenGL ES для отображения некоторых объектов, экспортированных из Blender. Blender предоставляет список вершин, список индексов лица и список координат 2D-текстур. В Blender, и я верю в OpenGL, координаты текстуры отображаются в каждую вершину, описанную в индексном массиве.

Полагаю, у меня есть два вопроса:

  1. Мне дано понять (см. Раздел «Применение текстур»), что в OpenGL ES координаты текстуры отображаются только в буфер вершин, а не в индексный буфер. Это так или есть способ связать текстурные ко-орды с буфером индекса вместо этого?

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

1 Ответ

11 голосов
/ 27 сентября 2009

1) Мне дано понять, что в OpenGL ES координаты текстуры отображаются только в буфер вершин, а не в индексный буфер.

Правильно, координаты текстуры относятся к данным вершин (буферизованным или в пространстве процессора), а НЕ к индексным данным. Индексный механизм не зависит от текстурирования.

Предположим, у вас есть этот массив вершин, состоящий из 3 вершин (по 3 компонента в каждой):

float vdata[] = {x0,y0,z0, x1,y1,z1, x2,y2,z2};

и этот массив текстовых координат, состоящий из 3 координат (по 2 компонента в каждой):

float tdata[] = {u0,v0,    u1,v1,    u2,v2};

При объявлении этих данных в OpenGL вы связываете вершину 0 (x0, y0, z0) с координатой текстуры 0 (u0, v0), вершину 1 с координатой текстуры 1 и так далее. В конце он отобразит ваш треугольник, состоящий из 3 вершин / 3 координат текстуры, соответствующей части текстуры.

Вот традиционная картинка OpenGL, но для многоугольника с четырьмя вершинами.

alt text
(источник: glprogramming.com )

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

unsigned int idata[] = {0,1,2, 0,1,2};

Таким образом, для ответа на 1) данные индекса не зависят от texcoords или других атрибутов вершин, таких как цвета, нормали и т. Д., Поэтому нет смысла связывать texcoords с индексными данными.

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

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

Конечно, если вы возьмете 3D-куб, ни одна из вершин не будет использовать одни и те же текстовые координаты или нормали, но это не типичная модель! Я полагаю, что большинство сеток в игровых / CAD-приложениях представляют собой непрерывные поверхности с большим количеством избыточных вершин и обеспечивают большую степень индексации.

Во-вторых, при наличии индексов графический процессор может использовать кеш до / после вершины для ускорения рендеринга. Что касается пропускной способности памяти, то наличие индексов почти бесплатно, поскольку графический драйвер помещает их в память pci-express (DMA) и поэтому не расходует пропускную способность видеопамяти.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...