将 C++ 容器提供给 OpenGL?

Giving C++ containers to OpenGL?

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

结构如下:

typedef struct {
    glm::mat4 modelMatrix;
} entityInfo;

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

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

如果我将其提供给 OpenGL,传输到 GPU 的数据将只是一堆关于 matrix/vector 的指针和信息,而不是其中的数据。

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

typedef struct {
    float* modelMatrix;
} SSBOentityInfo;

typedef struct {
    SSBOentityInfo* entityInfoBuffer;
} SSBOshaderData;

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

有更好的方法吗?

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

因此,vector<glm::mat4> 管理一个连续的元素数组,其中每个元素是 16 个浮点数。这是您要存储在缓冲区对象中的数据。所以... 那样做。

vector 管理着一个连续的数据数组,所以得到一个指向这个数组的指针是完全合法的。这就是 vector.data() 的用途。这就是您提供给 glBufferSubData 或其他任何内容的源指针。大小将是数组中元素的数量 (vector.size()) 乘以由 sizeof.

计算的每个元素的大小