Проблемы с матрицей вращения оси Z в шейдере GLSL - PullRequest
2 голосов
/ 23 июня 2011

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

Закомментированы матрицы вращения по осям 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 и просто нажать базовые переменные масштаба, поворота и перевода (и пропустить написание частичной матрицы lib в 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:

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

1 Ответ

1 голос
/ 29 ноября 2011

У меня была такая же проблема, и это было очень, очень странно. Я смог решить ее, заполнив структуру 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...