软粒子
全库目录221
本文目录6
烟片穿过墙面会出现一条硬线,因为面片与墙的遮挡突然变化。软粒子比较两份线性深度,把接触范围映射成覆盖衰减。它软化交界,不补充屏幕深度缺失的背后几何。
深度差与覆盖衰减
半透明面片与场景几何相交时会出现硬切线。Soft 粒子比较粒子深度 和场景深度 :
是 Fade Distance。用 乘 Alpha 可软化交界。
两种深度必须先还原到同一线性观察空间。直接比较非线性深度缓冲会让淡出随距离变化。
深度 Fade 会让贴地烟雾在接触处变淡,不一定符合所有效果。也可以把深度差用于边缘颜色、泡沫或交界亮线。
深度淡出
HLSL片段中sceneDepth与particleDepth同为沿相机前向的正观察深度,fadeDistance为正长度。
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,远近距离应保持同一世界尺度。背景无深度时使用覆盖有效性,透明多层与移动平台分别测试。
实现状态:正文片段用于解释本页数据流与边界条件;完整宿主的编译、运行及性能测量尚未执行。可运行的独立模型以本页列出的具体测试为准。
相关主题
参考资料
- GPU Gems 3 第23章:High-Speed, Off-Screen Particles:粒子深度与交界淡出;其旧版图形接口限制不作为当前平台能力结论。