我有与此问题类似的代码: some opengl and glm explanation
我有一个组合矩阵,我作为一个统一的
传递//C++
mat4 combinedMatrix = projection * view * model;
//GLSL doesn't work
out_position = combinedMatrix * vec4(vertex, 1.0);
它不起作用。但是如果我在着色器中进行所有乘法操作,那么我会传入每个单独的矩阵并获得
//GLSL works
out_position = projection * view * model * vec4(vertex, 1.0);
有效。 我在C ++代码中看不出我的矩阵有什么问题。
以下也适用
//C++
mat4 combinedMatrix = projection * view * model;
vec4 p = combinedMatrix * v;
//pass in vertex p as a vec4
//GLSL works
out_position = vertex
答案 0 :(得分:0)
我认为问题可能在于您在代码中进行的矩阵乘法。
如何执行以下乘法?
mat4 combinedMatrix = projection * view * model
在我看来很奇怪,除非我完全错了,否则矩阵乘法不能以这种方式完成。
这是我执行它的方式:
for (i=0; i<4; i++) {
tmp.m[i][0] = (srcA->m[i][0] * srcB->m[0][0]) +
(srcA->m[i][1] * srcB->m[1][0]) +
(srcA->m[i][2] * srcB->m[2][0]) +
(srcA->m[i][3] * srcB->m[3][0]) ;
tmp.m[i][1] = (srcA->m[i][0] * srcB->m[0][1]) +
(srcA->m[i][1] * srcB->m[1][1]) +
(srcA->m[i][2] * srcB->m[2][1]) +
(srcA->m[i][3] * srcB->m[3][1]) ;
tmp.m[i][2] = (srcA->m[i][0] * srcB->m[0][2]) +
(srcA->m[i][1] * srcB->m[1][2]) +
(srcA->m[i][2] * srcB->m[2][2]) +
(srcA->m[i][3] * srcB->m[3][2]) ;
tmp.m[i][3] = (srcA->m[i][0] * srcB->m[0][3]) +
(srcA->m[i][1] * srcB->m[1][3]) +
(srcA->m[i][2] * srcB->m[2][3]) +
(srcA->m[i][3] * srcB->m[3][3]) ;
}
memcpy(result, &tmp, sizeof(PATRIA_Matrix));
可能我错了,但我很确定你应该遵循这条道路。
我看到你的例子,它看起来像一个指针乘法:(虽然我没有你的mat4矩阵类/结构的具体)。