【学习笔记】3D图形学:stage3D实战-延迟着色技术DeferredShading

来源:互联网 发布:洛枳扮演者晁然淘宝店 编辑:程序博客网 时间:2024/05/21 14:06

在引擎开发中,

一般容易接触到的两个词就是:Forward Rendering(前向渲染或正向渲染Deferred Rendering(延迟渲染)

笔者今天就来让大家搞懂这两个之间的区别。


特别说明一下,在FlashPlayer16之后,stage3d才更新增加了对MRT的支持(DeferredShading)。

真是迟来的爱~


拿多光源来举例说明这两者的区别是最合适不过了。

比如场景中有一个物体A,物体B,物体C它们三者都接受3~100个或更可能多的光源。


Forward Rendering(前向渲染):前向渲染的流程是这样的。

(物体A+光照1+光照2+光照3+。。。+光照100)-------->||

(物体B+光照1+光照2+光照3+。。。+光照100)-------->||========>(屏幕显示)

(物体C+光照1+光照2+光照3+。。。+光照100)-------->||

看到上面每个物体都要和光照计算一次。如果场景灯组越多,计算越复杂shader代码越长,直到闻到显卡的香味~!

可以得出的结论是:前向渲染对支持更可能多的光源不是哪么友好。


Deferred Rendering(延迟渲染):延迟着色的流程是这样的。

(物体A:G-buff)-------->||

(物体B:G-buff)-------->||========>G-buff光照1+光照2+光照3+。。。+光照100)-->(屏幕显示)

(物体C:G-buff)-------->||

从上面的流程可以看出,物体前期已经完全不参与光照计算了。想出这个点子的人,真是天才!

每个物体只输出Gbuff就行了。然后最后统一与所有的光照计算一遍就完事了,屌,不服不行。

可以得出的结论是:延迟渲染完全可以非常简单,而且高效的支持更可能多的光源。


搞懂原理后,我拿as3的stage3d来试了一遍DeferredShading,如图所示:



这个茶壶,在上下左右,各放置了一个灯。共4个灯做测试用。分别被正常照亮(DeferredShading延迟着色技术)。



这是法线。


这是顶点。


这里纹理。


这是光照后的。


关于优缺点:

前向渲染在手机上,比延迟渲染要好一些。在少量光源的情况下,因为延迟渲染每一帧都需要做一次MRT开销。

在PC上由于显卡性能现在都比较强劲了,延迟渲染MRT这点开销几乎可以忽略。

前向渲染对混合模式支持的比较好,延迟渲染混合模式就支持差了。

前向渲染对光源数量有严格的要求,光源越多,性能越差。

延迟渲染对光源数量基本没多大要求,灯光数量对于延迟渲染来说,影响不大。


关于硬件方面:

对于手机来说,不敢保证每台手机都能支持MRT。手机端还是需慎重。

对于PC来说,除非你是10年前的老古懂显卡,现在基本都默认支持,在PC上是好事!

对于Flash的Stage3D来说,你需要用AGAL2和FlashPlayer16以上版本才能支持MRT(Stage3D DeferredShading延迟着色)。

而且需要将Context3DProfile.STANDARD设置成标准模式才能使用AGAL2。



(利用Deferred Rendering渲染1000盏灯光::图片搜集来自网络)


好了,这篇只是希望让大家了解这两种渲染方式,实现理论以及它们两者的优缺点。


阅读全文
0 0
原创粉丝点击