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