我有一个缓冲区(同时用作 SSBO 和 VBO),其中包含交错 float 和无符号整数的复合数据类型:
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 以获得更好的可移植性吗?
最佳答案
缓冲区对象没有“数据的实际类型”。它们包含字节;就是这样。正是缓冲区的使用赋予它存储的字节以意义,而这些字节具有特定用法所说的含义。即便如此,它仅在以特定方式使用缓冲区数据时才具有该含义。
您的清除调用将缓冲区的所有字节设置为 0。如果您将该缓冲区用作顶点数据的来源,并且特定属性的类型是 GL_FLOAT
,则读取的字节属性将被解释为存储 IEEE-754 32 位浮点值,字节顺序与 CPU 提供的等效类型相同。 IEEE-754 定义 0 字节序列具有明确定义的值(即正零),因此这将具有明确定义的行为。
关于c++ - 对于复合数据类型使用 glClearBufferData 是否可移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55148786/