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