0

16 個の float の配列を持ち、仮想メソッドを持たない C++ クラス Matrix4x4 があります。

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) などで動作するはずだと想定しても安全ですか? 値の配列を揃えて、パディングがないことを確認する必要がありますか?

4

1 に答える 1