opengl - glEnableClientState 与现代 OpenGL(glVertexAttribPointer 等)

标签 opengl

我想列出一些我认为我已经学到的东西,但我不确定:

  • VBO是要走的路。它们是用 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_ARRAYglNormalPointer , 等等。但是如果我不使用这些函数,而是使用带有 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/

    相关文章:

    opengl - 粒子系统设计?

    opengl - 在ubuntu 10.10中编译并运行OpenGL(glut)程序

    opengl - 使用多个 PBO 从 opengl 前端缓冲区异步读回

    java - 无法在LWJGL中绘制1280x800纹理

    opengl - OpenGL GL_COLOR_BUFFER_BIT 属性位是否表示深度和模板缓冲区相关状态?

    c++ - OpenGL 中的 2D 环境照明

    c++ - 深度检查 OpenGL(glsl)

    c++ - '&' 需要 Opengl 中 getTranslation() 函数的左值错误

    c++ - 如何将 c++/opengl 中的对象移动到新位置并删除旧对象

    opengl - 在 OpenGL 中设置 mat4