目前所有的移动设备都使用的是 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. Env:zsh和fish安装和使用

    zsh优势兼容bash, 方便git管理,但是有时候切换速度较慢,特别遇到git仓库目录 fish优势速度较快,路径提示也不错,但是和bash不兼容 1. zsh 首先,可以通过cat /etc/sh ...

  2. 黄聪:wordpress源码解析-数据库表结构(转)

    如果是一个普通的用户,不需要了解wordpress数据库的结构.但是,如果你正在写一个插件,你应该会对wordpress如何处理它的数据和关系感兴趣.如果你已经尝试使用已经存在的wordpress a ...

  3. jplayer中动态添加列表曲目(js提取request中的list数据作为js参数使用)

    jplayer 的播放列表使用如下: $(document).ready(function(){ new jPlayerPlaylist({ jPlayer: "#jquery_jplaye ...

  4. 【Android】源码external/目录中在编译过程中生成的文件列表

    => external/eyes-free:   accessibilityvalidator.jar (host,share) => external/mesa3d:   libMesa ...

  5. 关于oc中出现的typedef的用法/定义函数指针

    typedef int (^calculateBlock)(int a,int b); 这里面typedef的作用只是给 calculateBlock取了一个 别名,说明以后可以直接使用. calcu ...

  6. angular.js 的angular.copy 、 angular.extend 、 angular.merge

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

    启动nginx时报这个错 , 要么用root用户启动 , 要么在配置文件nginx.conf中将server下的listen端口改掉 , 因为在linux中端口号小于1024都是需要root权限的

  8. Python进阶06 循环对象

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循 ...

  9. Spring读取配置文件

    在spring中可以通过下面的方式将配置文件中的项注入到配置中 <bean class="org.springframework.beans.factory.config.Proper ...

  10. 文件下载(只需要简单的四步),Java中都通用

    我们就直接切入主题啦,文件下载只需要四步: 1.设置文件ContentType类型 2.设置文件头 3.通过response获取ServletOutputStream对象(out) 4.写到输出流(o ...