Tile Based Deferred Rendering

Written by JP.Lee
心动的 Technical Art team leader.

Immediate ModeRendering (IMR)

把三角形Rasterizing,以像素(pixel)为单位进行Shading的传统方式。三角形通过流水线及时移动。耗电以及浪费memory bandwidth(Early Visibility Test功能:为了使用这个功能,三角形要以序列的方式进入。因此,应在应用部分将三角形进行分类(sorting)。

Tile BasedRendering (TBR)

在Embedded中成本最高的是内存的读写。内存的读写与电量和memory bandwidth密切相关。所以在Embedded中最有效的优化方法之一是减少内存访问的次数。TDR度为了取代以前使用的将在IMR中的可见三角形挑选出来的Z-buffer(depth buffer)而研发的方法。将要渲染的画面分成许多tile,以tile为单位进行rasterization。(根据不同的系统情况,存在同时移动的tile。但是不是所有的三角形都能及时通过流水线进行移动。)(每一次划分tile的时候,硬件会创建包括各tile在内的有关Geometry列表的指针。使得各个tile在进行渲染的时候,都可以获取相关的Geometry buffer。)这样不使用z-buffer,改用tile进行处理的话,只使用在system-memory上的intermediate buffer 就可以解决了。

Tile BasedDeferred Rendering (TBDR)

TDR的改良版本。在TDR里也可以对看不见的部分进行Shading或贴图(Texture Mapping)。在TBDR中,GPU里面通过分类找出三角形排列顺序,可以去掉不可见的部分)这个方法称为Hidden Surface Removal (HSR)。因为去掉了没有意义的三角形.,比起TBR,更充分地利用了memory bandwidthTBDR的优点如下1. 因为没有Z-buffer,内存利用率更高2. 没有Z-buffer访问,减少开销3. 不用担心渲染顺序,可以正确的处理半透明效果。(blending效果).

Alpha Blending 和 Alpha Test

Alpha Blending(Alpha Blending) VS Alpha Test(Alpha Test)在传统Desktop Game使用的锂材料,比起Alpha Blending,更建议使用Alpha Test。在不透明的情况下,像不透明的铁丝网,撕裂的衣料,比起用成本高的blending进行计算,不如使用Alpha Test,同时也可以省去像素计算的步骤。但是在Mobile Game中,刚好与此相反,比起Alpha Test,更推荐使用Alpha Blending。 为了进行Alpha Test,Pixel Shader中使用了动态分支(if语句)。在台式电脑中可以高速处理Shader的动态分支,但在移动设备上对动态分支的处理并不好。因此,Alpha Test成为了使Shader性能降低的原因。而且,TBDR无法高速处理像素屏蔽。之前提到过的在TBDR中,收集完DrawCall的Vertex Shader结果,经过Hidden Surface Removal后,对实际上能看到的像素进行处理。但是这只对不使用Alpha Test的完全不透明的mesh适用。因为使用Alpha Test的话,在Vertex处理阶段无法判断Polygon是否被屏蔽,无法进行Deferred处理。在Unity3D中,为了防止上述情况的发生,在对完全不透明的Object进行Rendering处理后,Alpha Test再对Object进行Rendering处理。所以有条件的使用Alpha Test的话,并不会带来严重的后果。但是,TBDR芯片组的构造一开始就不适合Alpha Test的工作,所以最好不要使用Alpha Test。 그렇기 때문에, Unity3D의 내장 Shader 중 Mobile 카테고리에는 알파 테스트 Shader가 존재하지 않습니다.因此,Unity3D的内置Shader中,Mobile类别中不存在Alpha Test Shader。Alpha Blending与此相反,比在台式电脑上的运行速度更快。其通过内部读写对象buffer进行Alpha Blending过程的输出。而在台式电脑中要访问位于DRAM的frame buffer,占用了大量的bandwidth.但是在TBDR中,这个过程发生在芯片内部的Memory里,以tile为单位进行,所以处理速度很快。补充说明 我们来看一下mesh plan的图片。如图,Alpha Blending区域变大的话,比起增加mesh顶点,更好的方式是将它分解,减少透明的区域,从而有利于整体性能的提高。

Render Texture

如果使用Render Texture的话, Unity3D会内部改变Render Target。在台式电脑上改变Render Target的做法也会降低其性能。因为为了改变Render Target,CPU会等待GPU的反应,打破了两者的并列关系。 而且,在TBDR里会产生更严重的问题。Render Target变化时,在Parameter Buffer的全部数据经过处理后向Frame Buffer输出,为Render Target空出了Parameter Buffer。以这种方式进行时,Render Target变化时要增加deferred循环的处理。因此,在Unity3D的摄像机中把Render Texture作为Target Texture使用的话,会降低TBDR的工作效率。

图片后期处理效果(Image post process Effect)

最近的设备性能有所提升,可以使用如调色,Bloom效果等图片后期处理功能。但是,这些图片后期处理功能不能滥用,只能有选择性的使用。首先,图片后期处理会在内部改变Render Target。但最大的问题是bandwidth。尽管像素处理能力也很重要,但最重要的问题是bandwidth。图片后期处理把Render Target变为 Pixel Shader的输入纹理。因为这时输入的Texture不是芯片内部的tile,而是作为Render Target占用了公用Memory,占用了大量的带宽。(例 : 1080p)所以,要慎重地进行图片的后期处理。

Camera Clear(Clear)

在以前台式电脑的图形卡中,有每帧开始前故意不清除之前的内容,即每帧绘制在上一帧之上的情况。但是现代的台式电脑一定要进行清除,才能保证硬件高速的运行。在移动设备的TBR中也是如此。只有清除才能空出芯片内部的Buffer,加速Rendering过程。所以无论是台式电脑,还是移动设备,都不建议在Clear Flag属性中选择Don’t clear选项。

MSAA

在台式电脑中,MSAA的开销很大。和上面一样,bandwidth是最大的问题。例如,用MSAA 2X处理分辨率为1080p的画面的话,需要约2160p的bandwidth。如果仅仅是DRAM就占用那么多的bandwidth,开销会很大。但是,用TBR方式的话,处理可以在芯片内部的区块中完成。用16×16或32×32大小的区块进行MSAA的处理,不会造成很大的开销。在Unity3D中,把质量设置(Quality Settings) 的Anti Aliasing设置为2或4,便可以使用MSAA。 ProfilingUnity3D5中新增了Frame Debugger,每一帧都可以在渲染过程中进行Debugging。可以通过这个功能,很容易地看到Object的渲染过程和批处理情况。 이미지 출처 : http://docs.unity3d.com/Manual/FrameDebugger.html但可惜的是,Unity3D的Frame Debugger无法看到每一个draw call(dp)的GPU 性能的详细情况。可幸运的是,每一个Chipset Vendor都提供了一个可以详细分析渲染过程的工具。Adreno芯片通过Adreno分析器(Profiler),Mali芯片通过Mali分析器(Profiler)或DS-5,Iphone通过XCODE进行分析。 이미지 출처 : http://www.slideshare.net/ozlael/graphics-opt-ndc大概只有一个问题。尽管使用TBR方式的芯片每一个call都可以确认一次其性能(Performance),但是并不能直观的看到每一个call的性能。像之前说的那样,进行draw call(dp)时,不是立刻处理Pixel Shader,而是使用留存的Parameter Buffer结果。因此,在所有draw call(dp)结束之后,才真正地开始渲染过程,所以并不能看到每一个call的实际性能。所以在X-code分析Iphone的渲染过程时,性能项会显示数字0。有时可能也会出现不是0的数字,但出现的数字并不值得信任。在这种情况下,只能利用帧的性能(Performance)或call当时使用的纹理等信息进行推测。像上面提到过的一样,因性能项显示为0,所以Iphone的分析会有一些棘手。 照片出处 : http://www.slideshare.net/ozlael/graphics-opt-ndc 画面变化率用TBR方式进行渲染,渲染过程在芯片内的tile进行,不会占用bandwidth。但是,在向位于DRAM的frame buffer输出tile是,不可避免地要占用bandwidth。为了节约这部分bandwidth的开销, Mali公司使用了Transaction Elimination技术。如果遇到和之前frame及画面结果一样的tile,不再更新tile,循环使用以前的tile。这样可以减少芯片内存复制到系统内存的量。下图中用绿色标识的字就是循环使用的这一部分。 이미지 출처 : http://community.arm.com/所以,如果使用固定摄像机的话,在使用天空盒等背景时,最大程度地减少变化是一种比较好的方法。实际上,这种方法在3D游戏上应用的情况并不多见,比较多应用于2D游戏中。

Categories: tutorials

Tagged as:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s