Tile-Based Deferred Rendering
目前所有的移动设备都使用的是 Tile-Based Deferred Rendering(TBDR) 的渲染架构。TBDR 的基本流程是这样的,当提交渲染命令的时候,GPU 不会立刻进行渲染,而是一帧内所有的渲染命令积攒起来,最后统一渲染。在渲染到 FrameBuffer 的时候,也不是依次执行所有的命令将 Fragment 结果填充到 FrameBuffer 中。而是在 GPU 内部有着叫做 Tile 的高速渲染器,这些 Tiles 虚拟的将 FrameBuffer 分割成小块(光栅化后得到很多 Fragment,很容易就能决定 Fragment 所在的 Tile),每次执行一小块中的所有渲染命令,完成后将结果写回 FrameBuffer。这些 Tile 一般会在 32x32 像素的大小,当然根据设计的不同而各部相同。Tile 的数量一般不足以完全平铺整个 FrameBuffer,一次只能覆盖一部分 FrameBuffer 的区域,所以每帧内同一个 Tile 会执行多次渲染操作。
TBDR 的渲染架构带来了一个非常大的好处,就是 Hidden Surface Removal。当 vertex shader 执行完成后,通过插值得到很多 fragment,这个之后每个 fargment 的深度值就已经知道了,那么就可以利用这个深度值将最终不会渲染到屏幕(被其它 fragment 遮挡)的 fragment 剔除,减少了很多 fragment shader 计算量,提高了填充率。注意,这个只对非透明的物体有效,如果是 AlphaTest(shader 中表面为使用了 clip 或者 discard) 或者 Transparent(Alpha 不是 1),是没有 Hidden Surface Removal 效果的。因为很简单,透明的 fragment 无法遮挡住后面 fragment。也就是说并不是 AlphaTest 和 Blend 本身是大消耗操作,而是因为破坏了 Hidden Surface Removal。
在 TBDR 的渲染架构下还有很重要的一点需要注意。立即渲染模式下,有一个技巧是,当每一帧都不去清屏的时候是可以提高效率的,因为 clear 操作需要将值写入 FramBuffer 中的每一个像素中,这是需要花费一定时间的。而这个技巧在 TBDR 中是行不通的,反而会起到反效果。这是因为,如果你没有调用 clear 操作,表示你认为上一帧的内容是不能丢弃的,所以在渲染 tile 的时候,硬件会将 FrameBuffer 中数据先写入 Tile,然后再执行渲染,这个写入操作无形中增加了很多的负担,有可能就会严重影响到程序的执行效率。
下面是几个很好的参考资料:
OpenGLInsights-TileBasedArchitectures.pdf
Tile-Based Deferred Rendering的更多相关文章
- Tile based Rendering 二 tbr and tbdr 优化建议tiled based deferred rendering
http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf tbr 和tbdr ...
- Tutorial - Deferred Rendering Shadow Mapping 转
http://www.codinglabs.net/tutorial_opengl_deferred_rendering_shadow_mapping.aspx Tutorial - Deferred ...
- Deferred Rendering(三)反锯齿和半透明问题
Deferred 框架下的AA 前面说过Deferred 框架下无法使用硬件AA.这句话不严谨: Deferred Shading在G-Buffer之后,物体几何信息全被抛弃了,导致兴许每一个像素都独 ...
- Forward Rendering VS Deferred Rendering
http://gad.qq.com/article/detail/32731 Forward Rendering Deferred Rendering
- Tile based Rendering //后面一段是手机优化建议
https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ 一种硬件结构 ...
- [ZZ] Deferred Rendering and HDR
http://www.gamedev.net/topic/496785-deferred-rendering-and-hdr/ Quote: Original post by jstrohYeah I ...
- OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译
Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校 by Bruce Merry GameKnife译 译序 在大概1 ...
- deferred rendering with msaa
https://docs.nvidia.com/gameworks/content/gameworkslibrary/graphicssamples/d3d_samples/antialiasedde ...
- Deferred Rendering(二)G-Buffer的组织
先来看一张网上广为流传的<杀戮地带2>典型的Deferred Shading的G-Buffer组织: 这里补充解释下几个点: 不存Position,而由depth和屏幕像素坐标反推出来.參 ...
随机推荐
- makefile 分析 -- 内置变量及自动变量
makefile 分析1 -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于--debug=a, b(basic), ...
- php的函数iconv在转"utf-8"到"gb2312"时会自动截断
最近在写网站后台时候,需要用到iconv函数把前端jquery Post来过的utf-8编码内容转成gb2312, 发现只有用iconv函数把内容的数据一转码数据就会无缘无故的少了一部分. 问了我 ...
- Report_矩阵报表的实现(案例)
2014-05-31 Created By BaoXinjian
- PLSQL_Oracle Logon Trigger的建立
20150609 Created By BaoXinjian
- Android网络通信库Volley简介
1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient( ...
- ylbtech-LanguageSamples-Struct(结构)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Struct(结构) 1.A,示例(Sample) 返回顶部 “结构”示例 本示例演示结 ...
- JAVA数据类型自动转换,与强制转换
一.数据类型自动转换 public class Test{ public static void main(String[] args){ int a = 1; double b = 1.5; dou ...
- Yii 框架表单验证---实例
- web性能测试的新利器 - Gatling 介绍
转载:http://www.51testing.com/html/10/26810-852956.html 最近发现了一个新的性能测试工具Gatling,貌似比Jmeter还好玩.这几天就先简单介绍一 ...
- Java基础-面板组件