Большое спасибо за разъяснение, Кристиан, это очень полезно :) Ваше время очень ценится.

ей текущей попытке перейти на OpenGL ES 2.0 из ES 1.x я в настоящее время преобразовываю некоторый код для использования объектов буфера вершин (VBO) вместо существующих небуферизованных вызовов glDrawArrays.

Я настроил VBO и заставил их работать, но столкнулся с дилеммой дизайна и был бы благодарен совету кого-то более опытного с OpenGL ES 2.0.

Я хочу нарисовать кучу полигональных спрайтов, которые часто двигаются. Это потому, что это динамические тела Box2D, если вы знакомы с Box2D. Каждое из этих многоугольных тел генерируется с использованием GL_TRIANGLE_FAN, что несколько критично, поскольку GL_POLYGON недоступен в ES 2.0.

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

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

Здесь есть несколько путей к успеху, я читалРуководство по программированию OpenGL ES 2.0 искать как можно больше информации и советов по оптимизации, касающихся VBO, и вот что они говорят:

Чередование данных является благоприятным, поскольку«Атрибутивные данные для каждой вершины можно читать последовательно».

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

Рекомендуется «использовать GL_HALF_FLOAT_OES везде, где это возможно», в первую очередь для цветов, поскольку непроецированные местоположения вершин могут превышать это пространство.

glMapBufferOES следует использовать только в том случае, если обновляется весь буфер, и даже в этом случае операция"все еще может быть дороже по сравнению с glBufferData".

Вот моивопросов:

Если использовать GL_TRIANGLE_FAN в качестве режима рисования, это заставляет меня хранить VBO для тела, а не для группы? Или общее расположение вершин для «окончания» вентилятора и текущего тела приведет к созданию нового вентилятора для следующего тела в группе VBO?

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

Следуя вышеприведенному совету о книге, предположительно, я должен glBufferData целиком размещать свои местоположения вершин при каждом обновлении рендера, а не использовать glMapBufferOES или glBufferSubData для обновления буферизованных расположений?

Существуют ли какие-либо не упомянутые функции / варианты дизайна, которые я должен использовать для повышения производительности в контексте многих движущихся полигонов?

Должен ли я попытаться использовать GL_HALF_FLOAT_OES для хранения цветов, то есть в пространстве с 2 числами с плавающей запятой вместо этого я храню 4 числа с половиной числа с плавающей запятой? Если ответ «да», я бы просто использовал любой тип GL, равный половине размера GLfloat для каждого цвета, затем побитовый ИЛИ их, а затем вставил в соответствующий массив атрибутов?

После того как я создал X много VBO, являются ли единственными вызовами, которые мне нужно сделать для каждого рендера glBindBuffer, glBufferData и glDrawElements / Arrays, или я должен также вызывать glEnableVertexAttribArray и glVertexAttribPointer каждый раз, когда я использую glBufferData?

Я был бы чрезвычайно благодарен за дальнейшие советы по этому вопросу, спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос