欢迎光临散文网 会员登陆 & 注册

20.Shader多类型光源

2023-06-10 18:24 作者:机智的小草yns  | 我要投稿

目录

    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


20.Shader多类型光源的评论 (共 条)

分享到微博请遵守国家法律