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处理,网格物体也不能接受阴影,只能用四个

使用它需要一个支持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  http://blog.csdn.net/wolf96

渲染路径-Unity5 的新旧推迟渲染Deferred Lighting Rendering Path的更多相关文章

  1. Unity5 的新旧延迟渲染Deferred Lighting Rendering Path

    unity5 的render path ,比4的区别就是使用的新的deferred rendering,之前的4的deferred rendering(其实是light prepass)也被保留了下来 ...

  2. 渲染路径-surface shader 光照函数与渲染路径

    https://docs.unity3d.com/Manual/SL-SurfaceShaderLighting.html Lighting Model declaration Lighting mo ...

  3. 新旧Django版本中urls与path的区别

    from django.conf.urls import url from . import view urlpatterns = [ url(r'^hello$', view.hello),] 新版 ...

  4. Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解

    简述 Unity supports different Rendering Paths. You should choose which one you use depending on your g ...

  5. 基于Webkit的浏览器关键渲染路径介绍

    关键渲染路径概念 浏览器是如何将HTML.JS.CSS.image等资源渲染成可视化的页面的呢?本文简单介绍一下渲染过程中涉及到的关键步骤. 该过程分为四步:模型对象的构建.渲染树构建.布局.绘制. ...

  6. 渲染路径-Deferred Lighting 延时光照

    http://blog.csdn.net/heyuchang666/article/details/51564954 注意: 最后3个步骤注意下 延时光照是有着最高保真度的光照和阴影的渲染路径.如果你 ...

  7. Light Pre-Pass 渲染器----为多光源设计一个渲染器

    http://blog.csdn.net/xoyojank/article/details/4460953 作者: Wolfgang Engel, 原文: http://www.wolfgang-en ...

  8. RenderingPath 渲染路径

    http://blog.csdn.net/lichaoguan/article/details/42554821 RenderingPath 渲染路径 Deferred Lighting 延时光照 延 ...

  9. 渲染路径-u3d渲染路径比较

    Unity支持不同的渲染路径.应具体取决于你的游戏内容和目标平台/硬件来选择使用哪一个.不同的渲染路径有不同的特点和性能特点,主要影响灯光和阴影.        项目所使用的渲染路径在Player S ...

随机推荐

  1. Java for LeetCode 120 Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  2. 话说文件系统——aufs源码分析(三)【转】

    本文转载自:http://www.cnblogs.com/xie0812/p/8848185.html 1. linux中设备驱动的入口都是:module_init(xxx_init);里面注册的函数 ...

  3. datax 添加oraclewriter

    日期格式: <param key="dtfmt" value="yyyy-MM-dd hh24:mi:ss"/>

  4. python二叉树的遍历,递归和非递归及相关其它

    # encoding=utf-8class node(object): def __init__(self,data,left=None,right=None): self.data = data s ...

  5. eclipse批量修改package、import中的包名

    问题:想把以前开发的包,用到新项目中,怎么操作呢? 解决方案: 把文件夹复制到新项目包中,同时需要更改很多package.import中的包名第一步:打开一个java文件,选中要替换的字段: 第二步: ...

  6. HTML布局之左右结构,左边固定右边跟据父元素自适应

    HTML布局之左右结构,左边固定右边跟据父元素自适应,兼容IE6+.Firefox.Chrome.Opera.Safari,这里是用表单写的一个demo,其实就在主体布局中也是可以的,比如像后台一些管 ...

  7. html5--1.14 特殊符号的使用

    html5--1.14 特殊符号的使用 学习要点: 实体的概念一个表格小实例 1.HTML 实体 在 HTML 中,某些字符是预留的. 在 HTML 中不能使用小于号(&lt)和大于号(&am ...

  8. ffmpeg给视频加文字水印

    ffmpeg -i dd2800.mp4 -vf "drawtext=fontfile=Arial.ttf: text='Hu':x=100:y=10:fontsize=24:fontcol ...

  9. c# 实现WebSocket

    用C# ASP.NET MVC 实现WebSocket ,对于WebSocket想必都很了解了,不多说. 东西做的很粗糙 只能实现基本的聊天功能,不过基本的通信实现了,那么后序的扩展应该也不难(个人这 ...

  10. android自定义控件(三) 自定义属性

    书接上回 在xml里建立属性,然后java代码里用typedArray获得这些属性,得到属性后,利用属性做一些事.例:得到xml里的color,赋给paint. 1.在res/values/下新建at ...