2010-06-26 7 views
4

Прошу прощения за дубликат, но я уже много часов гуглин без каких-либо результатов.Может ли кто-нибудь объяснить, как использовать glDrawElements (iPhone)?

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

// 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); 
+0

И, конечно, это не сработает. – Geri

+0

Какие вызовы glEnable() вы сделали? –

+0

glEnable (GL_TEXTURE_2D); glEnable (GL_BLEND); glEnable (GL_DEPTH_TEST); – Geri

ответ

5

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

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

+0

Благодарим вас за разъяснение. Но если это правда, то почему 3D Exploring экспортирует такие массивы? Просто не могу понять. В любом случае, PolyTrans экспортирует так, как вы его описали, и это, конечно, хорошо. – Geri

0

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

+0

Я ошибся. Вопрос в glDrawElements, теперь я обновил. – Geri