我对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]);
应该拿着茶壶的什么?
感谢。
答案 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
看,我们添加了一个只有一个新顶点的整个第二个三角形,并为新三角形重新使用了两个旧顶点。