Opengl 具有应用于顶点和法线的索引的元素

Opengl 具有应用于顶点和法线的索引的元素,opengl,vertices,normals,Opengl,Vertices,Normals,如果有两个数组(一个用于法线,一个用于顶点),并且使用顶点和法线之间交错的索引缓冲区,是否可以使用GLDrawerElements方法 示例:渲染立方体 // 8 of vertex coords GLfloat vertices[] = {...}; // 6 of normal vectors GLfloat normals[] = {...}; // 48 of indices (even are vertex-indices, odd are normal-indices) GLubyt

如果有两个数组(一个用于法线,一个用于顶点),并且使用顶点和法线之间交错的索引缓冲区,是否可以使用GLDrawerElements方法

示例:渲染立方体

// 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
否,请参阅
gl抽屉元素()
的说明

您只能通过使用交错数据(而不是交错索引)实现“交错”,或者通过
glinterleavedarray
(请参阅):

或通过:

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()
和朋友之间的一些糖分。

不,请参阅
gldrawerelements()
的内容

您只能通过使用交错数据(而不是交错索引)实现“交错”,或者通过
glinterleavedarray
(请参阅):

或通过:

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()
和朋友周围的一些糖。

可能重复的可能重复对于记录而言,
glvertexinter
glNormalPointer
中的跨步应该是
sizeof(float)*6
,数据向量定义为
{v1,v2,v3,n1,n2,n3..}
为了记录,
glvertexinter
glNormalPointer
中的跨步应该是
sizeof(float)*6
,数据向量定义为
{v1,v2,v3,n1,n2,n3..