Проблемы с матрицей вращения оси Z в шейдере glsl

Недавно я начал собирать 2D-конвейер OpenGL ES 1.1 / 2.0 с нуля (только для iPhone). Этот конвейер предназначен для использования инженерами, не имеющими опыта трехмерной математики.

Закомментированы матрицы вращения осей X и Y, которые дают точные результаты, которые должны. Матрица вращения Z, кажется, ничего не делает.

VERTEX SHADER

//THESE WORK
/*
highp mat4 rotationMatrix = mat4(1.0, 0.0, 0.0, 0.0,
                                 0.0, cos(angle), -sin(angle), 0.0,
                                 0.0, sin(angle), cos(angle), 0.0,
                                 0.0, 0.0, 0.0, 1.0); 

highp mat4 rotationMatrix = mat4(cos(angle), 0.0, sin(angle), 0.0,
                                 0.0, 1.0, 0.0, 0.0,
                                 -sin(angle), 0.0, cos(angle), 0.0,
                                 0.0, 0.0, 0.0, 1.0); 
*/

//THIS DOESN'T WORK >:(
highp mat4 rotationMatrix = mat4(cos(angle), -sin(angle), 0.0, 0.0,
                                     sin(angle), cos(angle), 0.0, 0.0,
                                     0.0, 0.0, 1.0, 0.0,
                                     0.0, 0.0, 0.0, 1.0);  

gl_Position = a_position;
gl_Position *= rotationMatrix;

Поскольку это будет для 2D-рендеринга и передано инженерам без опыта работы с 3D, я бы предпочел не передавать матрицу MVP и просто использовать базовые переменные масштабирования, вращения и трансляции (и пропустить запись библиотеки частичной матрицы в 10-й раз. ).

Прошло много времени с тех пор, как я запутался в математике матриц и шейдерах, так что надеюсь, что это небольшая ошибка.

Спасибо за вашу помощь!

ИЗМЕНИТЬ / ОБНОВИТЬ:

Я обнаружил, что проход постобработки сбивает угол.

Теперь я обнаружил, что вращение по оси Z, кажется, масштабирует четырехугольник. Я помню, что это была проблема n00b, и изучаю ее ...

Забыл упомянуть, что у меня есть дешевая матрица для временных проекций.

//s_scalefactor is for retina vs non-retina display

highp mat4 projectionMatrix = mat4( 2.0/(320.0 * s_scalefactor), 0.0, 0.0, -1.0,
                                    0.0, 2.0/(480.0 * s_scalefactor), 0.0, -1.0,
                                    0.0, 0.0, 1.0, 0.0,
                                    0.0, 0.0, 0.0, 1.0);  

gl_Position *= projectionMatrix;

Это дешевый прием, но я не уверен, что он затруднит вращение по оси Z.

РЕДАКТИРОВАТЬ № 2:

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


person Richard Slamson    schedule 23.06.2011    source источник
comment
Итак ... это решено? В чем вопрос?   -  person Nicol Bolas    schedule 24.06.2011


Ответы (1)


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

mat4 rotateZ;
rotateZ[0].x    = cosAngle;
rotateZ[0].y    = negSinAngle;
rotateZ[0].z    = 0.0;
rotateZ[0].w    = 0.0;
rotateZ[1].x    = sinAngle;
rotateZ[1].y    = cosAngle;
rotateZ[1].z    = 0.0;
rotateZ[1].w    = 0.0;
rotateZ[2].x    = 0.0;
rotateZ[2].y    = 0.0;
rotateZ[2].z    = 1.0;
rotateZ[2].w    = 0.0;
rotateZ[3].x    = 0.0;
rotateZ[3].y    = 0.0;
rotateZ[3].z    = 0.0;
rotateZ[3].w    = 1.0;
person user1072094    schedule 29.11.2011