一般我们直接撸 shader 代码的话,直接拿:深度缓存/纹理的值 减去 片段的值来做过度 即可,这部分代码,以前在做水体、软粒子的shader 也有使用到:
核心的计算 fade 值在这
float fade = saturate(_InvFade * (LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))) - i.projPos.z));
然后今天有位美术同学问我关于 shader graph 上实现 软粒子 效果
然后他在网上找了一个 shader graph 软粒子的连连看:ShaderGraph第13节_软粒子
但是其中的一些用法他不太明白 shader graph 怎么回事
经过一番细心教导,就好了
其中 Screen Position.w 我就不知道是个啥
然后发现这个 Screen Position 的 .w 分量来和 深度的 ViewSpace Z 来差值
从坐标系来分析,Screen Position 的 .w 该值就是 ViewSpace 片段的 Z 值
再配合 该节点的官方文档描述:
OK,从描述上看,Raw 模式下的 Screen Position.w
是一个 ClipSpace Position.w
未经过透视除法
未经过透视除法 的 ClipSpace Position.w
就是 -ViewSpaceZ
,根据我之前总结的 OpenGL 下的坐标变换:OpenGL Transformation 几何变换的顺序概要(MVP,NDC,Window坐标变换过程),可得知:该值就是 -ViewSpaceZ
(注意是个负值,为了方便表示 数值的增长方向是:近小远大的值(注意我说的不是透视近大远小))
那么根据这个想法,我们可以将 shader graph 中的 Screen Position. w
替换成:-Fragment View Space Position.z
,看看结果如何:
OK,结果是一摸一样的