2012-01-09 170 views
0

我有类似的代码作为这样一个问题: some opengl and glm explanationGLM矩阵乘法和OpenGL GLSL

我有通过作为单个统一

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

你已经发布的代码看起来是正确的?你确定这个问题不在其他地方吗?就像你使用的是错误的统一位置或什么东西? – 2012-01-09 19:26:01

+1

我看不到任何错误信息 – CodeMonkey 2012-01-09 20:33:11

+2

Matthew非常感谢你!!!我是个白痴!因为这个示例代码是错误的,我必须调用glUniforms来更新我的数据,所有这些我都会像处理Vertex Arrays(在init代码中设置em一样)来处理它们,但是当我转换它们时,我的矩阵需要更新。 – CodeMonkey 2012-01-09 20:51:17

回答

0

我想问题可能是你在你的代码做矩阵乘法。

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

MAT4 combinedMatrix =投影*视*模型

在我看来很奇怪,矩阵乘法不能以这种方式,除非我是完全错误的完成。

这是我执行的方式:

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

+3

他使用的是GLM数学库,它提供了一个覆盖'*'运算符的'mat4'类。 – 2012-01-09 16:36:01

+0

对不起,你是完全正确的,我的坏。我对这个图书馆没有很好的了解。我的错,道歉。 – 2012-01-11 18:06:25