shader入门精要读书笔记19 Unity的渲染路径

一、前言

渲染路径决定光照是如何应用到Untiy Shader中的,只有给Shader正确的选择和设置需要的渲染路径,Shader的光照计算才能被正确执行。

UNTIY支持多种类型渲染路径:前向渲染路径、延迟渲染路径、顶点照明渲染路径。
Unity5之后,顶点照明渲染路径北删除(但可以使用兼容),延迟渲染路径更新。

大多数情况一个项目只使用一种渲染路径。
整个项目渲染路径设置方法:Edit->Project Setting->Player->Other Settings->Rendering Path。
默认情况下,该项选择的是 前向渲染路径。

如果需要使用多个渲染路径,可以在不同的摄像机组件内Rendering Path中设置,
里面第一项Use Player Setting是使用系统的,如果需要不同选择其他即可。

完成上面设置后,我们需要在Pass中使用标签指定该Pass使用的渲染路径。
给一个Pass指定渲染路径其实是和Unity底层做了一个重要的沟通,设置标签后,相当于告诉Untiy,将光照属性等信息,按照相应渲染类型的流程准备好,之后我们才可以通过Unity内置的光照变量来访问这些属性。

Tags{“LightMode”="ForwordBase"}

二、前向渲染路径

前向渲染原理:

每进行一次完整的前向渲染渲染对象的图元一个Pass,我们都需要计算两个缓冲区的信息,一个是颜色,一个深度缓冲区。
先进行深度缓冲区测试,判断一个片元是否可见。
再更新颜色缓冲区的数值。

每个逐像素光源都需要一个Pass,意味着一个物体在多个光源下,就需要多个Pass来计算,再把这些Pass得到的光照结果 混合 得到最终的颜色值。

N个物体,M个光源,那就是要N*M个光源。
如果有大量的逐像素光照,那么执行的Pass数目也会很大。
因此,渲染引擎通常会限制每个物体的逐像素光照数目。

Unity中的前向渲染:

Unity中前向渲染有3种处理光照的方式:逐顶点、逐像素、球谐函数(SH)处理。
处理光照方式决定于:它的光源类型(点光源、平行光)、它的渲染模式(是否重要)。

渲染模式:RenderMode:auto、important、not important。
如果是important,那么Unity会知道,这是重要光源,当成逐像素光源处理。

Unity会根据光源的远近,强度,对物体的影响大小等等对所有光源进行排序。然后一定数目按照逐像素,剩下最多4个按照逐顶点处理,再剩下的都可以按照SH处理。

Unity中光源判断规则:
场景中最亮的平行光总是按照逐像素。
Not important 会按照逐顶点或者SH处理。
Important 会按照逐像素。
如果以上规则逐像素的光源少于Quality Setting中的逐像素光源数量,那么会有更多的光源按照逐像素的方式进行渲染。

两种标签设置:
1.

Tags{"LightMode"="ForwordBase"}
#pragma mullti_compile_fwdbase

这个可以实现光照纹理、环境光、自发光、阴影(平行光)等等效果。
光照计算:一个逐像素的平行光以及所有逐顶点和SH光源。
2.

Tags{"LightMode"="ForwordAdd"}
Blend One One
#pragma mullti_compile_fwdadd

默认情况不支持阴影,但可以通过#pragma mullti_compile_fwdadd_fullshadows来开启阴影。实际上就是为点光源、聚光灯开启阴影效果。
光照计算:其他影响该物体的逐像素光源计算,每个光源执行一次Pass。
开启了混合模式,因为我们需要光照效果叠加。

———————————————————————————————————

以上两种标签下面的编译指令是为了让Unity可以为相应类型的Pass生成所有需要的Shader变种。

环境光和自发光都是在Bass Pass中计算的,因为我们只需要计算一次。

前向渲染中一个Shader基本上是定义一个 Bass Pass(执行一次),一个Addition Pass(执行多次,取决于逐像素光源数目)。

对于前向渲染来说(即LightMode为ForwardBase或者ForwardAdd),可以使用的内置光照变量和内置光照函数。
在这里插入图片描述
在这里插入图片描述
三、顶点照明渲染路径

它是前向渲染路径的一个子集,也就是说所有在顶点照明渲染路径中实现的前向渲染路径也可以完成。
顶点照明渲染路径对硬件要求最小、运算性能最高,但得到的效果也是最差。
不支持阴影、法线映射、高精度的高光反射等等。

顶点照明渲染路径只需要一个Pass,在这个Pass中我们会计算我们关心的所有光源对物体的照明。

Unity中一个顶点照明的Pass中最多访问到8个逐顶点光源。
内置变量和函数:
在这里插入图片描述

在这里插入图片描述

四、延迟渲染路径

前向渲染的不足就是当场景中有大量的实时光源,性能会急速下降,因为需要很多Pass。

而延迟渲染就是在颜色缓冲和深度缓冲外,还新增了一个G缓冲,这个缓冲中包含了我们所关心的表面(举例摄像机近的一面)的其他信息(法线、位置、光照属性等等)

1.延迟渲染原理:
两个Pass:
第一个Pass我们不进行计算,仅仅关心那些片元是可见的,这个通过深度缓冲来计算。发现一个片元可见,就直接把它存储在G缓冲中。
在第二个Pass中,利用G缓冲区各个片元信息(表面法线、视角方向、漫反射系数等等)进行光照计算。

这两个Pass和我们场景中包含的光源数目是没有关系的,
也就是说延迟渲染路径效率不依赖场景的复杂度,而是和我们所使用的屏幕空间大小有关系。
我们可以认为所存储在缓冲区内的是一张张2D图像,我们计算就是在这些图像空间中完成的。

2.Unity中的延迟渲染

Unity中有两种:一种新一种旧,只是使用了不同的技术权衡不同需求。
旧版本不支持物理的 Standard Shader。

如果场景中有大量的实时光照,那么就选用延迟渲染路径。
延迟渲染路径中,每个光源都可以按照逐像素的方式处理。

缺点:
不支持真正的抗锯齿功能
不能处理半透明物体
对显卡有要求

G缓冲区有几种存储的渲染纹理类型:
RT0: 存储漫反射颜色,A通道没有使用
RT1:存储高光反射颜色,A通道存储高光反射指数部分
RT2:存储法线,A通道没有使用
RT3:存储自发光、lightmap、反射探针
深度缓冲、模板缓冲。

默认情况使用Unity内置的Standard光照模型,如果想使用其他的,需要替换文件。188页。

内置变量:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值