确保c ++中的OpenGL兼容类型

时间:2014-09-03 18:29:39

标签: c++ opengl

OpenGL缓冲区对象支持明确定义宽度的各种数据类型(GL_FLOAT为32位,GL_HALF_FLOAT为16位,GL_INT为32位...)

如何确保OpenGL的跨平台和未来类型? 例如,将来自c ++数组的float数据提供给缓冲区对象并将其类型称为GL_FLOAT将不适用于float不是32位的平台。

1 个答案:

答案 0 :(得分:5)

在对此进行一些研究时,我注意到GL规范中如何定义这些类型的细微但有趣的变化。 OpenGL 4.1和4.2之间发生了变化。

直到OpenGL 4.1,列出数据类型的表(最近的规范文档中的表2.2)对于size列具有标题 Minimum Bit Width ,表格标题显示(强调添加由我):

  

GL类型不是C类型。因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int。实现可以使用比表中指示的数字更多的位来表示GL类型。但是,不需要对最小范围之外的整数值进行正确解释。

从OpenGL 4.2规范开始,表格标题更改为位宽,表格标题更改为:

  

GL类型不是C类型。因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int。实现必须精确使用表中指示的位数来表示GL类型。

这影响了问题的答案。如果使用最新的定义,则可以在代码中使用标准大小的类型定义而不是GL类型,并安全地假设它们匹配。例如,您可以使用int32_t中的<cstdint>代替GLint

使用GL类型仍然是最直接的解决方案。但是,根据您的代码体系结构和首选项,可能不合需要。如果您希望将软件划分为组件,并希望在提供一定级别的抽象的同时将OpenGL渲染隔离在单个组件中,那么您可能不希望在代码中使用GL类型。然而,一旦数据到达渲染代码,它必须匹配相应的GL类型。

作为一个典型的例子,假设你有计算代码来生成你想要渲染的数据。您可能不希望在计算代码中都有GLfloat种类型,因为它可以独立于OpenGL使用。然而,一旦您准备好显示计算结果,并希望将数据放入VBO以进行OpenGL渲染,则类型必须与GLfloat相同。

您可以使用各种方法。一个是我在上面提到的,使用非渲染代码中标准C ++头文件的大小类型。同样,您可以定义自己的typedef,它们与OpenGL使用的类型相匹配。或者,由于性能原因不太理想,您可以根据需要转换数据,可能基于比较传入类型和GL类型之间的sizeof()值。

相关问题