20.Shader多类型光源
目录
1,渲染路径
2,不同光源光照处理
1.渲染路径(理论)
Unity中, 有3种渲染路径(Rendering Path),分别是
前向渲染 , 延迟渲染 , 顶点照明渲染(弃用)

前向渲染
前向渲染: 有深度缓冲区和颜色缓存区, 由深度判断一个像素是否可见, 如果可见则更新缓冲区颜色
每次进行一次完整的前渲染,都需要渲染该对象的渲染图元,
对于每个逐像素光源,我们都需要进行上面一次完整的渲染流程。如果一个物体在多个逐像素光源的影响区域内,那么该物体就需要执行多个Pass,每个Pass 计算一个逐像素光源的光照结果,然后在帧缓冲中把这些光照结果混合起来得到最终的颜色值。
延迟渲染
延迟渲染分两个pass,
第一个pass: 不计算光照, 只计算哪些片元可见, 将可见的片元的相关信息存到G-bufffer中 (Geometry几何)
第二个pass:利用G-buffer中的信息, 如法线、视角方向、漫反射系数,对片元进行真正的光照计算
优点: 适用于多光源的场景
缺点: 不支持抗锯齿 , 不能处理半透明, 对显卡有一定要求。
显卡必须支持 MRT (Multiple RenderTargets)、Shader Mode 3.0及以上、深度渲染纹理以及双面的模板缓冲。
2.不同光源光照
介绍
1.平行光: 没有位置, 只有方向, 没有光照衰减
2.点光源: 它呈球体往四周散射 , 随距离光照衰减
3. 聚光灯: 锥形光, 和点光源差不多
接收光照处理
思路:
使用两个pass, 并将光照结果混合。
普通平行光照 LightMode=ForwardBase
追加光照 LightMode = ForwardAdd
混合方式:Blend One One
追加光照结果 = 普通平行光照*光照衰减值
核心代码
(Lighting_specular.shader基础上修改)
完整代码:https://github.com/smartgrass/MyCodes/blob/main/ShaderLearning/Lighting_mult.shader

代码解释
Tags{"LightMode"="ForwardBase"} 和 ForwardAdd 标记光照输入类型
#pragma multi_compile_fwdbase ForwardBase模式编译指令
#pragma multi_compile_fwdadd ForwardAdd模式编译指令
#ifdef USING_DIRECTIONAL_LIGHT 平行光宏
UNITY_ATTEN_CHANNEL 用来兼容不同平台的光照衰减通道,一般来说是r通道。
Blend One One 设置线性混合
_LightTexture0 光照衰减纹理 , Unity为减少计算量, 衰减结果做成表
dot(lightCoord,lightCoord) 灯与顶点于距离的平方,作为查询衰减值的坐标
总结
对追加光源的处理, 只要将LightMode设为ForwardAdd, 便能用获取到额外的光照信息,比如_LightColor0.xyz
追加的pass使用 Blend One One,将普通光照结果与追加光照结果混合
其他
多个光源的渲染顺序: 近的光源优先, 亮度大的优选。
与光源强度、颜色和距离物体的远近有关系, 具体关系Unity官方没说明
光的衰减公式,Unity官方没说明
可以使用距离反比来计算
fixed atten = 1.0/_distance;
衰减公式还原见大佬的文章
https://zhuanlan.zhihu.com/p/113087810