https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/projection-matrix-GPU-rendering-pipeline-clipping
unity里的有个computeScreenPos的实现
float4 ComputeScreenPos(float4 positionCS)
{
float4 o = positionCS * 0.5f;
o.xy = float2(o.x, o.y * _ProjectionParams.x) + o.w;
o.zw = positionCS.zw;
return o;
}
很疑惑,为啥o.xy是这样去构造的呢??
我们先看张图
原来”投影“是为了更好的裁剪
然后这里https://zhuanlan.zhihu.com/p/404516361
说了为啥要这样去构造
是为了在最后做透视除法,那么这个W是啥呢?
可以看看这个视频
https://www.youtube.com/watch?v=VpNJbvZhNCQ&t=173s
x’ = d * x / z, w = -z / d
深度空间的构造?
http://www.humus.name/temp/Linearize%20depth.txt
更深入
可以看看《shader入门精要》第4章 4.6.7 那里说的很详细
为啥是-z
https://stackoverflow.com/questions/33407209/why-does-the-camera-face-the-negative-end-of-the-z-axis-by-default
有说到因为opengl是右手坐标系
我猜测,为了统一Opengl和DX,unity先把他搞到opengl-like然后再做统一处理?
View space to Clip Space
以下图片来自 shader入门精要
unity 的矩阵
注意看Z