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中使用可以开启阴影,可以提换上一句。

前向渲染内置灯光变量

名称类弄描述
_LightColor0float4该 Pass处理的逐像素光源的颜色
_WorldSpaceLightPos0float4该 Pass处理的逐像素光源的位置,如果是平行光,则是0
_LightMatrix0float4X4世界空间到光源空间的变换矩阵
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0float4仅用于Base Pass前四个重要点光源在世界的位置
unity_4LightAttenfloat4仅用于Base Pass前四个重要点光源的衰减引子
unity_LightColorhalf4[4]仅用于Base Pass前四个重要点光源的颜色

前向渲染内置灯光函数

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

顶点照明路径

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

延迟渲染路径

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值