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和屏幕像素坐标反推出来.參 ...
随机推荐
- java 输入输出项目
package hellohe; import java.util.Scanner; /** * * @author Administrator *1.导入java.util.scanner; *2. ...
- 关于iis站点无法读取 服务器共享目录的问题
也是权限问题,具体解决方法如下: 1. 找到该站点所在的应用程序池>>高级设置>>进程模型>>设置标志账号,如下图所示 2. 设置账号之后,找到该共享目录>& ...
- 关于今天mysql数据库的一系列问题
首先,字符集的问题: mysql> show variables like 'character%';+--------------------------+------------------ ...
- gcc杂谈
1. -l选项自动给库文件名增加lib前缀和.a/.so后缀.所以如果你有一个lib叫做libusb.a,那么编译选项是-lusb.另一方面,如果你有一个文件叫做libusb.o(是目标文件而不是库文 ...
- android学习笔记41——图形图像处理1
图像图像处理 ImageView:用于显示普通静态图片: AnimationDrawable:用于开发逐帧动画: Animation:用于对普通图片使用补间动画: Bitmap.BitmapFacto ...
- (微信API接口开发) 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
最近调试原来的微信模拟登陆时发生了“基础连接已关闭,发送时发生错误”的错误提示,原来都是好好的,只是很久没用了. 出错代码如下: HttpWebRequest req = (HttpWebReques ...
- [CSS]如何正确使用ID和Class?
作者:DarkZone链接:https://www.zhihu.com/question/19550864/answer/23440690来源:知乎 以下摘自<精通CSS:高级Web标准解决方案 ...
- [实变函数]2.5 Cantor 三分集
1 Cantor 三分集的构造: $$\bex P=\cap_{n=1}^\infty F_n. \eex$$ 2 Cantor 三分 ...
- haxm intelx86加速模拟器的安装
http://blog.csdn.net/huang9012/article/details/18082601 如果安装了还出现 创建模拟器 选项 CPU/abi的时候还出现 no system im ...
- 利用 Gitbook 生成文档中心站点
经过一个多月,Bugtags 最近上线了自己的文档站点:docs.bugtags.com,在这里你可以找到 Bugtags 集成.使用相关的绝大部分问题. 在这之前我们使用的是第三方提供的帮助中心产品 ...