我想列出一些我认为我已经学到的东西,但我不确定:
glGenBuffers和创造的glBufferData.glVertexAttribPointer,而不是glVertex,glNormal等.glDrawElements 可以与顶点缓冲区和索引缓冲区一起使用,以有效地渲染具有大量共享顶点的几何体,例如横向网格.假设到目前为止所有这些都是正确的,这是我的问题.我读过的关于现代OpenGL的所有教程都完全省略了glEnableClientState.但OpenGL手册页说没有glEnableClientState,glDrawElements什么都不做:
http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml
关键的通道是:"如果GL_VERTEX_ARRAY没有启用,则不构造几何图元."
这引出了以下问题:
glEnableClientState在调用之前没有教程使用glDrawElements.这是否意味着手册页错误或过时?GL_VERTEX_ARRAY似乎是启用,如果你要使用的东西glVertexPointer,同样你会使用GL_NORMAL_ARRAY与glNormalPointer,等等.但是,如果我没有使用这些函数,而是使用通用顶点属性glVertexAttribPointer,那么为什么需要启用GL_VERTEX_ARRAY?Nic*_*las 20
如果未启用GL_VERTEX_ARRAY,则不会构造几何图元.
那是因为手册页错了.手册页涵盖了GL 2.1(并且它仍然是错误的),无论出于何种原因,更新手册页的人拒绝更新旧的GL版本以进行错误修复.
在GL 2.1中,您必须使用通用属性索引0或GL_VERTEX_ARRAY.在GL 3.1+中,您不需要使用任何特定的属性索引.
这是因为,在3.1之前的GL版本中,所有数组渲染函数都是根据调用定义的glArrayElement,它使用立即基于模式的渲染.这意味着你需要一些东西来激发顶点.回想一下,在立即模式下,调用glVertex*()不仅设置顶点位置,还使顶点与其他属性一起发送.打电话glVertexAttrib*(0, ...)做同样的事情.这就是为什么旧版本要求您使用属性0或GL_VERTEX_ARRAY.
在GL 3.1+中,一旦他们采用立即模式,他们必须以不同方式指定数组渲染.因此,他们不必将自己局限于使用属性0.
如果您希望核心GL 3.3的API文档有效,我建议您查看核心GL 3.3的实际API文档.虽然说实话,如果你想要准确的信息,我只看一下规范.那些文档中有很多错误的信息.由于它们实际上不是维基页面,因此该信息永远不会得到纠正.
| 归档时间: |
|
| 查看次数: |
7211 次 |
| 最近记录: |