将 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 将只能读取&mat4[0][0]
。
@Talesseed: "你必须使用结构体?" 为什么?数据就是数据,内存就是内存,缓冲区对象就是缓冲区对象。
是的,我的错……我只是想使用结构来添加我之后可能需要的元素。
【参考方案1】:
glm::mat4
是一个包含 16 个float
s 的数组。不是指向 16 个浮点数的 指针,而是一个实际的 float[16]
数组。 16 float
s,一个接一个。
因此,vector<glm::mat4>
管理一个连续的元素数组,其中每个元素是 16 个浮点数。这是您想要存储在缓冲区对象中的数据。所以……就那样做吧。
vector
管理一个连续的数据数组,因此获取指向该数组的指针是完全合法的。这就是vector.data()
的用途。这就是你给glBufferSubData
或其他什么的源指针。大小将是数组中元素的数量 (vector.size()
) 乘以 sizeof
计算的每个元素的大小。
【讨论】:
谢谢,虽然 mat4 不是数组。但是,如果我想在以后使用结构来添加元素,我该怎么办? @Talesseed:不清楚你的意思是什么,但我很确定这与你在这里提出的问题不同。 我想向 shaderData 添加更多成员。但是,是的,我认为这是另一个问题。 对于 typedef,第二个 awnser 解释说缺少 typedef 会导致错误 (***.com/questions/612328/…) @Talesseed:这就是 namespaces 的用途。此外,这是一个非常罕见的错误,以至于大多数专门的 C++ 程序员甚至都不知道它的可能性。以上是关于将 C++ 容器提供给 OpenGL?的主要内容,如果未能解决你的问题,请参考以下文章