admin管理员组

文章数量:1611919

一般我们直接撸 shader 代码的话,直接拿:深度缓存/纹理的值 减去 片段的值来做过度 即可,这部分代码,以前在做水体、软粒子的shader 也有使用到:

  • Unity Shader - BRP - Soft Particle - 软粒子
  • Unity 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,结果是一摸一样的

本文标签: 粒子分量GraphShaderUnity