1

我有与这个问题类似的代码: 一些opengl和glm解释

我有一个组合矩阵,我将其作为单个制服传递

//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
4

1 回答 1

0

我认为问题可能出在您在代码中执行的矩阵乘法中。

下面的乘法是如何进行的?

mat4 组合矩阵 = 投影 * 视图 * 模型

在我看来很奇怪,除非我完全错了,否则不能以这种方式进行矩阵乘法。

这是我执行它的方式:

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

可能我错了,但我很确定你应该遵循这个路径。

The way I see your example it looks to me a pointer multiplication :( (though I don't have the specific of your mat4 matrix class/struct).

于 2012-01-09T13:57:16.623 回答