Shader学习的基础知识(九)复杂的灯光概念
这里只是讲一些概念,代码还不能拿到工程里面去用的,但这些概念可以说是超级重要,一步步来,不要着急。
这里的讨论的是当我们在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以上…这里不细说…
上一篇: QT新开线程中需要使用主线程的变量
下一篇: OpenGL-渲染光照球体