【问题标题】:glDrawElements with indices applied to vertices and normalsglDrawElements 索引应用于顶点和法线
【发布时间】:2010-07-16 10:45:46
【问题描述】:

当您有 2 个数组(一个用于法线,一个用于顶点)并使用在顶点和法线之间交错的索引缓冲区时,是否可以使用 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

【问题讨论】:

标签: opengl vertices normals


【解决方案1】:

不,请参阅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() 和朋友们周围的一些糖。

【讨论】:

  • 为了记录,glVertexPointerglNormalPointer 中的步幅应该是sizeof(float) * 6,数据向量定义为{ v1, v2, v3, n1, n2, n3 .... }
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 2013-07-16
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多