欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Shader学习的基础知识(九)复杂的灯光概念

程序员文章站 2022-06-10 23:48:16
...

这里只是讲一些概念,代码还不能拿到工程里面去用的,但这些概念可以说是超级重要,一步步来,不要着急。
这里的讨论的是当我们在Unity放置了各种光源后,底层是如何让我们在Shader访问它们的,这个字有点多,但也是浓缩中的浓缩了,一个个字看完。

Unity的渲染路径

主要有三种,前向渲染路径、延迟渲染路径、顶点照明路径。
在项目中我们可以设置它**(Rendering Paht)**:
Edit>>Project Settings>>Player>>Other Settings>>Rendering Paht中选择项目所有的渲染路径。这里是设置全部的。摄像机面版里也有这个选项,效果则是针对单摄像机的,选择后会覆盖选择中的选项。
设置完前向渲染后我们通过LightMode来实现:

Pass{
		Tags{"LightMode"="ForwardBase"}
		...
}
标签名 描述
Always 会被渲染,但不计算光照
ForwardBase 用于前向渲染。会计算环境光,最重要的平行光,逐顶点/SH光i源和Lightmaps
ForwardAdd 用于前向渲染。会计算有外的逐像素光源,每个Pass对应一个光源
等等… 后面的暂用不到,就不讲了…

设置完渲染路径后,底层就会按这个渲染路径的流程给我们准备好。

前向渲染路径原理

每进行一次完整的前向渲染,我们需要渲染图元、颜色缓冲区和深度缓冲区。用深度缓冲来决定片元是否可见,可见即更新颜色缓冲。
每个逐像素光源,我们就要跑一次完整的渲染流程。如果一个物体在多个逐像素光源区内,它就要执行多个Pass,每个Pass计算一个逐像素光源结果放在颜色缓冲内。如果有N个物体,每个受M灯光影响那么则需要渲染N*M个Pass。
前向渲染处理光源的方式有三种逐顶点、逐像素、球谐函数(SH)
我们可以把重要的灯光设置为Important,这样底层将会认真对待这个灯光。另外物体受灯光的影响和距离和灯光强度等有关。最多只有四个灯光会被使用逐顶点方式处理,剩下的使用SH方式处理。

Base Pass
最主要的平行光,自然光等在这里进行计算,还用于一些光照特性、阴影(默认不开)等,这个对环境光和自发光等计算一次就够了
Pass{
Tags{“LightMode”=“ForwardBase”}
#pragma multi_compile_fwdbase
}
Additional Pass
这个会对多个光照计算多次,把别的光源计算进行,如点光源,聚光灯等…混合模式通用使用One One因为他是叠加的。
Pass{
Tags{“LightMode”=“ForwardAdd”}
Blend One One
#pragma multi_compile_fwdadd
}
#pragma multi_compile_fwdbase
只有在Base Pass中使用这两个编译指令才会得到正确的光照变量、如光照衰减等…
#pragma multi_compile_fwdadd
只有在Additional Pass中使用这个编译指令才会得到正确的光照…
#pragma multi_compile_fwdshadows
在Additional Pass中使用可以开启阴影,可以提换上一句。

前向渲染内置灯光变量

名称 类弄 描述
_LightColor0 float4 该 Pass处理的逐像素光源的颜色
_WorldSpaceLightPos0 float4 该 Pass处理的逐像素光源的位置,如果是平行光,则是0
_LightMatrix0 float4X4 世界空间到光源空间的变换矩阵
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0 float4 仅用于Base Pass前四个重要点光源在世界的位置
unity_4LightAtten float4 仅用于Base Pass前四个重要点光源的衰减引子
unity_LightColor half4[4] 仅用于Base Pass前四个重要点光源的颜色

前向渲染内置灯光函数

函数名 描述
float3 WorldSpaceLightDir(float4 v) 仅用于前向渲染,给一个模型空间顶点,返回世界空间该点到到光源的方向,没有归一化
float3 UnityWorldSpaceLightDir(float4 v) 仅用于前向渲染,给一个世界空间顶点,返回世界空间该点到到光源的方向,没有归一化
float3 ObjSpaceLightDir(float4 v) 仅用于前向渲染,给一个模型空间顶点,返回模型空间该点到到光i源的方向,没有归一化
float3 Shader4PointLights(float4 v) 仅用于前向渲染,计算四个点光源的光照,参数是打包进失量的光照数据 ,用常用这个计算逐点光照

顶点照明路径

对硬件要求最少,性能最高,效果最差。不支持像素级别的效果,如阴影、法线映射、高精度高光等…
拥有最广泛的硬件支持,但在游戏机上不支持。这里不细说了…

延迟渲染路径

遗留的渲染路径,适用于光源数目很多的场景下。
不支持真正的抗锯齿
不能处理半透明物体
对显卡有一定要求,必须支持MRT、shader Mode3.0以上…这里不细说…