Как вы используете glDrawElements с GL_UNSIGNED_INT для индексов?

Я пытаюсь рисовать 3D-объекты с более чем 65536 вершинами на iPad, но не могу понять, что я делаю неправильно. Моя исходная модель, которая использовала GL_UNSIGNED_SHORT, работала просто отлично, но теперь с GL_UNSIGNED_INT я не могу ничего показать с помощью команды glDrawElements. Как будто рендерер полностью игнорирует мою строку glDrawElements. Часть моего цикла рендеринга, на которую я ссылаюсь, приведена ниже:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]);
glNormalPointer(GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]);

for (int i = 0; i < assemblyObj->numObjects; i++)
{
     glDrawElements(GL_TRIANGLES, assemblyObj->partList[i].faceArray.size(), GL_UNSIGNED_INT, &assemblyObj->partList[i].faceArray[0]);
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

вершин определяется как:

vector<float> vertices;

и каждый faceArray определяется как:

vector<UInt32> faceArray;

Любые предложения о том, что я делаю неправильно, что мешает рисованию моей геометрии?


person Davido    schedule 10.12.2010    source источник


Ответы (1)


Стандартный OpenGL ES не поддерживает GL_UNSIGNED_INT для индексов.

Из справочной страницы GLES glDrawElements:

GL_INVALID_ENUM генерируется, если тип не GL_UNSIGNED_BYTE или GL_UNSIGNED_SHORT.

Это ограничение ослабляется, когда поддерживается GL_OES_element_index_uint.

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

Что касается конкретно ipad, насколько я знаю, iOS не поддерживает это расширение (см. Поддерживаемые расширения), но вы можете проверить список расширений на самом устройстве, если хотите в этом убедиться.

person Bahbar    schedule 11.12.2010
comment
Делается ли это быстрее, чем рисование с помощью glDrawArrays? Я могу делать то же самое, что и сейчас, с glDrawArrays, но я хочу отображать как можно больше кадров в секунду. - person Davido; 14.12.2010
comment
Я понял это, я просто визуализирую каждый объект, используя его собственный массив вершин, и он отлично работает. Я визуализирую около 125 000 вершин с 90 моделями, и это можно использовать, визуализируя около 12 кадров в секунду. Сейчас я просто пытаюсь выяснить, могу ли я что-нибудь сделать, чтобы ускорить рендеринг. Какие-либо предложения? - person Davido; 15.12.2010
comment
Этот ответ неверен, GL_UNSIGNED_INT поддерживается для glDrawElements, если GL_OES_element_index_uint реализовано (как в iOS, согласно ‹OpenGLES/ES2/glext.h›). - person rich.e; 07.03.2012
comment
@rich.e Спасибо! Я наткнулся на это во время поиска, и #include'ing этот файл решил мою проблему для iOS (это было во внешнем коде, поэтому использование этого кажется предпочтительнее, чем переписывать код для работы с GL_UNSIGNED_SHORT). - person Aria Buckles; 12.03.2012
comment
@rich.e: уточнил мой ответ, включив в него упоминание о расширении. Однако может ли кто-нибудь уточнить, действительно ли ios поддерживает расширение? страница, которую я нашел, сказала, что это не так. Одного того факта, что в заголовке есть определение, недостаточно, чтобы претендовать на поддержку. - person Bahbar; 12.03.2012
comment
Я могу убедиться, что glDrawElements правильно работает со значениями unsigned int в iOS 5.0 на iPhone 4, я не тестировал ничего более старого. Что касается документов Apple, я больше доверяю заголовочным файлам, они редко обновляют их. - person rich.e; 12.03.2012
comment
@rich.e: спасибо за проверку. Что касается заголовков, показывающих расширения, они не обязательно подразумевают поддержку, просто вы можете запрограммировать расширение, если оно присутствует в GL_EXTENSIONS_STRING. Отсюда мой предыдущий комментарий. Наконец нашел страницу со всеми данными: lastrayofhope.com/wp-content/uploads/2011/07/ Похоже, он начал появляться в iOS 4. - person Bahbar; 13.03.2012