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]);

茶壶应该持有什么指标?

谢谢。

4

1 回答 1

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

您在索引集合/数组中指定您希望它们呈现的顺序。假设您希望您的三角形逆时针呈现,您将指定索引为

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

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

于 2010-12-10T13:27:25.873 回答