首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保OpenGL在c++中兼容类型

确保OpenGL在c++中兼容类型
EN

Stack Overflow用户
提问于 2014-09-03 18:29:38
回答 1查看 308关注 0票数 4

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

如何确保OpenGL的跨平台和防未来类型?例如,将float数据从一个c++数组输入到一个缓冲区对象,并说它的类型是GL_FLOAT,在float不是32位的平台上不能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-04 06:02:03

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

直到OpenGL 4.1,列出数据类型的表(最近的规范文档中的表2.2 )对于size列有标题最小位宽,表的标题是(我添加的强调):

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

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

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

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

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

作为一个典型的例子,假设您有生成要呈现的数据的计算代码。您可能不希望在计算代码中都包含GLfloat类型,因为它可以独立于OpenGL使用。但是,一旦您准备好显示计算结果,并希望将数据放入用于OpenGL呈现的VBO中,则类型必须与GLfloat相同。

您可以使用多种方法。其中之一是我前面提到的,在非呈现代码中使用来自标准C++头文件的大小类型。类似地,您可以定义与OpenGL使用的类型匹配的自己的类型。或者,出于性能原因,您可以在必要时转换数据,可能是基于比较传入类型和GL类型之间的sizeof()值。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25651241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档