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

标签 c++ opengl

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

如何确保 OpenGL 的跨平台和面向 future 的类型? 例如,将 float 数据从 c++ 数组提供给缓冲区对象并声明其类型为 GL_FLOATfloat 不是的平台上将不起作用不是 32 位。

最佳答案

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

直到 OpenGL 4.1,列出数据类型的表(最近的规范文档中的表 2.2)的大小列标题为 Minimum Bit Width,并且表标题显示(强调已添加)由我):

GL types are not C types. Thus, for example, GL type int is referred to as GLint outside this document, and is not necessarily equivalent to the C type int. An implementation may use more bits than the number indicated in the table to represent a GL type. Correct interpretation of integer values outside the minimum range is not required, however.

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

GL types are not C types. Thus, for example, GL type int is referred to as GLint outside this document, and is not necessarily equivalent to the C type int. An implementation must use exactly the number of bits indicated in the table to represent a GL type.

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

使用 GL 类型仍然是最直接的解决方案。不过,根据您的代码架构和偏好,它可能并不理想。如果您喜欢将您的软件分成多个组件,并希望在提供一定程度的抽象的同时将 OpenGL 渲染隔离在单个组件中,您可能不希望在您的代码中使用 GL 类型。然而,一旦数据到达渲染代码,它就必须匹配相应的 GL 类型。

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

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

关于c++ - 确保 C++ 中的 OpenGL 兼容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651241/

相关文章:

c++ - 如何将两个负数数组合并为一个数组?

c++ - 使用数组类型初始化 AS 3.0 vector - Vector.<Array>? (加上 C++ 等价物)

c++ - OpenGL + Kinect SDK - 如何从单个像素获取深度值?

c++ - 带 openGL glRecti 的棋盘格

c++ - C++模板模式可以取代不断增长的 union 吗?

c++ - #define 指令有多个替换?

c++ - 在 C++ 中解析 .dat 文件

java - opengl : loading array types to uniform buffer objects

c - cmake 灯丝渲染项目时出错

c++ - 从文件加载后,顶点着色器和片段着色器均未编译