今天我们来学习unity中的自定义光照
Unity 中的菲涅尔效应
核心原理
菲涅尔效应描述的是:物体表面的反射率随观察角度变化。
- 正对观察(视线与法线夹角小)→ 反射弱,漫反射/折射强
- 掠射观察(视线与法线夹角大,接近平行表面)→ 反射强
典型例子:看一池水,垂直往下看能看到水底;远处水面像镜子一样反射天空。
在 Unity 中的实现方式
| 方式 | 说明 |
|---|---|
| 菲涅尔方程(物理准确) | 基于折射率计算,用于 PBR(基于物理的渲染)材质 |
| Schlick 近似 | 最常用的简化公式:F = F0 + (1 - F0) * (1 - cosθ)^5 |
| 内置 Shader | Standard/URP/HDRP 的金属度/光滑度工作流程已自动包含 |
实际应用场景
- 边缘光(Rim Light):角色轮廓发光
- 玻璃/水面:边缘反射更强
- 全息/护盾效果:视角相关的透明度变化
- 卡通渲染:描边或边缘染色
简而言之就是物体在你观察时变得更易反射的原理
我们有的时候从unity商店下载的资源会显示不出来,这个是因为渲染管不适配导致的,有的材质之前是用Built in渲染管,而我们使用的是URP渲染管

我们只需要选中这个material然后改成URP渲染即可


这样就可以使用我们的材质了
事实上shadergraph已经内置了菲涅尔反射的支持
比如我们将光滑度smoothness改成0,此时的材质就是一张不反光的普通贴图
但是如果我们将其数值调大就可以看到明显的反光


我们可以自己创建一个material
首先像之前那样创建基础色和基础纹理,选择无光照unlit着色器

然后创建菲涅尔节点和浮点类型的Fresnelpower节点控制fresnel的强度

强度默认为1 改为slider滑块,范围0~20
然后用FresnelColor控制颜色,使用HDR


我们改动强度值就可以看到这个材质的反光了

漫反射光
我们像之前那样创建颜色和纹理节点
实现卡通渲染效果
然后我们实现光源的计算, 这里需要介绍几个节点
为了满足这个n⋅l=∣n∣∣l∣ 我们需要这些节点
main light direction表示从光源到物体的方向,所以用negate节点取反获得从物体表面到光源的方向,接着计算nagate输出的反向向量与normal vector输出的法线向量的点积

以上我们已经完成了光照的计算,有两种实现方式来实现渲染

如图,我们有两个节点,分别为step节点和smoothstep节点,由图像你就可以很清楚的看出二者的区别
这两个最明显的区别就是step当in输入值小于edge阈值的时候节点输出0,0是黑色,1是白色,我们可以通过控制阈值实现,不过这个明暗过度非常生硬
所以smoothstep可以实现平滑过渡,这个函数具有缓冲区域输出值在此区间内会从0平滑过渡到1,所以这个拥有两个边界值,当 in输入值< edge1输出位0 ,当in输入值 > edge2输出为1,如果in输入值位于 edge1和edge2之间,那么输出将会是介于0~1之间的某个值

我们添加一个vector2的值cutoff thresholds用split分割出x和y来控制两个阈值,分别设置为-0.05和0
不过为了更直观添加一个ambient light strength的浮点节点来控制环境光强度,我们将其设置为(0~1)的slider滑块
Lerp(Linear Interpolation,线性插值)是 Shader Graph 中最常用、最核心的混合节点,它的作用很简单:
在两个值之间,按一个百分比取中间值。
数学公式
Lerp(A,B,T)=A+(B−A)×T=A×(1−T)+B×T
| 参数 | 含义 |
|---|---|
| A | 起始值(T=0 时的结果) |
| B | 目标值(T=1 时的结果) |
| T | 混合因子(0~1),也叫”权重” |
直观理解
想象一条从 A 到 B 的线段,T 就是你走到的位置:
graph LR
A["🅰️ A
T=0"] -->|"25% B"| P1["T=0.25
75%A+25%B"]
P1 -->|"50% B"| P2["T=0.5
中间值
50%A+50%B"]
P2 -->|"75% B"| P3["T=0.75
25%A+75%B"]
P3 -->|"100% B"| B["🅱️ B
T=1"]
style A fill:#e74c3c,stroke:#c0392b,stroke-width:3px,color:#fff
style B fill:#3498db,stroke:#2980b9,stroke-width:3px,color:#fff
style P1 fill:#c0392b,stroke:#a93226,stroke-width:2px,color:#fff
style P2 fill:#8e44ad,stroke:#7d3c98,stroke-width:2px,color:#fff
style P3 fill:#2980b9,stroke:#2471a3,stroke-width:2px,color:#fff
然后将我们smoothstep的输出值放入T槽,将ambient light strength值放入A槽,B槽保持默认的1,这样我们只需要改动A槽就可以了
我们将这个材质添加到物体上,但是你可以看到阴影面黑的离谱,这个只需要调整环境光强度即可

这样就正常多了,这个可以自己调整x y 还有光照强度尝试一下




评论区