C++ 对于复合数据类型使用glClearBufferData是否可移植?

C++ 对于复合数据类型使用glClearBufferData是否可移植?,c++,opengl,C++,Opengl,我有一个缓冲区(用作SSBO和VBO),它包含一个复合数据类型,交错浮点和无符号整数: struct VertexData { struct { float x; float y; float z; } position; struct { float u; float v; } tex_coords; GLuint entity_id; };

我有一个缓冲区(用作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来提高可移植性吗?

缓冲区对象并没有“实际的数据类型”。它们包含字节;就这样。缓冲区的使用赋予它存储的字节含义,而这些字节具有特定用法所表示的含义。即使如此,它也只有在以这种特定方式使用缓冲区数据时才具有这种意义

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