首页 > 解决方案 > 对于复合数据类型使用 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 以获得更好的可移植性吗?

标签: c++opengl

解决方案


缓冲区对象没有“数据的实际类型”。它们包含字节;而已。缓冲区的使用赋予了它存储的字节含义,而这些字节具有特定用法所说的含义。即便如此,它仅在以特定方式使用缓冲区数据时才具有此意义。

您的 clear 调用将缓冲区的所有字节设置为 0。如果您将该缓冲区用作顶点数据的源,并且特定属性的类型为GL_FLOAT,则为该属性读取的字节将被解释为存储 IEEE-754 32 -bit 浮点值,与 CPU 提供其等效类型的字节顺序相同。IEEE-754 定义了一个 0 字节的序列具有一个明确定义的值(即正零),因此这将具有明确定义的行为。


推荐阅读