2d数组是否适用于glUniformMatrix4fv,C++?

den*_*niz 2 c++ opengl glsl

我有一个4x4矩阵类,它将值保存为2d float array:float mat [4] [4]; 我重载了[]运算符

inline float *Matrix4::operator[](int row) { return mat[row]; }

我的着色器中有一个统一的mat4(统一的mat4 Bones [64];),我将上传我的数据.我将骨骼保存为Matrix4指针(Matrix4*finalBones),这是一个包含numJoints元素的矩阵数组.这就是我用来上传数据的方法:

glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalBones[0][0]);
Run Code Online (Sandbox Code Playgroud)

我完全不确定将要发生什么,所以我需要问,如果这将起作用或我需要将所有内容提取到16*numJoints大小的浮点数组中,这对于每个tick来说似乎都很昂贵.

编辑这就是我所做的,每次绘制操作看起来都很贵

void MD5Loader::uploadToGPU()
{
float* finalmat=new float[16*numJoints];
for (int i=0; i < numJoints; i++)
    for (int j=0; j < 4; j++)
        for(int k=0; k < 4; k++)
            finalmat[16*i + j*4 + k] = finalBones[i][j][k];


glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalmat);

delete[] finalmat;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

这取决于两件事.假设您的编译器是C++ 03,(并且您关心标准符合性),那么您的Matrix类必须是POD类型.特别是它必须没有构造函数.C++ 11 显着放宽了这些规则.

另一件事是你的矩阵似乎是行主要的.我这样说是因为你operator[]似乎认为你的2D数组是行主要的.第一个坐标是row而不是列,因此它是行主要存储顺序.

如果你打算给OpenGL行主矩阵,你需要告诉它它们是行主要的:

glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,GL_TRUE,finalBones [0] [0]);

  • @deniz:首先,这是一个新问题.如果您有新问题,请提出新问题.其次,你应该使用`std :: vector <GLfloat>`,而不是数组.第三,也是最重要的......*你为什么这样做*?我*刚刚告诉你*如何给出行主要的OpenGL矩阵.最后,停止传递C++`true`和`false`以获取`GLboolean`值`GL_TRUE`和`GL_FALSE`. (4认同)