使用glClearBufferData作为复合数据类型是否可移植?

时间:2019-03-13 18:18:17

标签: c++ opengl

我有一个缓冲区(同时用作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);

它可以工作,但是由于 format GL_R32UI与数据的实际类型(VertexData)不匹配,因此我担心代码可能无法工作在每台机器/驱动程序上。

在代码不可移植的情况下,我应该使用什么正确的功能?


顺便说一句,我应该在VertexData中使用GL_FLOAT以获得更好的可移植性吗?

1 个答案:

答案 0 :(得分:3)

缓冲区对象没有“数据的实际类型”。它们包含字节;而已。缓冲区的用法给出了它存储的字节的含义,而这些字节的含义是特定用法表明它们具有的含义。即便如此,它只有在以这种特定方式使用缓冲区的数据时才具有这种含义。

您的clear调用将缓冲区的所有字节设置为0。如果您将该缓冲区用作顶点数据的源,并且特定属性的类型为myFile = open("gameofthrones.txt", "r") words = [] for line in myFile: print(add_unique(line, words)) myFile.close() print("Unique words in my file are: ") for word in words: print(word) ,则为该属性读取的字节将为解释为以与CPU提供其等效类型相同的字节顺序存储IEEE-754 32位浮点值。 IEEE-754定义0字节的序列具有明确定义的值(即正零),因此将具有明确定义的行为。