【问题标题】:Opengl: Print with glDrawElementsOpengl:使用 glDrawElements 打印
【发布时间】:2013-08-30 07:18:08
【问题描述】:

嗯..我写了这段代码来打印网格(var m),它运行良好

glBegin(GL_TRIANGLES);
for (unsigned i : m.vtIndex)
{
    const aiVector3D *pv = &m.pMesh->mVertices[i];
    const aiVector3D *pvn = &m.pMesh->mNormals[i];
    glNormal3fv((const GLfloat *)pvn);
    glVertex3fv((const GLfloat *)pv);
}
glEnd();

还有一个

glVertexPointer(3, GL_FLOAT, 0, m.pMesh->mVertices);
glNormalPointer(GL_FLOAT, 0, m.pMesh->mNormals);
glDrawElements(GL_TRIANGLES, m.vtIndex.size(), GL_UNSIGNED_INT, &m.vtIndex[0]);

但是第二个发生了访问冲突 能给我意见吗?

【问题讨论】:

  • @RogerRowland:这不正确。 glDrawElements 需要顶点数(您应该能够更改 mode 保持其余参数不变)。它宁愿假设m.vtIndex.size() 不返回数组中元素的数量,而是以字节为单位的大小,这不是你想要的。
  • @datenwolf: Err,glDrawElements (...) 期望元素的数量...如果您一遍又一遍地使用相同的索引,您可以根据需要绘制 1 个顶点。
  • @AndonM.Coleman:是的,我知道。我的意思不是属性缓冲区中的顶点数,而是 glDrawElements 应处理的顶点数。即使是同一个顶点N次,OpenGL也要处理N个顶点。

标签: opengl


【解决方案1】:

您在此示例中使用已弃用的 OpenGL,并使用客户端内存来存储顶点数据。在弃用的 OpenGL 中,您需要启用相应的客户端状态:

glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_NORMAL_ARRAY);

如果您在绘制调用之前将此添加到您的代码中,它应该可以解决您的崩溃问题。


您可以在程序运行的整个过程中安全地启用GL_VERTEX_ARRAY,但您可能需要启用/禁用其他数组,例如GL_NORMAL_ARRAY,具体取决于您的网格实际使用的顶点指针。

【讨论】:

    【解决方案2】:

    我明白了。

    glEnableClientState(GL_INDEX_ARRAY); // Oops!!
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    

    哈哈....

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2013-09-30
      相关资源
      最近更新 更多