← ALL ARTICLES
VFX与模拟2 MIN READ

软粒子

全库目录221
本文目录6

烟片穿过墙面会出现一条硬线,因为面片与墙的遮挡突然变化。软粒子比较两份线性深度,把接触范围映射成覆盖衰减。它软化交界,不补充屏幕深度缺失的背后几何。

深度差与覆盖衰减

半透明面片与场景几何相交时会出现硬切线。Soft 粒子比较粒子深度 zpz_p 和场景深度 zsz_s:

f=saturate⁡(zs−zpd)f=\operatorname{saturate}\left(\frac{z_s-z_p}{d}\right)

dd 是 Fade Distance。用 ff 乘 Alpha 可软化交界。

两种深度必须先还原到同一线性观察空间。直接比较非线性深度缓冲会让淡出随距离变化。

深度 Fade 会让贴地烟雾在接触处变淡,不一定符合所有效果。也可以把深度差用于边缘颜色、泡沫或交界亮线。

深度淡出

HLSL片段中sceneDepth与particleDepth同为沿相机前向的正观察深度,fadeDistance为正长度。

hlsl
float fade = saturate((sceneDepth-particleDepth)/fadeDistance);
float alpha = particleAlpha * fade;

以统一的正观察深度为例,墙在 5 米、粒子在 4.9 米、淡出距离为 0.2 米,得到 fade=0.5。相机后退十米,两个深度同时增加,差仍为 0.1 米,因此淡出不变。若把设备深度直接相减,这个不变量就会失败。

预乘 Alpha 合成还要让 RGB 同时乘 fade,否则透明度下降但发出的颜色没有下降,接触处会残留亮边。fadeDistance 为零时应走项目定义的硬交界分支,避免除零。场景深度一般只记录最近的不透明表面,烟雾之间的层间交界不能靠这份深度解决。

镜头附近的覆盖控制

粒子靠近相机时,Billboard 会突然覆盖整个屏幕。可给近距淡出指定起止正观察深度z0、z1,以smoothstep(z0,z1,zp)乘覆盖。例如z0=0.1米、z1=0.3米,粒子在0.2米时保留一半覆盖;到0.1米时完全淡出,避免近裁剪面突然切开整张烟片。相机淡出和墙面深度差淡出处理不同交界,分别显示后再相乘。

验证方法

粒子逐步靠近墙,显示深度差与fade,远近距离应保持同一世界尺度。背景无深度时使用覆盖有效性,透明多层与移动平台分别测试。

实现状态:正文片段用于解释本页数据流与边界条件;完整宿主的编译、运行及性能测量尚未执行。可运行的独立模型以本页列出的具体测试为准。

相关主题

参考资料