1

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

有更好的方法吗?

4

1 回答 1

4

glm::mat4float出于所有意图和目的,是一个 16 s的数组。不是指向16 个浮点数的指针,而是一个实际float[16]数组。16float秒,一个接一个。

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

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

于 2016-07-27T23:48:55.637 回答