Как вы используете glDrawElements с GL_UNSIGNED_INT для индексов? - PullRequest
6 голосов
/ 11 декабря 2010

Я пытаюсь нарисовать 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;

Есть какие-нибудь предположения о том, что я делаю неправильно, что мешает рисовать мою геометрию?

1 Ответ

8 голосов
/ 11 декабря 2010

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

Со страницы руководства GLES glDrawElements :

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

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

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

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

...