顶点,正常和texcoordinate指数

时间:2010-12-03 18:42:15

标签: opengl-es opengl-es-2.0

我对glDrawElements和顶点,普通和texcoordinate索引有疑问。

如果我有几何顶点,顶点法线和纹理顶点,每个顶点都有自己的索引。

我可以使用哪些指数?

如果我有这段代码:

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 个答案:

答案 0 :(得分:3)

我不确定我理解你的问题。

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

在indices collection / array中指定要呈现它们的顺序。假设您想要逆时针渲染三角形,您将指数指定为

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

看,我们添加了一个只有一个新顶点的整个第二个三角形,并为新三角形重新使用了两个旧顶点。