glDrawElements索引应用于顶点和法线
问题描述:
如果让我们说2个数组(一个用于法线,一个用于顶点)并使用在顶点和法线之间交错的索引缓冲区,可以使用glDrawElements方法吗?glDrawElements索引应用于顶点和法线
例子:渲染立方
// 8 of vertex coords
GLfloat vertices[] = {...};
// 6 of normal vectors
GLfloat normals[] = {...};
// 48 of indices (even are vertex-indices, odd are normal-indices)
GLubyte indices[] = {0,0,1,0,2,0,3,0,
0,1,3,1,4,1,5,1,
0,2,5,2,6,2,1,2,
1,3,6,3,7,3,2,3,
7,4,4,4,3,4,2,4,
4,5,7,5,6,5,5,5};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glNormalPointer(3, GL_FLOAT, 0, normals);
glDrawElements(GL_QUADS,...);//?see Question
答
没有,看到glDrawElements()
的documentation。
只能通过使用交错数据(未交叉索引)实现 '交错',或者通过glInterleavedArrays
(见here):
float data[] = { v1, v2, v3, n1, n2, n3 .... };
glInterleavedArrays(GL_N3F_V3F, 0, data);
glDrawElements(...);
或通过:
float data[] = { v1, v2, v3, n1, n2, n3 };
glVertexPointer(3, GL_FLOAT, sizeof(float) * 3, data);
glNormalPointer(3, GL_FLOAT, sizeof(float) * 3, data + sizeof(float) * 3);
glDrawElements(...);
,你可以看到,glInterleavedArrays()
只是glInterleavedArrays()
和朋友的一些糖。
+0
为了记录,'glVertexPointer'和'glNormalPointer '应该是'sizeof(float)* 6',数据向量定义为'{v1,v2,v3,n1,n2,n3 ....}'。 – AldurDisciple 2014-11-17 16:24:45
[Rendering mesh with multiple indices]的可能重复(http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) – 2013-01-17 15:48:50