解答UnityShader学习过程中的一些疑惑(持续更新中)
一、坐标系相关
shader中会有几种空间:
模型空间:以物体自己为中心原点
世界空间:就是unity的世界坐标
观察空间(视图空间):以相机为中心的坐标系
裁剪空间:是一个4d空间,有x,y,z,w分量,x,y,z的范围,都是要在-w到w之间,否则会被裁剪。远处的物体的w值更大,靠近摄像机的w值更小.
NDC空间(归一化设备空间):这个是一个三维空间,有x,y,z分量。在对裁剪空间的x,y,z分别除以w,得到一个[-1,1]之间的坐标范围,这个归一化坐标就是NDC坐标
为什么要有这个w值呢?我们需要实现透视效果,即近大远小,实现的逻辑是将x,y,z分别除以w,在得到NDC空间
因为靠近相机的坐标w值更小,除以w后更大,坐标之间的差距越大,绘制出来的图像看起来越大;
而远离摄像机的坐标w值更大,除以w后更小,坐标之间的差距越小,也就是汇聚于一点,这就使得物体看起来近大远小
二、坐标系在shader中的变化
在顶点着色器vert中,使用的是模型空间,在传入片元着色器之前,必须要先将这个模型坐标转换成裁剪空间下的坐标
这个转换过程是必须的,那么还要自己写转换,而不是shader自动做转换呢?因为我们可能会实现一些自定义效果,比如水面的波纹等效果
总结下坐标空间的通常用法如下:
模型空间:进入顶点着色器时传入的顶点坐标
世界空间:光照的坐标、光照的法线
裁剪空间:进入片元着色器时传入的坐标