2010-07-16 86 views
1

如果让我们说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 
+0

[Rendering mesh with multiple indices]的可能重复(http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) – 2013-01-17 15:48:50

回答

4

没有,看到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

相关问题