C ++ GLSL数据对齐/填充

时间:2013-11-06 23:05:58

标签: c++ opengl alignment glsl padding

我有一个C ++类Matrix4x4,它有一个包含16个浮点数的数组,没有虚拟方法:

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);
};

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

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

显然假设Matrix4x4对象只占用16浮点值的内存而没有对齐或填充问题。它使用MSVC工作正常,可以安全地假设它应该在其他平台(Linux,OSX,Android将来)e.t.c上工作吗?我应该对齐数值数组并确保没有填充吗?

1 个答案:

答案 0 :(得分:1)

向标头添加静态断言至少可以防止填充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