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

問題は、コードで行う行列の乗算にあると思います。

次の乗算はどのように実行されますか?

mat4CombinedMatrix=プロジェクション*ビュー*モデル

私にはかなり奇妙に見えます。私が完全に間違っていない限り、この方法で行列の乗算を行うことはできません。

これは私がそれを実行する方法です:

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行列クラス/構造体の詳細を持っていませんが)。

于 2012-01-09T13:57:16.623 に答える