中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 35|回复: 3

模拟爆炸、火炬、粒子等产生的光照效果

[复制链接]
发表于 2013-1-6 16:13:32 | 显示全部楼层 |阅读模式
这些光照效果的特点是:
  • 临时的
  • 小范围的
  • 不须产生阴影的
  • 强度,颜色,位置等属性会不停变化的

这些光照效果会带给玩家更真实的融入感。

主要需要在render pipeline里加入deferred lighting,并定义好光MyLightInstance的属性(目前没有光的定义)。
使得RenderStage支持输入一个MyLightInstance List(待定义)。
这个List里的内容每帧都可能发生变化。

MyLightInstance主要由游戏中的各种RenderObject产生并加入到RenderWorld里的MyLightInstance List中。
它的属性的变化也是由产生其的各种RenderObject负责Update。
销毁亦然。



 楼主| 发表于 2013-1-7 15:05:31 | 显示全部楼层
其实也可以考虑"Post lighting":
1. 正常渲染场景(opaque & weak transparent),使用MRT输出color, depth and normal buffers.
2. 将lighting当作一个特殊的post effect来做(视情况可分别对opaque和weak transparent都做一次后再blend,或在blend后的结果上做一次,视性能,效果和实现复杂度自由决定)。
3. 最后再渲transparent物体,不接受这类光照。因为这类物体都是一些像text, special effect billboard等物体。

这样只需渲染场景一次,也不需改变现有的shader。

当然,前提假设是只支持diffuse lighting,不支持specular等non-linear lighting. 考虑到应用的cases,这应该是可以接受的。
发表于 2013-1-7 20:12:13 | 显示全部楼层
"post-lighting" 算是一个折中的方法。
比较类似deferred shading,只是shading的时候直接blend除主光外的其他光。
实现起来也会对结构的影响很小。


个人觉得,其实还是可以考虑直接实现的deferred lighting
目前的问题主要是以下几点:

1. prepass,每一个不透明物体都需要多画一遍ZPASS。
这次ZPASS倒也不是完全的浪费。简单的ZPASS输出DEPTH和NORMAL,可以为之后的GENERAL PASS作一次PREPASS, 可以利用上所有几乎DX11显卡都支持的EARLY-Z。

2. 透明物体的光照问题。
这个问题只能通过前向来解决,或者考虑挖洞透明等方式?

3. AA
AA只能使用POST-AA了,crytek那个post-AA是利用两帧抖动混合来实现的,我实现过,在30FPS以上有很好的效果和性能(720p ~0.2ms)。我记得DX9如果使用了MRT是打不开MSAA的?而且唯一的那一次MRT直接使用MSAA的话,压力可能也会比较大?
4. 改变现有shader
初看了一下,感觉这一块儿是需要动一动的~ deferred lighting的话是可以保证大部分丰富效果的~

当然这是后话,我觉得可以先实现post-lighting吧,有时间做一个可切换的deferred lighting,把shader整理一下~
 楼主| 发表于 2013-1-7 21:42:16 | 显示全部楼层
本帖最后由 marklalon 于 2013-1-7 21:56 编辑

恩,可先搞post lighting。
我想先确认下概念,以免后来的读者混淆。如果我的理解有偏差,欢迎指正。
  • Deferred lighting主要的特点是要画2次场景几何,一次输出attribute,一次shading, 中间生成一张lighting buffer。优点是attribute pass可以非全屏(如果fill-rate overhead > early z benefits),shading可以使用MSAA,材质shader可以不用拆分。在3DSMAX中用过,但我不太清楚有什么游戏会用到它,大多数游戏应该都是用Deferred shading.

  • Deferred shading则只需画1次场景几何输出attribute(包括材质信息),然后生成lighting buffer,然后在screen quad上做shading。优点是场景只需画一次。但材质shader要拆分成2部分,一个output attributes,一个sample attributes来做shading。这样在编写shader的时候需要考虑这个问题,从vertex上拿属性来做shading得保证它能pack到GBuffer中去,当vertex上有比较多的信息时,需要特别注意。

  • Post lighting基本就是我之前讲的那样。基本就是forward shading(MRT) + post (effect) lighting。优点就是不需拆分材质shader(以及跟material相关的GBuffer),编写shader比较灵活。关于其它基于Deferred shading的效果,我想大概也都能参照post-lighting的做法(如果它能work得比较好的话)。缺点是对非线性的BRDF surface,光照会失真。

它们3都有透明问题,这也是最头痛的问题。先试试把“weak transparent”的物体当作不透明的来处理,看看效果怎么样。如果不理想则再搞动态shader。

对了关于MSAA,DX9 MRT确实是不能用MSAA的,但我们的项目首要针对SM 4.1或以上的卡,相信这一两年大部分的卡都会支持。在DX 9下不开MSAA就罢了。另外,反正还有POST-AA,这个貌似有的显卡驱动就自带了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-10-19 22:24 , Processed in 0.050788 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表