[Shader 着色器]尝试无尽之剑中的God Ray
效果展示
 图 1:用 glow11 场景做的 God Ray
背景与动机
去年看到无尽之剑中的 God Ray 效果后,便萌生了自己模拟实现这一效果的想法。
实现原理与步骤
其实 God Ray 效果的实现原理并不复杂,主要步骤如下:
- 渲染场景:对整个场景进行渲染,为后续处理提供基础画面。
- 渲染特定部分:仅渲染需要产生 God Ray 效果的部分,将这部分从整体场景中分离出来。
- 第一次过滤:对渲染出的需要产生 God Ray 效果的部分进行第一次过滤操作,初步处理画面信息。
- 第二次过滤:接着进行第二次过滤,进一步优化画面效果,使光线效果更加细腻。
- 再次过滤:再次进行过滤处理,不断细化光线的表现。
- 多次迭代(可按需增加):根据实际需求,可能还需要进行更多次的过滤操作,以达到理想的效果。
- 融合画面:将经过多次处理后的画面与原始画面进行 Alpha 加法混合(alpha addictive),最终完成 God Ray 效果的添加。
需要注意的是,这是一个非常消耗性能的过程。经过观察发现,这种效果通常只在 iPhone 5、iPad 3 及以上配置的设备上大规模使用。
Unity 中的实现
实际上,在 Unity 中也可以实现同样的效果。主要是依靠 SetReplacementShader 方法来替换原来的 Shader,从而显示出想要的光芒效果。
无尽之剑对该效果进行了优化,主要是将一些像素着色器(PS)的操作转移到了顶点着色器(VS)中。因此,我这里也实现了两个版本的代码:GodRayOptimize(优化版本)和 GodRay(未优化版本)。
由于这只是一个简单的演示项目,代码可能存在一些不足之处,希望大家能够理解。如果大家阅读了我的代码,应该就能明白具体的实现思路了。目前我不太清楚 Unity 是否有自带的实现该效果的方法。