我想列出一些我认为我已经学到的东西,但我不确定:
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
? 最佳答案
If GL_VERTEX_ARRAY is not enabled, no geometric primitives are constructed.
那是因为手册页是错误的。手册页涵盖了 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 文档,我建议你查看 the actual API docs for core GL 3.3 .老实说,如果您想要准确的信息,我只会查看规范。这些文档中有很多错误信息。而且由于它们实际上不是维基页面,因此这些信息永远不会得到纠正。
关于opengl - glEnableClientState 与现代 OpenGL(glVertexAttribPointer 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8550179/