Может кто-нибудь объяснить, как использовать glDrawElements (iPhone)? - PullRequest
4 голосов
/ 27 июня 2010

Извините за дублирование, но я часами гуглял без результата.

У меня есть (оптимизированные) данные простого куба, экспортированного из конвертера:

// 8 Verticies
// 4 Texture Coordinates
// 6 Normals
// 12 Triangles

static GLshort cubeFace_indicies[12][9] = {
    // Box001
    {2,0,3 ,0,0,0 ,0,1,2 }, {1,3,0 ,0,0,0 ,3,2,1 }, {5,4,7 ,1,1,1 ,1,3,0 },
    {6,7,4 ,1,1,1 ,2,0,3 }, {1,0,5 ,2,2,2 ,1,3,0 }, {4,5,0 ,2,2,2 ,2,0,3 },
    {3,1,7 ,3,3,3 ,1,3,0 }, {5,7,1 ,3,3,3 ,2,0,3 }, {2,3,6 ,4,4,4 ,1,3,0 },
    {7,6,3 ,4,4,4 ,2,0,3 }, {0,2,4 ,5,5,5 ,1,3,0 }, {6,4,2 ,5,5,5 ,2,0,3 }
};
static GLfloat cubeVertices [8][3] = {
    {-100.0f,-100.0f,-100.0f},{100.0f,-100.0f,-100.0f},{-100.0f,100.0f,-100.0f},
    {100.0f,100.0f,-100.0f},{-100.0f,-100.0f,100.0f},{100.0f,-100.0f,100.0f},
    {-100.0f,100.0f,100.0f},{100.0f,100.0f,100.0f}
};
static GLfloat cubeNormals [6][3] = {
    {0.0f,0.0f,1.0f},{0.0f,0.0f,-1.0f},{0.0f,1.0f,0.0f},
    {-1.0f,0.0f,0.0f},{0.0f,-1.0f,0.0f},{1.0f,0.0f,0.0f}
};
static GLfloat cubeTextures [4][2] = {
    {1.0f,2.0f},{1.0f,1.0f},{0.0f,2.0f},
    {0.0f,1.0f}
};

У меня настроена текстура, и я хочу что-то увидеть на экране.Мой последний код рисования ниже:

glTexCoordPointer(2, GL_FLOAT, 0, cubeTextures);
glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
glNormalPointer(GL_FLOAT, 0, cubeNormals);
glBindTexture(GL_TEXTURE_2D, textures[0]);

    glDrawElements(GL_TRIANGLES , 12, GL_SHORT, cubeFace_indicies);

Ответы [ 2 ]

5 голосов
/ 02 июля 2010

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

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

0 голосов
/ 27 июня 2010

, чтобы использовать glDrawArrays, вы должны включить состояние GL_VERTEX_ARRAY с помощью glEnableClientState (GL_VERTEX_ARRAY), а затем создать каждую точку вершины с помощью glVertexPointer (3, GL_FLOAT, 0,)

...