OpenGL 缓冲区对象支持各种明确定义宽度的数据类型(GL_FLOAT
是32位的,GL_HALF_FLOAT
是16位的,GL_INT
是 32 位...)
如何确保 OpenGL 的跨平台和面向未来的类型?
例如,喂食float
数据从 C++ 数组到缓冲区对象,并表示其类型是GL_FLOAT
不适用于以下平台:float
不是 32 位的。
在对此进行一些研究时,我注意到 GL 规范中这些类型的定义方式发生了微妙但有趣的变化。变化发生在 OpenGL 4.1 和 4.2 之间。
到 OpenGL 4.1,列出数据类型的表(最近规范文档中的表 2.2)具有标题最小位宽对于尺寸列,表格标题显示(重点是我添加的):
GL 类型不是 C 类型。因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int。一个实现可能会使用更多位比表中所示的数字代表 GL 类型。然而,不需要正确解释最小范围之外的整数值。
从 OpenGL 4.2 规范开始,表头更改为位宽,以及表格标题:
GL 类型不是 C 类型。因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int。一个实现必须准确使用位数表中所示代表 GL 类型。
这影响了问题的答案。如果您使用最新的定义,则可以在代码中使用标准大小的类型定义而不是 GL 类型,并安全地假设它们匹配。例如,您可以使用int32_t
from <cstdint>
代替GLint
.
使用 GL 类型仍然是最直接的解决方案。不过,根据您的代码架构和偏好,这可能是不可取的。如果您喜欢将软件划分为组件,并且希望将 OpenGL 渲染隔离在单个组件中,同时提供一定程度的抽象,那么您可能不希望在整个代码中使用 GL 类型。然而,一旦数据到达渲染代码,它就必须匹配相应的 GL 类型。
作为一个典型的例子,假设您有计算代码来生成您想要渲染的数据。你可能不想拥有GLfloat
类型遍布您的计算代码,因为它可以独立于 OpenGL 使用。然而,一旦您准备好显示计算结果,并希望将数据放入 VBO 中进行 OpenGL 渲染,类型必须与GLfloat
.
您可以使用多种方法。一是我上面提到的,在非渲染代码中使用标准 C++ 头文件中的大小类型。同样,您可以定义自己的 typedef 来匹配 OpenGL 使用的类型。或者,由于性能原因不太理想,您可以在必要时转换数据,可能基于比较sizeof()
传入类型和 GL 类型之间的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)