Deferred Rendering(二)G-Buffer的组织
先来看一张网上广为流传的《杀戮地带2》典型的Deferred Shading的G-Buffer组织:
这里补充解释下几个点:
- 不存Position,而由depth和屏幕像素坐标反推出来。參考:http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer/
- Normal能够仅仅存两个分量,算法多种多样。float16 精度足矣。參考:http://aras-p.info/texts/CompactNormalStorage.html
- depth事实上无需占用RT保存。dx9下的解决方法是depth texture:depth buffer重定向到纹理输入。
G-Buffer还是太臃肿了:
- MRT技术是有。但不代表其优。不管是AMD。还是NVida的优化文档上都说了要尽量避免MRT这回事
- 复杂的渲染方案必须须要相应着一大堆參数要塞进MRT中
- 假设引擎中的物件渲染风格不一样(比方RGame),必然须要额外的空间来存储类似MaterialID这种东西,灵活性不够
因此Deferred Lighting的思想被提了出来:
- 对照deferred shading : deferred shading 是将全部的shading都移到deferred 阶段进行
- deferred lighting的本质:deferred lighting的deferred阶段仅仅进行lighting计算,从而和材质无关。
- 最大优点:节省带宽。
- 如今的G-Buffer:normal--保存两个float16分量;position--由深度重建而深度保存在depth texture所以这里不占用G-Buffer;specular factor。
仅仅须要一张RT足矣。
- lighting pass的输出: 累积的diffuse + 累计的specular 亮度(仅仅能牺牲掉specular的颜色了)
- 遗憾:终于的着色还是须要额外的pass,前一篇提到的“屏幕空间的、与几何体复杂度无关的O( m + n) 的计算优势”仅仅能运用到lighting计算上。
总结:
- Deferred shading : 伴随着MRT有巨大的带宽消耗。灵活性也不佳,发展前途不大;
- Deferred lighting : 尽管仅仅有光照计算是屏幕空间的。且相对Deferred shading每一个物体多了1个pass。但节省带宽且相当灵活,眼下是各大引擎的上上选。
Deferred Rendering(二)G-Buffer的组织的更多相关文章
- Tutorial - Deferred Rendering Shadow Mapping 转
http://www.codinglabs.net/tutorial_opengl_deferred_rendering_shadow_mapping.aspx Tutorial - Deferred ...
- Tile-Based Deferred Rendering
目前所有的移动设备都使用的是 Tile-Based Deferred Rendering(TBDR) 的渲染架构.TBDR 的基本流程是这样的,当提交渲染命令的时候,GPU 不会立刻进行渲染,而是一帧 ...
- NIO(二、Buffer)
目录 NIO(一.概述) NIO(二.Buffer) Buffer 前文讲了NIO与IO的区别,那么这一章开始讲述NIO下核心类 - Buffer类 上一章就说过,NIO的核心包括三个部分:通道(Ch ...
- 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 二 tbr and tbdr 优化建议tiled based deferred rendering
http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf tbr 和tbdr ...
- Java NIO系列教程(三-十二) Buffer
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...
- 理解twisted中的reactor和deferred(二)
Deferred可以添加多个回调函数,每个回调函数的结果作为下一个回调函数的参数 代码实例(可在pycharm中运行,摘自 https://twistedmatrix.com/documents/cu ...
- [ZZ] Deferred Rendering and HDR
http://www.gamedev.net/topic/496785-deferred-rendering-and-hdr/ Quote: Original post by jstrohYeah I ...
随机推荐
- zabbix4.2学习笔记--zabbix安装
环境 系统信息 发行版 版本 ip 关系 主机名 centos 7.5 192.168.181.135 服务端 server centos 7.5 192.168.181.136 客户端 client ...
- opencv笔记
加载图像: OpenCV支持图像格式Windows位图(bmp),便携式图像格式(pbm,pgm,ppm)和Sun光栅(sr,ras). Mat image = imread( imageName, ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...
- html页面比较长,如何用js实现网页一打开显示在网页的中部?
加入js代码 <style type="text/css"> body { height: 2000px; } </style> <script ty ...
- 诊断:MRP0: Background Media Recovery terminated with error 1111
表现: 灾备环境,无法继续应用日志. 日志: MRP0: Background Media Recovery terminated with error 1111 Fri Jan 18 15:55:2 ...
- 原生j获取元素的几种方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java中Date类型的工具类
package com.mytripod.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import ja ...
- PHP:Mysql判断KEY是否存在 如果存在走修改 如果不存在走添加
文章来源:http://www.cnblogs.com/hello-tl/p/7738113.html 0.PHP代码 <?php /** * POST 传参 * * 例子 添加修改 使用同一个 ...
- 【BZOJ 2118】 墨墨的等式(Dijkstra)
BZOJ2118 墨墨的等式 题链:http://www.lydsy.com/JudgeOnline/problem.php?id=2118 Description 墨墨突然对等式很感兴趣,他正在研究 ...
- 学习javascript中的事件——事件处理程序
事件就是用户或浏览器自身执行的某种动作.诸如 click.load 和 mouseover ,都是事件的名字.而响应某个事件的函数就叫做事件处理程序(或事件侦听器).事件处理程序的名字以“on”开头, ...