为OpenGL提供C++容器
Giving C++ containers to OpenGL?
我创建了一个着色器存储缓冲区对象,为顶点着色器提供信息。它绑定到包含单个结构的缓冲区。但是有一个问题。我在这个结构中保存的数据不是一个简单的数组,而是一个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;
但我必须复制eeeee与容器数据对应的指针。
有更好的方法吗?
glm::mat4
是一个由16个float
s组成的数组。不是指向16个浮点值的指针,而是一个实际的float[16]
数组。16个float
,一个接一个。
因此,vector<glm::mat4>
管理元素的连续阵列,其中每个元素是16个浮点。它是您想要存储在缓冲区对象中的数据。所以…就这么做吧。
vector
管理一个连续的数据数组,因此获取指向该数组的指针是完全合法的。这就是vector.data()
的作用。这就是你给glBufferSubData
或其他什么的源指针。大小将是数组中元素的数量(vector.size()
)乘以由sizeof
计算的每个元素的大小。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 用于访问容器<T>数据成员的正确 API
- Eigen如何在容器循环中干净地附加矩阵
- 模板专用化(按容器):value_type
- 关联容器的下界复杂性:成员函数与非成员函数
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- 在STL容器中使用模板类
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 如何将带有自定义对象的容器从C++传递到QML
- 在没有未定义行为的情况下实现类似std::vector的容器
- 将 BASE 派生类存储在同一容器中
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 在C++中迭代 2D 容器的最干净方法
- 将线程中的数据存储到全局容器的最佳方法?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用带有C++对象和标准库容器的插件系统
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 我可以用字符串变量而不是它的名字创建容器吗? C++