c++ - 对于复合数据类型使用 glClearBufferData 是否可移植?
问题描述
我有一个缓冲区(既用作 SSBO 又用作 VBO),其中包含交错浮点数和无符号整数的复合数据类型:
struct VertexData
{
struct
{
float x;
float y;
float z;
} position;
struct
{
float u;
float v;
} tex_coords;
GLuint entity_id;
};
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexData) * buffer_maxSize, nullptr, GL_DYNAMIC_DRAW);
当我清除缓冲区时,我使用以下函数:
glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED, GL_UNSIGNED_INT, nullptr);
它可以工作,但由于格式 GL_R32UI
与数据的实际类型( )不匹配VertexData
,我担心代码可能无法在每台机器/驱动程序上运行。
如果代码不可移植,我应该使用什么正确的功能?
顺便说一句,我应该在 VertexData 中使用 GL_FLOAT 以获得更好的可移植性吗?
解决方案
缓冲区对象没有“数据的实际类型”。它们包含字节;而已。缓冲区的使用赋予了它存储的字节含义,而这些字节具有特定用法所说的含义。即便如此,它仅在以特定方式使用缓冲区数据时才具有此意义。
您的 clear 调用将缓冲区的所有字节设置为 0。如果您将该缓冲区用作顶点数据的源,并且特定属性的类型为GL_FLOAT
,则为该属性读取的字节将被解释为存储 IEEE-754 32 -bit 浮点值,与 CPU 提供其等效类型的字节顺序相同。IEEE-754 定义了一个 0 字节的序列具有一个明确定义的值(即正零),因此这将具有明确定义的行为。
推荐阅读
- forms - SpeechSynthesizer 如何让声音更人性化
- javascript - 如何引用在 IF 语句中被点击的元素
- android - 即使应用程序没有运行,Android也会在解锁屏幕后自动运行应用程序
- perl - 从“使用”命令中消除用户名
- php - Django postgres 数据库未与 Lumen 连接
- javascript - jQuery在追加后选择可见元素
- blazor - BL0005 - 外部参数使用 - 为什么会出现警告?
- python - 如何在 Mac 上让笔记本转换命令支持汉字?我愿意为 jupyter notebook 贡献一些代码
- javascript - 如何使用数据表中的 columnef 函数在两个数据表列上禁用 xeditable?
- javascript - Vue Router 总是重新加载浏览器 - 失去 vuex-state