Недавно я начал собирать 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:
Я также не получил ни одной попытки использовать усеченную пирамиду вместо орто и вычислить матрицу вне шейдера.