Opengl:使用GLDrawerElements打印

Opengl:使用GLDrawerElements打印,opengl,Opengl,嗯。。我编写了这段代码来打印网格(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); glVert

嗯。。我编写了这段代码来打印网格(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]);
但第二个发生了访问冲突
您能给我一个意见吗?

在本例中,您使用的是不推荐的OpenGL,并使用客户端内存存储顶点数据。在不推荐使用的OpenGL中,您需要启用适当的客户端状态:

glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_NORMAL_ARRAY);
如果在draw调用之前将其添加到代码中,它应该可以修复崩溃


您可以在整个程序运行期间安全地保持启用
GL\u VERTEX\u ARRAY
,但您可能需要启用/禁用其他数组,如
GL\u NORMAL\u ARRAY
,具体取决于网格实际使用的顶点指针。

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

哈哈……

@RogerRowland:那是不对的。GLDraweElements需要顶点的数量(您应该能够更改模式,保持其余参数不变)。它宁愿假定
m.vtIndex.size()
不返回数组中的元素数,而是返回以字节为单位的大小,这不是您在这里想要的。@datenWalf:Err,
glDrawerElements(…)
需要元素数。。。如果你反复使用相同的索引,你可以任意多次绘制一个顶点。@AndonM.Coleman:是的,我知道。我的意思不是属性缓冲区中的顶点数,而是元素应处理的顶点数。即使是相同的顶点N次,OpenGL也必须处理N个顶点。