动态光照-灯光管理(室内)

作为3D两年多来的一个分界线吧,所以写了,不管懂与不懂的,内行或许一眼看出点东西,外行的就别浪费时间了。后面的工作将花点时间分析下延迟等,整理下思路,就全部CODE出来吧(ps:过完年就转游戏这行去吧(但又能去哪呢?))~

  前段时间分析Alexander Zaprjagaev 早期开源的那渲染代码,里面的实时光照效果确实不错(我的老电脑才跑7+帧,现在的跑了200帧。),一直不明白是怎么回事,直到进入现在的公司之后,静下心来,从插件到BSP+PORT,然后是光线追踪,辐射度光照(CS的光照预处理),到最后整了段时间物理引擎(没大学物理基础,所以暂时放了放),最后分析了这个的实时光照。

  在这里所采用的阴影效果和我们普通的体积阴影有点点差别,他采用相反的方式,即通过模板的地方才进行光照,这样未被光照到的地方就产生了阴影。

  我们很清楚,体积阴影方法有两种,用Z-PASS的话,会出现人在阴影体的时候模板值生成不正确,而采用Z-FAILED的方法则有另外个问题(在BSP场景中,正面是向里的,当灯光通过PORT射出去,这时候的阴影体是反向的,这个时候用Z-FAILED的话,阴影体是无法封底的,所以XXXX)。

  而Alexander Zaprjagaev 采用的是用Z-PASS,通过计算在多少重阴影体内,然后确定穿过了多少重阴影体才到达光照的地方。在下面我就介绍下他的整个渲染流程。

  if(bsp) bsp->render();通过调用他完成了深度的写入和环境光照的写入(此时因为活动灯光数为0,所以采用了AMBIENT shader渲染)。

  接下来是render_light();整个过程关闭了深度写进行光照的渲染,所有的动态灯光照是在此时渲染上去的,他对每个一灯光渲染一次,然后对目标进行1:1累加的混合进去,此时候我们看到他采用了只输出深度值的渲染阴影体(只写深度比普通渲染的2-8倍--看延迟的时候这么说的),同时注意stencil_value这个东西,他是计算穿透多少阴影来决定的,用来作为最后决定模板值为多少才做PS。可以去认真分析下stencil_value的计算过程,你会发现挺有意思的。我们这里同时要注意个地方,他这个渲染灯光的时候采用的深度测试是等于才通过,认真想想我们前面用环境光照渲染的时候已经有深度了,所以只有等于这个深度的地方才用得着渲染,这个可以剔除N多无谓的复杂PS计算,整个的至少渲染场景次数为(可见灯光数+1)次,或许只有在室内的场景中才能够跑起来。

  就啰嗦这么多,到此为止除了物理那块,这整个算是都熟悉了怎么回事,要码出代码来也是很简单的事情(ps:人家多少年前的水平,我直到现在才有所挨到边,真的是人比人,累死人)。

  还有两个月,补物理力学吧,所有的一切为了进入次时代游戏的开发,路真的很远~

  最后废话一句,其实他的渲染就是卡马克提到的用于DOOM3 的Z Pre-Pass 光照渲染方式。不过好像效率两者间差别满大的(我以前的老电脑都可以玩DOOM3,而他才7+帧)。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值