[Shader 着色器]尝试无尽之剑中的God Ray

2015年03月15日 18:05 0 点赞 0 评论 更新于 2025-11-21 17:14

效果展示

![图 1](此处应补充图 1 实际的图片链接) 图 1:用 glow11 场景做的 God Ray

背景与动机

去年看到无尽之剑中的 God Ray 效果后,便萌生了自己模拟实现这一效果的想法。

实现原理与步骤

其实 God Ray 效果的实现原理并不复杂,主要步骤如下:

  1. 渲染场景:对整个场景进行渲染,为后续处理提供基础画面。
  2. 渲染特定部分:仅渲染需要产生 God Ray 效果的部分,将这部分从整体场景中分离出来。
  3. 第一次过滤:对渲染出的需要产生 God Ray 效果的部分进行第一次过滤操作,初步处理画面信息。
  4. 第二次过滤:接着进行第二次过滤,进一步优化画面效果,使光线效果更加细腻。
  5. 再次过滤:再次进行过滤处理,不断细化光线的表现。
  6. 多次迭代(可按需增加):根据实际需求,可能还需要进行更多次的过滤操作,以达到理想的效果。
  7. 融合画面:将经过多次处理后的画面与原始画面进行 Alpha 加法混合(alpha addictive),最终完成 God Ray 效果的添加。

需要注意的是,这是一个非常消耗性能的过程。经过观察发现,这种效果通常只在 iPhone 5、iPad 3 及以上配置的设备上大规模使用。

Unity 中的实现

实际上,在 Unity 中也可以实现同样的效果。主要是依靠 SetReplacementShader 方法来替换原来的 Shader,从而显示出想要的光芒效果。

无尽之剑对该效果进行了优化,主要是将一些像素着色器(PS)的操作转移到了顶点着色器(VS)中。因此,我这里也实现了两个版本的代码:GodRayOptimize(优化版本)和 GodRay(未优化版本)。

由于这只是一个简单的演示项目,代码可能存在一些不足之处,希望大家能够理解。如果大家阅读了我的代码,应该就能明白具体的实现思路了。目前我不太清楚 Unity 是否有自带的实现该效果的方法。

作者信息

boke

boke

共发布了 3994 篇文章