gpt4 book ai didi

C++ GLSL 数据对齐/填充

转载 作者:行者123 更新时间:2023-11-28 07:18:49 24 4
gpt4 key购买 nike

我有一个 C++ 类 Matrix4x4,它有一个由 16 个 float 组成的数组,没有虚方法:

class Matrix4x4
{
public:
float values[16];

Matrix4x4();
Matrix4x4(float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7, float v8, float v9, float v10, float v11, float v12, float v13, float v14, float v15);
Matrix4x4(const Quaternion &quat, const Vector3 &pos);
void convertToQuatPos(Quaternion &quat, Vector3 &pos);
void loadIdentity();
void setValues(float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7, float v8, float v9, float v10, float v11, float v12, float v13, float v14, float v15);
void setPerspective(float fov, float aspect, float nearPlane, float farPlane);
void setOrthographic(float top, float left, float bottom, float right, float nearPlane, float farPlane);
...

static void multiply3x3(const Matrix4x4 &m1, const Matrix4x4 &m2, Matrix4x4 &result);
static void multiply4x4(const Matrix4x4 &m1, const Matrix4x4 &m2, Matrix4x4 &result);
...

Matrix4x4 operator*(const Matrix4x4 &a);
Vector3 operator*(const Vector3 &a);
Vector4 operator*(const Vector4 &a);
};

我像这样将这些矩阵的 vector 传递给 GLSL(其中骨骼是 Matrix4x4 的 std::vector):

glUniformMatrix4fv(glGetUniformLocation(shader->getProgram(), "boneMatrices"), bones.size(), false, (GLfloat*) &bones[0].values[0]);

这显然假设一个 Matrix4x4 对象将只占用 16 个 float 的内存,没有对齐或填充问题。它使用 MSVC 工作正常,是否可以安全地假设它应该在其他平台( future 的 Linux、OSX、Android)等平台上工作?我应该对齐值数组并确保没有填充吗?

最佳答案

向 header 添加静态断言至少可以防止(非常不可能)填充 Matrix4x4 数组的元素的可能性:

#include <type_traits>
...

static_assert(
(sizeof(Matrix4x4) == (sizeof(GLfloat) * 16) &&
std::is_standard_layout<Matrix4x4>::value),

"Matrix4x4 does not satisfy contiguous storage requirements");

参见:std::is_standard_layout

关于C++ GLSL 数据对齐/填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19824733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com