【Unity学习】 Unity中的光照渲染(一)前向渲染和延迟渲染

Unity的渲染路径

现在的Unity渲染路径主要有两种:
一、前向渲染路径(Forward Randering Path)
二、延迟渲染路径(Deferred Rendering Path)
三、顶点照明渲染路径(残留,已被抛弃)
四、旧的延迟渲染路径

在大多数情况下,我们可以通过Edit->Project Settings->Player->Other Settings->Rendering->Path中选择需要渲染的路径,默认是前向渲染路径。
但是我们也可以在Camera中单独设置这个摄像机的渲染路径。

在Shader中,通过指定Pass中的LightMode标签来实现:

Pass{
    Tags { "LightMode" = "ForwardBase" }
    ...

前向渲染路径

传统且常见的渲染方式。
原理:
Unity将各种光照按逐顶点处理、逐像素处理、球谐函数SH等方法计算出并混合。至于怎么处理:
1. 最多有四个光源按逐顶点处理
2. 场景中最亮的平行光是逐像素处理的
3. 被设置成not important,会按逐顶点或SH处理
4. Important的会逐像素处理
5. 如果逐像素渲染的数量小于Quality Setting中的逐像素数量,则会有更多的光源进行逐像素处理

使用#pragma multi_compile_fwdbase这样的编译指令,可以让Pass生成所有需要的Shader变种。

延迟渲染路径

当场景之中包含大量光源的时候,前向渲染的性能会急速下降。所以需要延迟渲染。
延迟渲染使用了一个叫G-缓冲的缓冲区(G-Buffer)。
延迟渲染主要包含了两个Pass
一、在Pass1中,不进行任何光照计算,而仅仅计算哪些片元是可见的,通过深度缓冲技术,如果发现可见,则把它的相关信息存储到G-缓冲中。
二、在Pass2中,理由G-缓冲中的各种信息来进行真正的光照计算。

在Unity的延迟渲染中,每个光源都可以按照逐像素的方式进行处理,但也有缺点:
1. 不支持真正的抗锯齿功能
2. 不能处理半透明物体
3. 对显卡有一定要求

延迟渲染可以访问的内置变量:
_LightColor float4类型 光源的颜色
_LightMatrix0 float4x4类型 世界空间到光源空间的变换矩阵。可以用于采样cookie和光强衰减原理。

Unity的光源类型

Unity内主要支持平行光、点光源(point light)、聚光灯(spot light)、面光源(area light)这四种光源类型。

使用光线性衰减

float distance = length(_WorldSpaceLightPos0.xyz - i.worldPosition.xyz);
atten = 1.0/distance;

使用光线衰减纹理

float3 lightCoord = mul(_LightMatrix0, float4(i.worldPosition, 1)).xyz;
fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;

在这里使用了UNITY_ATTEN_CHANNEL的宏来定义了衰减纹理中衰减值所在的分量

你可能感兴趣的:(Unity)