开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1904

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1514|回复: 8

[zhang273162308] Unity&Shader高级篇-渲染路径(Rendering Paths)

[复制链接]  [移动端链接]
排名
104
昨日变化

108

主题

526

帖子

6230

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
87
蛮牛币
2757
威望
0
注册时间
2013-9-10
在线时间
1286 小时
最后登录
2017-10-18

专栏作家社区QQ达人活力之星游戏蛮牛QQ群会员蛮牛哥

发表于 2016-12-4 18:05:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 仅为年时 于 2016-12-29 17:02 编辑

一、前言

在Unity的Camera中常常会看到一个Rendering Paths的选项,里面有5个选项,其中两个比较重要的选项分别是“Deferred Shading”和“Forward Rendering”,在我还是初学Unity的时候,并没有在意太多。如今随着学习Shader的深入慢慢领会到了这两个渲染路径的重要性。下面就这两个渲染路径的区别和优缺点做一个学习记录。主要参考文献
维基百科:Deferred_shading
Unity官网:Deferred shading rendering path
Forward Rendering vs. Deferred Rendering
在介绍这两个渲染路径的开始不得不先介绍一下现在的图形渲染管线,如图所示为一个现代GPU的渲染过程。因为,硬件的限制,我们不能改变如何绘制单个的像素,只能通过给硬件输送不同的纹理来进行改变。自从有了可编程图像管线,我们现在可以通过代码来修改顶点,或扭曲或移动来改变像素的外观,至此从本质上改变图形硬件如何渲染目标物体。
shader-pipeline-v2.png
首先要介绍的就是常用的延迟着色渲染(Deferred Shading)

二、延迟着色渲染(Deferred Shading)

1、介绍
在计算机3D图形学中,延迟渲染技术是一种在屏幕坐标空间渲染的技术。所谓延迟渲染,即在顶点和片段着色器中的第一个通道中没有真正的渲染被执行,而是延迟到第二个通道中被渲染。
在第一个通道中,仅仅是收集渲染所需的计算数据。每个表面的位置、法线和材质信息被渲染到几何缓冲区(G-Buffer)中,这种渲染技术被重围渲染到纹理技术。之后,片段着色器使用贴图缓冲信息在屏幕坐标空间为每一个像素计算直接或间接的光照。屏幕坐标空间方向的遮挡能作为延迟渲染管道的一部分,给物体的阴影和相互之间的光照反射提供方向性。如图所示为延迟着色的渲染过程



1.1、漫反射颜色几何缓冲区


1.2、深度缓冲区(Z-buffering)


1.3、表面法线几何缓冲区

1.4、最后的合成效果(图中还含有阴影,
因此计算阴影映射和阴影
卷必须和延迟渲染一起使用)
2、优点
延迟着色的主要优点是场景几何面的渲染和光照渲染的解耦。只需要一个几何通道,并且每个光源只计算它实际影响的那些像素。这为GPU在场景中有多个光源的渲染减少了性能上的开销。还有一些附加在这个上面的优点,如,对复杂的光源管理更为方便、其他的着色器资源也易于管理以及简化软件渲染流水线。
3、缺点
延迟渲染的关键缺点就是它不能处理算法内的透明度,虽然这个问题在Z缓冲(深度缓冲)场景中是一个常见的问题,通常的处理方法都是采用将场景中的透明部分进行排序和延迟。深度剥离在延迟渲染中可以被用来实现顺序无关的透明度,但是付出的代价就是增加几何缓冲区(G-Buffer)和附加批次的大小。
支持DirectX 10以及更高版本的现代GPU显示硬件通常能够足够快的执行批次处理,以保持交互式帧率的稳定。当需要产生顺序无关的透明度时(通常在一些游戏中),延迟渲染并不会比正向渲染使用相同的技术有效。

(注:延迟渲染在正交摄像机模式下也是不支持的,如果摄像机切换到了正交模式之后就会默认使用正向渲染)

       延迟着色中的实时渲染开销与由光照射的像素的数量成比例,并且不依赖于场景复杂度。因此,小小的点光源和聚光源都是开销非常小的渲染,特别是不会穿过摄像机的近平面的点光源和聚光源,渲染开销就更小。另外,带阴影的光源比不带阴影的光源开销要更高。因为在延迟渲染中,阴影投射到的物体上需要为每个阴影投射光渲染一次或多次。
另外一个比较严重的缺点是使用多材质比较困难。要使用多材质不是不可能,需要在几何缓冲区存储更多的数据,这就需要更大的内存宽带。
       一个更致命的缺点是,由于光照和几何渲染的分离,导致抗锯齿变得不稳定,主要是因为这种分离会导致内插子样本会产生不稳定的位置、法线和切线属性。克服这种限制的常用方法是在最终的图像上使用边缘检测,然后在边缘上使用模糊处理。而且,如今有更高级的边缘平滑处理技术,如MLAA(Efficiently MovingAntialiasing from the GPU to the CPU,https://software.intel.com/sites/default/files/m/d/4/1/d/8/MLAA.pdf),时间反混叠法(Temporal anti-aliasing https://en.wikipedia.org/wiki/Temporal_anti-aliasing用在虚幻引擎中),尽管它不是一个完全的边缘平滑处理技术,但是能使得给定的边缘一个平滑的表面。
4、延迟光照(内容有争议)
       延迟光照是延迟渲染的修订。这个技术在延迟渲染的时候使用了3个通道,而不是2个。第一个通道覆盖了场景几何体,仅仅将计算每个像素照明所必需的属性写入几何缓冲区。在屏幕空间,“延迟”通道然后输出仅仅漫反射和高光反射光数据信息,因此,必须在场景上进行第二遍,以回读光照信息和最终输出的逐像素渲染。延迟光照最明显的优点是动态的减少了几何缓冲区的大小。最明显的成本就是需要渲染场景几何体两次而不是一次。另外一个额外的消耗是在延迟光照的延迟通道必须单独输游戏蛮牛2017出漫反射和镜面反射,然而延迟渲染的延迟通道仅仅需要输出一个两者组合的辐射值。
       由于几何缓冲区的大小的减少技术,部分克服了延迟着色的一个严重缺点—多个材质。
5、Unity中的延迟渲染
       当使用延迟渲染,影响一个游戏物体的光照的光源数量没有限制。所有光源都是逐像素评估,这就意味着它们都与法线贴图进行正确的交互。另外,所有光源都有Cookies和阴影。
       它要求显卡具有MRT(多渲染目标),渲染模型3.0或者更高,并且支持深度渲染纹理。在2006年之后的PC显卡都支持延迟渲染技术,如GeForce 8xxx、Radeon x2400和Intel G45。在手机端,延迟渲染是不支持的。
(注:延迟渲染在正交摄像机模式下也是不支持的,如果摄像机切换到了正交模式之后就会默认使用正向渲染)
       延迟着色中的实时渲染开销与由光照射的像素的数量成比例,并且不依赖于场景复杂度。因此,小小的点光源和聚光源都是开销非常小的渲染,特别是不会穿过摄像机的近平面的点光源和聚光源,渲染开销就更小。另外,带阴影的光源比不带阴影的光源开销要更高。因为在延迟渲染中,阴影投射到的物体上需要为每个阴影投射光渲染一次或多次。



三、正向着色渲染(Forward Rendering)

1、介绍
   正向渲染是标准的多数引擎使用的白箱渲染技术,给图形渲染硬件提供几何图形数据,最后转换并分割为片段或像素,在传递到屏幕之前进行最终渲染。它是线性的,几何图形一个一个的传递到管线中以产生最终图像。
       正向渲染对一个对象会在多个通道上进行渲染,并且渲染取决于影响物体的光源。光源本身也会根据其设置和强度在进行正向渲染的时候进行不同的处理。
2、Unity中使用它
       在正向渲染中,影响每个对象的一些数量的最亮的光源以完全每个像素光照模式渲染。然而,每个顶点最多计算4个点光源。其他光源被计算成球面谐波(Spherical Harmonics),这是更快,但只是一个近似。一个光源是否进行逐像素光照主要依靠以下几点:
●当光源的渲染模式被渲染成Not Important,则光源是进行逐顶点计算或者SH
●最亮的直光源是总是逐像素
●光源渲染模式设置为Important总是逐像素光照
●如果在Quality Setting里面设置的光源数量在上述设置中超过了,那么超过的光源按照亮度的顺序逐像素的渲染。
比如,如果一个物体的渲染被如图2.1所示的A—H的光源影响。假设A到H的光源都有同样的颜色和强度并且渲染模式都是Auto,那么这些光源将按照距离远近的顺序进行排序最后渲染。最近的光源,也即是最亮的光源将被作为逐顶点渲染
如图2.2所示为各个光源的渲染模式。
(注意:光源的重叠)

2.1:影响游戏对象的周围光源


2.2:影响游戏对象的周围光源的渲染
3、性能
●球谐波灯的渲染是计算物体的顶点而不是像素,这就意味着它们不支持光源Cookies和法线贴图映射。
●球谐波灯是非常低频的方法。你不能用球谐波渲染进行快速的转换。它们也仅仅影响漫反射光源以及非常低频的高光反射。
●球谐波灯不是局部的;点或者聚光源靠近一些表面的时候会产生混乱和模糊。
总得来说,球谐波是非常适合一些动态的物体。

四、Unity中其他的渲染路径

1、传统延迟光照渲染(Legacy Deferred LightingRendering Path)
       这是随着.0遗留下来的延迟光照特性,新的工程都应该考虑使用前面讲的延迟渲染。
2、顶点光照渲染(Vertex Lit Rendering Path Detail)
       顶点光照渲染通常渲染每一个物体都在一个通道上,计算在物体每个顶点上的所有光源的光。这是最快的渲染方式,并且有着最为广泛的硬件支持。(当然不能工作在控制台上)。因为,所有的光照计算都发生在顶点着色器上,因此这个渲染方式不能计算许多逐像素的效果,比如,阴影、法线映射以及光源Cookies




回复

使用道具 举报

5熟悉之中
643/1000
排名
3655
昨日变化
3

1

主题

82

帖子

643

积分

Rank: 5Rank: 5

UID
148089
好友
0
蛮牛币
1293
威望
0
注册时间
2016-5-10
在线时间
248 小时
最后登录
2017-10-12
发表于 2016-12-4 23:43:34 | 显示全部楼层
最近在研究这个,一定要好好看看

回复 支持 反对

使用道具 举报

5熟悉之中
643/1000
排名
3655
昨日变化
3

1

主题

82

帖子

643

积分

Rank: 5Rank: 5

UID
148089
好友
0
蛮牛币
1293
威望
0
注册时间
2016-5-10
在线时间
248 小时
最后登录
2017-10-12
发表于 2016-12-5 00:08:28 | 显示全部楼层
看得有点艰涩,果然很难
[发帖际遇]: xyx1985feng 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
575/1000
排名
4565
昨日变化
5

1

主题

103

帖子

575

积分

Rank: 5Rank: 5

UID
75054
好友
3
蛮牛币
589
威望
0
注册时间
2015-2-17
在线时间
231 小时
最后登录
2017-8-27
发表于 2016-12-5 14:09:05 | 显示全部楼层
3的标题错了。请检查
[发帖际遇]: slocum 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
575/1000
排名
4565
昨日变化
5

1

主题

103

帖子

575

积分

Rank: 5Rank: 5

UID
75054
好友
3
蛮牛币
589
威望
0
注册时间
2015-2-17
在线时间
231 小时
最后登录
2017-8-27
发表于 2016-12-5 14:21:07 | 显示全部楼层
Forward Rendering既然有逐像素的部分,为什么不支持法线贴图呢。

回复 支持 反对

使用道具 举报

7日久生情
2156/5000
排名
519
昨日变化
2

2

主题

370

帖子

2156

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
63268
好友
0
蛮牛币
53
威望
0
注册时间
2014-12-24
在线时间
566 小时
最后登录
2017-10-18
发表于 2016-12-5 19:53:14 | 显示全部楼层
{:87:}...........

回复

使用道具 举报

排名
104
昨日变化

108

主题

526

帖子

6230

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
87
蛮牛币
2757
威望
0
注册时间
2013-9-10
在线时间
1286 小时
最后登录
2017-10-18

专栏作家社区QQ达人活力之星游戏蛮牛QQ群会员蛮牛哥

 楼主| 发表于 2016-12-8 11:18:16 | 显示全部楼层
slocum 发表于 2016-12-5 14:09
3的标题错了。请检查

太粗心了,啊,啊,,谢谢提醒

回复 支持 反对

使用道具 举报

排名
104
昨日变化

108

主题

526

帖子

6230

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
87
蛮牛币
2757
威望
0
注册时间
2013-9-10
在线时间
1286 小时
最后登录
2017-10-18

专栏作家社区QQ达人活力之星游戏蛮牛QQ群会员蛮牛哥

 楼主| 发表于 2016-12-8 11:44:04 | 显示全部楼层
本帖最后由 zhang273162308 于 2016-12-8 11:46 编辑
slocum 发表于 2016-12-5 14:21
Forward Rendering既然有逐像素的部分,为什么不支持法线贴图呢。

讲真,这部分我也是晕晕乎乎的,另外,还有一个我的撰写错误,应该是球谐波光的计算是逐顶点的,并且因此而不支持法线贴图。我想应该是跟球谐波光的本质有关吧,我将我知道的说一下,不一定准确哈!维基百科里有关于球谐波光的介绍:https://en.wikipedia.org/wiki/Spherical_harmonic_lighting,你可以自己了解一下。
总结上面的说法就是,球谐波会减少贴图映射的细节以便快速渲染,不知是否因此而不支持贴图的映射

回复 支持 反对

使用道具 举报

2初来乍到
108/150
排名
13750
昨日变化
12

0

主题

44

帖子

108

积分

Rank: 2Rank: 2

UID
152727
好友
0
蛮牛币
75
威望
0
注册时间
2016-6-20
在线时间
26 小时
最后登录
2017-8-30
发表于 2016-12-8 16:23:38 | 显示全部楼层
学习了额,很给力

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表