【问题标题】:Is it possible to write vertex array code that's portable between OpenGL 2.x and 3.x?是否可以编写在 OpenGL 2.x 和 3.x 之间可移植的顶点数组代码?
【发布时间】:2020-10-22 09:11:12
【问题描述】:

OpenGL 3.0 spec 说:

OpenGL 3.0 的 E.1 配置文件和已弃用的功能

...

客户端顶点数组 - 所有顶点数组属性指针必须引用 缓冲对象(第 2.9.2 节)。默认顶点数组对象 (名称零)也已弃用。调用 VertexAttribPointer 时 没有缓冲区对象或没有绑定顶点数组对象将生成一个 INVALID_OPERATION 错误,调用任何数组绘图命令也会如此 当没有绑定顶点数组对象时。

ref page for glEnableVertexAttribArray 说:

如果没有绑定顶点数组对象,

GL_INVALID_OPERATIONglEnableVertexAttribArrayglDisableVertexAttribArray 生成。

我听到的消息是,在 OpenGL 2.x 和 OpenGL 3.x/3.2+ 之间完全可移植的综合顶点数组代码是不可能的,因为 2.x 不能使用 VAO(API 表面可以严格地强制执行——感谢 GLAD!),并且 3.x 必须使用 VAO(这...某些驱动程序 maaaybe 强制执行?)

在我看来,健壮的代码必须在某些时候在专用的 2.x 和 3.x 代码路径(在运行时检测到)之间分支。这是真的吗?

【问题讨论】:

  • (我......我知道这可能是一个时间胶囊,这个问题更适合 2010 年而不是 2020 年,但 2.x 在这里对我来说很重要哈哈。)
  • 可以在启动时创建并绑定一个 VAO,然后忘记它的存在,并像使用 GL 2.x 上下文一样继续操作,至少就顶点而言设置/提交。

标签: opengl vao opengl-2.0


【解决方案1】:

当您使用兼容性配置文件OpenGL Context 时,您可以运行所有先前 OpenGL 版本的代码。顶点数组对象 0 有效,您可以使用固定函数属性、立即模式(glBegin/glEnd 序列)甚至将它们混合在一起。
比较OpenGL 4.6 API Core Profile SpecificationOpenGL 4.6 API Compatibility Profile Specification

所有OpenGL版本的规范可以在Khronos OpenGL registry找到。

【讨论】:

  • 啊啊啊啊,我完全误解了兼容性配置文件的含义。我认为这只是为了检查已弃用的功能是否可用,而不是提供不同的 API 实现。谢谢!
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多