Может ли кто-нибудь объяснить, как использовать 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);

person Geri Borbás    schedule 26.06.2010    source источник
comment
И, конечно же, это не работает.   -  person Geri Borbás    schedule 27.06.2010
comment
какие вызовы glEnable() вы сделали?   -  person AndersK    schedule 27.06.2010
comment
glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glEnable(GL_DEPTH_TEST);   -  person Geri Borbás    schedule 27.06.2010
comment
Да, и необходимые функции glEnableClientState, конечно.   -  person Geri Borbás    schedule 27.06.2010


Ответы (2)


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

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

person Pivot    schedule 02.07.2010
comment
Спасибо, чтобы было ясно. Но если это правда, то почему 3D Exploring экспортирует такие массивы? Просто не могу понять. Во всяком случае, PolyTrans экспортирует так, как вы описали, и работает, конечно, хорошо. - person Geri Borbás; 02.07.2010

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

person Ricardo Ferreira    schedule 27.06.2010
comment
Я опечатался в названии. Вопрос по glDrawElements, сейчас обновил. - person Geri Borbás; 27.06.2010