Shader学习:部分参数和方法学习记录

好记性不如烂笔头,有关shader的资料很少,所以在查阅各种资料和自己测试之后记录下结果以免忘记。

1.
一般顶点着色器中总是通过mul(UNITY_MATRIX_MVP, v.vertex),将模型的顶点坐标乘以投影矩阵来得到裁剪空间下的坐标,unity5.6里可以使用UnityObjectToClipPos(v.vertex),意义等价于前面的那个方法。这个坐标取名pos,经过插值后在片元着色器内pos.xy的取值范围便是屏幕的实际分辨率。如果分辨率为400×300,则x范围为[0.5, 400.5],y范围为(0.5, 300.5)(看到资料介绍OpenGL和DirextX 10以后的版本里认为像素中心对应的是浮点值中的0.5)。z的范围为[0, 1](非线性变化,因为投影矩阵的关系),在摄像机近裁剪屏幕处为0,远裁剪屏幕处为1。w如果在正交投影下则为1,在透视投影下为[1 / Near, 1 / Far]。(Near和Far分别为摄像机近裁剪屏幕值和远裁剪屏幕值)

2.
在顶点着色器中使用ComputeScreenPos来得到屏幕坐标srcPos。其中srcPos.x为clipx / 2 + clipw / 2,srcPos.y为clipy / 2 + clipw / 2,范围分别在[0, Near]和[0, Far]之间。z为clipz,范围为[-Near, Far]。w为clipw,范围为[Near, Far]。(clip值为裁剪空间下的坐标值)

3.
float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.srcPos.xy / i.srcPos.w)用来取屏幕深度,该值的范围和i.pos.z一样,都是非线性。可以使用Linear01Depth(d)得到线性变化的深度,范围亦为[0, 1]。(i.pos和i.srcPos即上文提到的pos和srcPos)