将 C++ 容器提供给 OpenGL?

Posted

技术标签:

【中文标题】将 C++ 容器提供给 OpenGL?【英文标题】:Giving C++ containers to OpenGL? 【发布时间】:2016-07-27 22:33:28 【问题描述】:

我创建了一个着色器存储缓冲区对象来为我的顶点着色器提供信息。它绑定到包含单个结构的缓冲区。但有一个问题。我保存在这个结构中的数据不是一个简单的数组,它是一个std::vector

结构如下:

typedef struct 
    glm::mat4 modelMatrix;
 entityInfo;

typedef struct 
    std::vector<entityInfo> entityInfoBuffer;
 shaderData;

mat4 只是一个简单的 4x4 浮点矩阵。

如果我把它交给 OpenGL,传输到 GPU 的数据将只是一堆关于矩阵/向量的指针和信息,而不是其中的数据。

一种解决方案是只为 OpenGL 创建一个结构:

typedef struct 
    float* modelMatrix;
 SSBOentityInfo;

typedef struct 
    SSBOentityInfo* entityInfoBuffer;
 SSBOshaderData;

但我必须复制与容器数据相对应的 eeeeevery 指针。

有没有更好的方法?

【问题讨论】:

您不想将entityInfoBuffer 的内容发送到GPU 吗?您不想将 CPU 指针复制到 GPU,它们对 GPU 没有任何意义(您还不如复制随机数)。 我认为,当使用着色器存储缓冲区对象时,您必须使用 structs 吗?我错了 ?这意味着我必须将 entityInfoBuffer.data() 设置为 SSBOshaderData entityInfoBuffer ?此外,OpenGL 将只能读取&amp;mat4[0][0] @Talesseed: "你必须使用结构体?" 为什么?数据就是数据,内存就是内存,缓冲区对象就是缓冲区对象。 是的,我的错……我只是想使用结构来添加我之后可能需要的元素。 【参考方案1】:

glm::mat4 是一个包含 16 个floats 的数组。不是指向 16 个浮点数的 指针,而是一个实际的 float[16] 数组。 16 floats,一个接一个。

因此,vector&lt;glm::mat4&gt; 管理一个连续的元素数组,其中每个元素是 16 个浮点数。这是您想要存储在缓冲区对象中的数据。所以……就那样做吧。

vector 管理一个连续的数据数组,因此获取指向该数组的指针是完全合法的。这就是vector.data() 的用途。这就是你给glBufferSubData 或其他什么的源指针。大小将是数组中元素的数量 (vector.size()) 乘以 sizeof 计算的每个元素的大小。

【讨论】:

谢谢,虽然 mat4 不是数组。但是,如果我想在以后使用结构来添加元素,我该怎么办? @Talesseed:不清楚你的意思是什么,但我很确定这与你在这里提出的问题不同。 我想向 shaderData 添加更多成员。但是,是的,我认为这是另一个问题。 对于 typedef,第二个 awnser 解释说缺少 typedef 会导致错误 (***.com/questions/612328/…) @Talesseed:这就是 namespaces 的用途。此外,这是一个非常罕见的错误,以至于大多数专门的 C++ 程序员甚至都不知道它的可能性。

以上是关于将 C++ 容器提供给 OpenGL?的主要内容,如果未能解决你的问题,请参考以下文章

RGBA 整数值到 OpenGL 纹理

将 C# 数组传递给 C++ 向量

使用 OpenGL C++ 渲染到纹理

为啥 C++ STL 不提供一组线程安全的容器? [复制]

qt提供的容器接口与c++标准容器接口是一样的吗

C++ STL容器适配器 内容详解