上帝之光(God Ray)

God Ray,看起来很牛,实际上很简单,现在几乎没有游戏不用了。今年四五月份,我也尝试在项目中作了一个这个,确实,比想象中的容易多了。一直想写一篇,一直没时间,终于有点空了,写下来,反正不是什么困难的东西。您要是做也就是一两天的事情吧。

 

感谢我的同事Aman Jiang,他优化了我之前God Ray的处理方式,使之更符合需要了。而且,介绍了好几篇不错的文章,虽然有些方法由于引擎的限制不能做,但是最后还是一起想办法绕出来了。

(唉,要能多给我点时间多好啊……我就自己做了T_T )

 

图片节选自Crysis。感谢Crytech这部好游戏。

 

感叹,无论如何,游戏的图形已经进入了一个新的时代,妄图通过技术来垄断市场几乎是不可能的了。绝大多数游戏厂商几乎处在同一个起跑线上——任何一个很牛的效果,很快就会被破解,然后被无数人用来用去。

现在的欧美大作看起来都是一个样子,大约就是这个意思。

追求图形的时代已经过去,甚至追求物理的时代也已经过去,可能更重要的,是思考如何用现有的手段让游戏更好玩吧……

 

God Ray发生在最后的像素空间内,假设你能够确定太阳光的像素空间位置是Cx Cy,那么流程大抵如此:

首先,将上一桢的,或者本桢的Render Target保留,以备处理,我们称这张图为参考图Tex_Ref。

然后,从当前的像素 x,y,向Cx Cy作一条线段,在这条线段上,按照一定的数量(假设:32)对本桢或者上桢的Render Target采样,并将采样结果相加,得出本点受到本条线段各处高光影响的总光强P。

然后,使用 pow(P, Param_Power) * Param_Intensity,就能得到最后的光强了。

 

这个主要的意思就是,对一个强光区域,根据光线的强弱和参考点的位置,将能量沿与参考点的连线方向延伸出去,这样,强光区域相当于被模糊且放大了,最后的结果就是,它的外形激发出来,与场景原有的色彩混合,形成了光线滋出来的效果。

 

如果你的算法仅仅是上面那样,那么恭喜你接下来要哭了。

 

首先,一般游戏的特效光强都远远高于场景中的高光域,有些材质由于受光强烈,也会有很大程度的反光,这么做的直接结果是:只要一放特效,恭喜你将看到一串闪光从特效上发出来。或者一片金属突然发出一串闪光来。

这个问题的解决方法,老外已经给出来了:你在渲染God Ray的Tex_Ref时,除了Lensflare和天空盒外,所有Mesh均渲染成黑色,粒子等从这个Pass中排除。这样最后的效果就是:只有场景的Lensflare和天空盒上的高光域会发出God Ray,这正是我们想要的。这个做法需要多消耗一个pass来,不能使用上桢的Render Target了,不过,对于最后的效果而言,这应该是很值得的,如果您场景中的物体数量不多,可以尝试一下。毕竟这种做法的Pixel阶段很简单,就是单纯根据标志返回黑色或者某个颜色而已,采样很少。

 

第二,当前你所看到的场景很可能没有高光域,但本应当有神光效果的,例如,你靠着一面墙,墙上有一个窟窿,窟窿外面有个很大的电灯泡,不过可惜因为你靠着墙,窟窿在你的视角里很小很小,而且并不透出,所以你看不到这个电灯泡。但是,真实的情况下,应该会有一束光从缝里面出来。这个问题有多种方法解决,第一种是在Tex Ref上面画一个参考Convex过来,过秤稍微有点麻烦,就不多说了。另一种办法更直接:直接让美术在这个地方摆一个稍微小一点的高光点,并让这个高光点发出God Ray。

 

第三,当天空盒中的高光域很大而且比较规则,且前方没有遮挡时,整个光会成为一个大的Volume,这会让整个场景感到很爆,也会伤及万家的眼睛。这个是最好解决的了:Shader里面再用一个1D Noise纹理或者一个2D Noise纹理,对God Ray采样的强弱进行控制,就可以了。由于引擎限制,前两点我们无法很好地完成,第三点是改动较大的,结果很不错。

 

更多的问题还没有遇到,想必研究过这个东西的人,也还会有更好的方法,请不吝赐教。

 

 

我现在最佩服的就是某国产游戏的God Ray……竟然在屏幕空间上,使用Alpha贴了一个一直闪动的纹理动画上来……无论光源在哪里,这个特效一直固定在你显示器左偏下的位置……感叹咱们中国真的不缺忽悠的人才。效果只要好就行,其实,无所谓忽不忽悠。其实,说到底,搞图形的,哪个不是忽悠人的呢?……

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值