GLM матричное умножение и OpenGL GLSL - PullRequest
1 голос
/ 09 января 2012

У меня похожий код, как в этом вопросе: некоторые объяснения 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

1 Ответ

0 голосов
/ 09 января 2012

Я думаю, что проблема может быть в умножении матриц, которое вы делаете в своем коде.

Как выполняется следующее умножение?

mat4 комбинированныйMatrix = проекция * вид * модель

Мне кажется довольно странным, что умножение матриц не может быть выполнено таким образом, если я полностью не ошибаюсь.

Вот как я это делаю:

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

...