我最近开始从头开始组装一个 OpenGL ES 1.1/2.0 2D 管道(仅限 iPhone)。此管道旨在供没有 3D 数学经验的工程师使用。
注释掉的是 X 和 Y 轴旋转矩阵,它们产生了它们应该得到的确切结果。Z 旋转矩阵似乎什么都不做。
顶点着色器
//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:
我也无处可去尝试使用截锥体而不是正交并计算着色器之外的矩阵。