glEnableClientState与现代OpenGL(GLVertexAttribute指针等)

glEnableClientState与现代OpenGL(GLVertexAttribute指针等),opengl,Opengl,我想列出一些我认为我学到的东西,但不确定: VBO是一条出路。它们是用glGenBuffers和glBufferData创建的 为了获得最大的灵活性,最好使用glvertexattributepointer将常规顶点属性传递给着色器,而不是glVertex、glNormal等 glDraweElements可与顶点缓冲区和索引缓冲区一起使用,以高效地渲染具有许多共享顶点的几何体,例如横向网格 假设到目前为止所有这些都是正确的,我的问题是。我读过的所有关于现代OpenGL的教程都完全忽略了gl

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

  • VBO是一条出路。它们是用
    glGenBuffers
    glBufferData
    创建的
  • 为了获得最大的灵活性,最好使用
    glvertexattributepointer
    将常规顶点属性传递给着色器,而不是
    glVertex
    glNormal
  • glDraweElements
    可与顶点缓冲区和索引缓冲区一起使用,以高效地渲染具有许多共享顶点的几何体,例如横向网格
假设到目前为止所有这些都是正确的,我的问题是。我读过的所有关于现代OpenGL的教程都完全忽略了
glEnableClientState
。但是OpenGL手册页说,如果没有
glEnableClientState
GLDrainElements
将一事无成:

关键的一段是:“如果未启用
GL\u VERTEX\u ARRAY
,则不会构造几何图元。”

这使我想到以下问题:

  • 在调用
    glDraweElements
    之前,所有教程均未使用
    glEnableClientState
    。这是否意味着手册页错误或过时
  • 如果您要使用
    glvertexinter
    ,则使用
    GL\u VERTEX\u数组
    似乎就是您要启用的东西,同样,您也会将
    GL\u NORMAL\u数组
    glNormalPointer
    一起使用,依此类推。但是,如果我没有使用这些函数,而是使用带有
    glvertexattributepointer
    的通用顶点属性,那么为什么需要启用
    GL\u vertex\u ARRAY
VBO是一条出路。它们是用glGenBuffers和 glBufferData

VBO通常用于高性能应用程序中。您可能想先做一些简单的事情。顶点数组是快速入门的好方法。由于VBO始终位于顶点数组之上,因此在切换到VBO时将使用大部分相同的代码,最好先使用顶点数组或索引顶点数组运行测试

为了获得最大的灵活性,最好传递通用顶点属性 对于具有GLVertexAttributePointer而不是glVertex、glNormal的着色器, 等等

这是个好办法

GLD元素可以与顶点缓冲区和索引缓冲区一起使用,以 高效地渲染具有许多共享顶点的几何体,例如 景观网格

也许吧。但是,您必须确保顶点确实是共享的。位于同一位置但具有不同法线的顶点(例如,对于平面着色)不是真正共享的

如果未启用GL_顶点_数组,则不会构造几何图元

那是因为手册页错了。手册页涵盖了GL 2.1(这仍然是错误的),无论出于何种原因,更新手册页的人拒绝更新较旧的GL版本以修复错误


在GL 2.1中,必须使用通用属性索引0或
GL\u顶点\u数组
。在GL 3.1+中,不需要使用任何特定的属性索引

这是因为,在3.1之前的GL版本中,所有阵列渲染函数都是根据对
glArrayElement
的调用定义的,后者使用基于即时模式的渲染。这意味着您需要一些东西来激发顶点。回想一下,在即时模式下,调用
glVertex*()
不仅可以设置顶点位置,还可以使顶点与其他属性一起发送。调用
glVertexAttrib*(0,…)
执行相同的操作。这就是为什么旧版本要求您使用属性0或
GL\u VERTEX\u ARRAY

在GL 3.1+中,一旦使用立即模式,就必须以不同的方式指定阵列渲染。正因为如此,他们不必限制自己使用属性0


如果您想要核心GL 3.3工作的API文档,我建议您查看。尽管说实话,如果你想要准确的信息,我还是会看看说明书。那些文件中有很多错误信息。因为它们实际上不是维基页面,所以这些信息永远不会被更正。

您的前3点是正确的。要回答您最后一半的问题,请不要对现代OpenGL使用
glEnableClientState
。开始编码

所有有用的信息,但没有一个能真正回答问题。是的,尼科尔是对的。但是谢谢你的信息!这绝对有帮助。我确实有VBO和GlvertexAttributePointer在工作,所以我会坚持使用它们。你关于GLD元素的观点被很好地理解了——我理解你所说的顶点需要具有完全相同的属性才能工作的意思。哦,对了,问题。“有没有人能告诉我我在这件事上是不是错了”这部分有点转移了我的注意力。抱歉,“在GL 2.1中,您必须使用通用属性索引0”-换句话说,如果我的GLSL程序没有使用属性0,那么“没有构造几何原语”,就像手册页所说的那样?顺便说一句,我使用2.1实现Mac兼容性,我的程序在没有glEnableClientState的情况下运行良好。但是,我知道我使用的是通用属性0,我想这可以解释为什么我的几何体仍在渲染。