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

标签 c++ opengl

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

相关文章:

c++ - 当结构具有默认构造函数时,为什么我的 C++ 程序在 Release模式下崩溃?

c++ - SDL_GL_CreateContext() 不工作

opengl - 怎么做对应2D-3D点

c++ - 了解 GLSL 统一缓冲区 block 对齐

c++ - 如何正确定义析构函数

c++ - '*(myCache + ((long unsigned int)(((long unsigned int)i) * 32ul))) 中的 ‘operator=’ 不匹配

c++ - 在类成员的实例化期间: "no operator "[ ]"matches these operands"使用 map[key] 访问 std::map 值时

c++ - 获取 Windows ID C++

java - 为什么当我要求 30 FPS 时,这段代码有时会报告 21.3 FPS?

c++ - 如何在顶点着色器中使用 VBO 数据作为位置数据,在片段着色器中使用统一数据作为颜色数据