GLM矩阵乘法和OpenGL GLSL

时间:2012-01-09 11:15:03

标签: opengl matrix glsl glm-math

我有与此问题类似的代码: 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

1 个答案:

答案 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矩阵类/结构的具体)。