我正在寻找一个在x方向有透视投影,在y方向有正交投影的投影矩阵,如图所示,这个存在吗?
我尝试这样做,但没有成功,而且看起来很奇怪。
gl_Position = projection * view * vec4(pos, 1.0);
gl_Position.z = (view * vec4(pos, 1.0)).y;
由于透视投影的工作方式,您想要做的事情无法完全在一个矩阵中完成,并且需要额外的步骤。
此链接解释了在顶点着色器中处理顶点后会发生什么,问题的相关部分是透视划分。顶点着色器的输出是一个 4 维向量,其中齐次 (w) 分量用于所有其他三个分量(x、y 和 z)的透视划分。
通常,为了使这种齐次除法适用于透视投影,投影矩阵看起来有点像这样:
| a 0 b 0 |
| 0 c d 0 |
| 0 0 e f |
| 0 0 -1 0 |
请注意,w 分量设置为(变换后的)模型坐标的(负)z 分量。因此,顶点后处理中的后续同质划分将执行透视划分。
话虽这么说,为了混合透视和正交投影以产生一些极端的变形投影,您基本上会遵循@user253751的建议并使用:
在顶点着色器中执行乘法之后,您可以将
gl_Position
中结果值的 y 分量与其 w 分量相乘,然后将其传递到后处理阶段。
这有效地恢复了后处理阶段仅对 y 坐标进行齐次分割的操作,将其转换为 y 分量的正交投影。