Unity5 的新旧延迟渲染Deferred Lighting Rendering Path
unity5 的render path ,比4的区别就是使用的新的deferred rendering,之前的4的deferred rendering(其实是light prepass)也被保留了下来。
Legacy Deferred Lighting Rendering Path(light prepass)
老 旧的Deferred Rendering Path,使用了light prepass渲染。因为它是老旧的(unity5之前的Deferred Lighting,但是unity5还留着它使用),所以不支持一些新的渲染特性,比如unity5的新pbr shader standard shader,还有新的reflection probes。可以换成新的Deferred Lighting。
好处就是没有对光源个数
限制,因为它把所有光照计算所需要的数据都渲染到了render
target中。所有的光照都是逐像素计算,可以与法线贴图正确交互。所有的光都有cookies和阴影。因为它是逐像素计算光照,所以不像顶点着色多边
形明显,不真实。逐顶点光照,就是在vetext
shader中计算光照颜色,每个顶点计算一次光照,再进行插值。逐像素计算光照就是每个像素都计算光照,在fragement shader中计算。
light prepass渲染中的开销与光找到的像素数量呈正相关,与场景复杂度无关,与光的体积范围相关,与被照亮的物体个数无关。所以,使光的体积变小可以提升性能。
light
prepass渲染不支持抗锯齿,也无法处理半透明物体,半透明物体如图所示将会用forward
rendering处理,网格物体也不能接受阴影,只能用四个camera culling masks,(官方文档解释: You can only
use up to four culling masks. That is, your culling layer mask must at
least contain all layers minus four arbitrary layers, so 28 of the 32
layers must be set. Otherwise you will get graphical artefacts.)
使用它必须定义Shader Model 3.0以上,支持Depth render textures和two-sided stencil buffers。2004年后的大部分的pc都支持light prepass
light prepass的消耗全部来自光照射到物体需要渲染的像素个数,完全不取决于场景复杂度,所以小的点光源,和spot光,或者光照被遮挡,都是消耗很少的(优化可以从此处下手)。为了产生阴影也要渲染几次,所以阴影也有部分开销。
light prepass在unity中需要3个pass
1. Base Pass:首先计算屏幕空间缓冲信息:depth, normal,和specular power
2. Lighting pass: 使用上面的缓冲信息在其他的缓冲区计算光照
3. Final pass: 物体再次渲染,获取上面计算的光照和贴图再加上环境光/自发光等等混合在一起。
过程如下图所示,
如果物体的shader不能用light prepass处理,则会用forward rendering处理。
Base Pass
在这个pass中先渲染一遍物体,把view space的 normal和 specular power存在一张 ARGB32 Render Texture中,normal使用agb通道,specular使用a通道。
Base Pass的结果就是把场景信息和一张 Render Texture填充在z buffer中。
Lighting Pass
Lighting
Pass就是通过depth,normal和specular power计算光照。光照在screen
space进行计算,所以消耗与需要计算的时间不取决于场景复杂程度。光照缓冲信息存在一张 ARGB32 Render
Texture中,它包括漫反射光照在rgb通道,高光强度在a通道。光照值用 logarithmic
encode可以有更好的动态范围。当camera 的HDR选项被选择,光照缓冲信息使用ARGBHalf 格式,不使用 logarithmic
encode。
final pass
所有物体再一次全部渲染,获取光照并与贴图和环境光混合计算。Lightmaps也在final pass
中使用。相机离得近的地方进行实时光照,只烘焙 indirect lighting。相机离得远的地方,光全部烘焙。
Deferred Lighting Rendering Path
unity5新的deferred rendering。
最大的好处就是不限制光源数量。所有的光照都是逐像素计算,可以与法线贴图正确交互。所有的光都有cookies和阴影。
使用G-Buffer 的前提是这些数据可以一次性写入多个render target, 即Multiple-Render-Target (MRT).
deferred rendering中的开销与光找到的像素数量呈正相关,与场景复杂度无关,与光的体积范围相关,与被照亮的物体个数无关。所以,使光的体积变小可以提升性能。
deferred rendering不支持抗锯齿,也无法处理半透明物体,半透明物体如图所示将会用forward rendering处理,网格物体也不能接受阴影,只能用四个
延迟渲染不能渲染半透明的原因gpu pro2给出了解释:
In particular, deferred rendering solutions have difficulty representing transparent materials, because information regarding surfaces seen through the material would be discarded. 是因为被discard掉了。
使
用它需要一个支持Multiple Render Targets (MRT)的显卡,必须定义Shader Model 3.0以上,支持Depth
render textures和two-sided stencil buffers。2005年后的大部分的pc都支持deferred
rendering。
deferred rendering的消耗全部来自光照射到物体需要渲染的像素个数,完全不取决于场景复杂度,所以小的点光源,和spot光,或者光照被遮挡,都是消耗很少的(优化可以从此处下手)。为了产生阴影也要渲染几次,所以阴影也有部分开销。
在deferred rendering中经过两个pass
1.
G-buffer pass:所有物体先渲染一遍,计算出diffuse color,specular color , smoothness,
world space normal,emission和depth,存在screen space 缓冲信息中。
2. Lighting pass:增加光照到前面的emission缓冲信息中。
基本如下图所示(unity 在G-buffer中生成的信息比图中要多具体看1)
如果物体的shader不能用light prepass处理,则会用forward rendering处理。
默认 g-buffer布局,4个render targetRT0,RT1,RT2,RT3:
RT0, ARGB32 格式: Diffuse color (RGB), 不使用(A).
RT1, ARGB32格式: Specular color (RGB), roughness (A).
RT2, ARGB2101010格式: World space normal (RGB), 不使用(A).
RT3, ARGB32 (non-HDR) 或 ARGBHalf (HDR) 格式: Emission + lighting + lightmaps + reflection probes buffer.
Depth+Stencil buffer.
ARGB32:每个通道8位整型
ARGBHalf
:每个通道16位浮点型(所以在相机HDR模式使用这种格式储存光照可以获得更大动态范围,光照细节更细致。但是有些图形卡不支持浮点型的render
texture,使用需注意,可以用使用SystemInfo.SupportsRenderTextureFormat检查)
所以g-buffer中在无HDR情况下是160bits/像素,有HDR情况下是192/像素。
G-Buffer Pass
每
个物体都渲染一次,Diffuse, specular, surface smoothness, world space normal,
和emission+ambient+reflections+lightmaps 被渲染进
g-buffer贴图。g-buffer贴图作为材质的全局参数可以被使用(名字叫CameraGBufferTexture0 ..
CameraGBufferTexture3)
Light Pass
在Light Pass中通过g-buffer和depth计算光照,在screen space中计算,所以消耗与需要计算的时间不取决于场景复杂程度。光照信息存储在emission缓冲中。
参考:http://docs.unity3d.com/Manual/RenderTech-DeferredShading.html
http://blog.csdn.net/xoyojank/article/details/4460953
-----by wolf96
Unity5 的新旧延迟渲染Deferred Lighting Rendering Path的更多相关文章
- 渲染路径-Unity5 的新旧推迟渲染Deferred Lighting Rendering Path
Unity5 的新旧延迟渲染Deferred Lighting Rendering Path unity5 的render path ,比4的区别就是使用的新的deferred rendering,之 ...
- Deferred shading rendering path翻译
Overview 概述 When using deferred shading, there is no limit on the number of lights that can affect a ...
- 延迟渲染 deferred Shading
流程: 1.先渲染一遍物体的位置,法线 和颜色 到三张纹理 2.在根据这三张纹理渲染一遍灯光 3.合成颜色图和灯光图 (ssao图) 看上去好像灯光不多,其实我在这里加了200个灯, 每个球代表 ...
- 新旧Django版本中urls与path的区别
from django.conf.urls import url from . import view urlpatterns = [ url(r'^hello$', view.hello),] 新版 ...
- jquery源码解析:jQuery延迟对象Deferred(工具方法)详解2
请接着上一课继续看. $.Deferred()方法中,有两个对象,一个是deferred对象,一个是promise对象. promise对象有以下几个方法:state,always,then,prom ...
- Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)【转】
Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置: http://blog.csdn.net ...
- Deferred Shading(延迟渲染)
1.简介 在计算机图形学的词典里,Shading表示“对受光物体的渲染”,这个渲染过程包括下面几步[1]: 1) 计算几何多边形(也就是Mesh). 2) 决定表面材质特性,例如法 ...
- Deferred Shading延迟渲染
Deferred Shading 传统的渲染过程通常为:1)绘制Mesh:2)指定材质:3)处理光照效果:4)输出.传统的过程Mesh越多,光照处理越费时,多光源时就更慢了. 延迟渲染的步骤:1)Pa ...
- unity5.0新功能
原作者 只待苍霞 章节1: 先来两个最关心的新功能, 第一章先讲PBS, 第二章讲光影GI.说到PBS, 首先应该想到的是Unity自带的两个新的Shader, 分别是Standard以及Standa ...
随机推荐
- C# 展开和折叠代码的快捷键
C# 展开和折叠代码的快捷键 VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + ...
- (转)C#中Trim()、TrimStart()、TrimEnd()的用法 .
C#中Trim().TrimStart().TrimEnd()的用法: 这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一个非空格 ...
- winfrom面向对象1
1:面向对象的技术概论 要学习好面向对象,我们应该从三个问题入手: 1.什么是面向对象? 2.为什么要面向对象? 3.该怎么面向对象? 对象的定义是人们要进行研究的任何事物,从最简单的整数到复杂的飞机 ...
- web页面的优化
众所周知,一个web页面通常会包括HTML(XHTML.XML).CSS.Javascript,而其中HTML(XHTML.XML)为结构化语言,用于构建页面结构和相关数据:CSS则负责页面的样式,即 ...
- 【BZOJ3527】【FFT】力
[问题描述]给出n个数qi,给出Fj的定义如下:令Ei=Fi/qi.试求Ei.[输入格式]输入文件force.in包含一个整数n,接下来n行每行输入一个数,第i行表示qi.[输出格式]输出文件forc ...
- 【实习记】2014-08-18使用curl排错http头的content-length
总结一,用curl排错Content-Length设置错误,误导了客户端. 访问/cgi-bin/txproj_list时,firebug显示总是不多不少15秒,调试其他问题时郁闷. fire ...
- php模块参考
<?php //数据库连接类 class ConnDB{ var $dbtype; var $host; var $user; var $pwd; var $dbname; //构造方法 fun ...
- Day15 HTML补充、初识JavaScript
一.上节回顾 上节回顾: HTML 头部信息:编码.title.style.link(导入css文件) 身体: 内联 块级 --->inline-block(既有内联效果又有块级效果) a标签: ...
- java 读入换行
java中实现换行有以下几种方法:1.使用java中的转义符"\r\n": 注意:\r,\n的顺序是不能够对换的,否则不能实现换行的效果. 2.BufferedWriter的new ...
- Java面试题相关内容
选择题(共5题,每题1.5分,共75分.多选题选不全或选错都不得分.)1. 以下属于面向对象的特征的是(C,D).(两项)A) 重载B) 重写C) 封装D) 继承 2. 以下代码运行输出是(C)pub ...