индексы вершин, нормалей и текскоординат - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть вопрос о glDrawElements и индексах вершин, нормалей и текстовых координат.

Если у меня есть геометрическая вершина, нормали вершин и вершины текстуры, каждая со своими индексами.

Какой из этих индексов я могу использовать?

Если у меня есть этот код:

glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0,
        (const GLvoid*) &teapotVertices[0]);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0,
        (const GLvoid*) &teapotNormals[0]);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0,
        (const GLvoid*) &teapotTexCoords[0]);

glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);

glBindTexture(GL_TEXTURE_2D, thisTexture->mTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE,
        (GLfloat*)&modelViewProjection.data[0] );
glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT,
        (const GLvoid*) &teapotIndices[0]);

Что должен содержать чайник?

Спасибо.

1 Ответ

3 голосов
/ 10 декабря 2010

Я не уверен, что понимаю ваш вопрос.

TeapotIndices должен быть набором индексов, указывающих порядок, в котором вы хотите, чтобы ваши вершины отображались.

Например, предположим, у вас есть объект, состоящий из трех вершин (треугольник):

0.0, 0.0, 0.0 //index 0, lower left corner
0.5, 0.5, 0.0 //index 1, top corner
1.0, 0.0, 0.0 //index 2, lower right corner

Вы указываете в коллекции / массиве индексов порядок, в котором вы хотите, чтобы они отображались. Скажем, вы хотите, чтобы ваш треугольник отображался против часовой стрелки, вы будете указывать свои индексы как

0,2,1

Затем glDrawElements нарисует левый нижний угол, затем правый нижний угол и, наконец, верхний угол

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

0.0, 0.0, 0.0 //index 0, lower left corner for first triangle
0.5, 0.5, 0.0 //index 1, top corner for first triangle
1.0, 0.0, 0.0 //index 2, lower right corner for first triangle
0.5, -0.5, 0.0 //new: index 3, bottom corner of a "mirrored" triangle

И ваши индексы будут такими:

0,2,1, 2,0,3
//     ^^^^^ second triangle vertex indices

Видите, мы добавили целый второй треугольник только с одной новой вершиной и повторно использовали две старые вершины для нового треугольника.

...