为OpenGL提供C++容器

Giving C++ containers to OpenGL?

本文关键字:容器 C++ 提供 OpenGL      更新时间:2023-10-16

我创建了一个着色器存储缓冲区对象,为顶点着色器提供信息。它绑定到包含单个结构的缓冲区。但是有一个问题。我在这个结构中保存的数据不是一个简单的数组,而是一个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计算的每个元素的大小。