目前所有的移动设备都使用的是 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

Tuning Your OpenGL ES App

Tile-Based Deferred Rendering的更多相关文章

  1. Tile based Rendering 二 tbr and tbdr 优化建议tiled based deferred rendering

    http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf tbr 和tbdr ...

  2. Tutorial - Deferred Rendering Shadow Mapping 转

    http://www.codinglabs.net/tutorial_opengl_deferred_rendering_shadow_mapping.aspx Tutorial - Deferred ...

  3. Deferred Rendering(三)反锯齿和半透明问题

    Deferred 框架下的AA 前面说过Deferred 框架下无法使用硬件AA.这句话不严谨: Deferred Shading在G-Buffer之后,物体几何信息全被抛弃了,导致兴许每一个像素都独 ...

  4. Forward Rendering VS Deferred Rendering

    http://gad.qq.com/article/detail/32731 Forward Rendering Deferred Rendering

  5. Tile based Rendering //后面一段是手机优化建议

    https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ 一种硬件结构 ...

  6. [ZZ] Deferred Rendering and HDR

    http://www.gamedev.net/topic/496785-deferred-rendering-and-hdr/ Quote: Original post by jstrohYeah I ...

  7. OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译

    Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校 by Bruce Merry GameKnife译 译序 在大概1 ...

  8. deferred rendering with msaa

    https://docs.nvidia.com/gameworks/content/gameworkslibrary/graphicssamples/d3d_samples/antialiasedde ...

  9. Deferred Rendering(二)G-Buffer的组织

    先来看一张网上广为流传的<杀戮地带2>典型的Deferred Shading的G-Buffer组织: 这里补充解释下几个点: 不存Position,而由depth和屏幕像素坐标反推出来.參 ...

随机推荐

  1. Netdom query基本用法

    C:\Users\user1>netdom queryThe syntax of this command is: NETDOM QUERY [/Domain:domain] [/Server: ...

  2. centos7开机/etc/rc.local不执行的问题

    最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 #!/bin/bash# THIS FILE IS ADDED ...

  3. android学习笔记15——Galley

    Gallery==>画廊视图 Gallery和Spinnery父类相同——AbsSpinner,表明Garrey和Spinner都是一个列表框. 两者之间的区别是:Spinner显示的是一个垂直 ...

  4. QueryRunner的API

    org.apache.commons.dbutils Class QueryRunner java.lang.Object org.apache.commons.dbutils.AbstractQue ...

  5. storm的作业单元:Topology

    Storm系统的数据处理应用单元,是被打包的被称为Topology的作业. 它是由多个数据处理阶段组合而成的,而每个处理阶段在构造时被称为组件(Component),在运行时被称为任务. 那么,组件根 ...

  6. SparkSQL相关语句总结

    1.in 不支持子查询 eg. select * from src where key in(select key from test); 支持查询个数 eg. select * from src w ...

  7. [ Redis ] Redis 未授权访问漏洞被利用,服务器登陆不上

    一.缘由: 突然有一天某台服务器远程登陆不上,试了好几个人的账号都行,顿时慌了,感觉服务器被黑.在终于找到一个还在登陆状态的同事后,经查看/ect/passwd 和/etc/passwd-异常,文件中 ...

  8. 在JavaScript里嵌入大量字符串常量的方法

    [转]在JavaScript文件里嵌入大量字符串常量是经常遇到的事.有时为了省事,就把一些界面的HTML和CSS直接写在JS文件里.数量少还好,多的话就密密麻麻的一坨文字,讲究美观的文艺青年们,会用大 ...

  9. psutil模块安装指南(win与linux)

    1.windows下psutil模块安装: https://pypi.python.org/packages/3.4/p/psutil/ 下载符合版本的软件包下载,然后安装即可. 2.ubuntu下载 ...

  10. 模拟实现兼容低版本IE浏览器的原生bind()函数功能

    模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){   Function.prototype.bind=function( ...