本篇来了解一下unity中的光照

光照分为漫反射光和全反射光

场景光源主要分为两类:手动添加的实际光源平行光或点光源还有环境光照,后者包括物体间的的间接光反射和天空盒光照

image-20260529140930779

我们选择光照渲染 lit shader graph

Unity 的 Lit Shader(光照着色器)是 URP(Universal Render Pipeline,通用渲染管线)和 HDRP(High Definition Render Pipeline,高清渲染管线)中的核心光照材质系统。它定义了物体表面如何与光源交互,决定了渲染的真实感程度

image-20260529141058068

Unity的Lit着色器采用PBR(Physically Based Rendering,基于物理的渲染)技术,简称为PBR(基于物理渲染),其核心是向Unity描述物体的物理特性

参数说明
  1. Base Color (3) — 基础颜色
  • 类型:Vector3(RGB)
  • 含义:物体表面的固有色(Albedo)
  • 关键细节
    • 对于非金属(Metallic = 0),这就是你看到的颜色,比如红色塑料、绿色草地
    • 对于纯金属(Metallic = 1),Base Color 应接近黑色或深灰色,因为金属的”颜色”实际上来自反射,而非漫反射
  • 常见错误:把金属材质做成鲜艳的 Base Color,会导致能量不守恒,看起来”假”

  1. Normal (Tangent Space) (3) — 法线(切线空间)
  • 类型:Vector3(RGB)
  • 含义:定义表面微观朝向,模拟凹凸细节而不增加多边形
  • 为什么是 Tangent Space?
    • 切线空间法线贴图以每个像素自身的表面为参考,模型旋转/变形时法线方向依然正确
    • 与之对应的是 Object Space(物体空间),较少使用
  • RGB 通道对应
    • R(红)= 切线方向左右偏移
    • G(绿)= 副切线方向上下偏移
    • B(蓝)= 法线方向(通常接近 1,表示朝外)
  • 注意:Unity 默认使用 OpenGL 标准(Y+ 向上),如果法线贴图看起来”凹凸反了”,可能需要翻转绿通道

  1. Metallic (1) — 金属度
  • 类型:Float(0~1)
  • 含义:区分材质是金属还是非金属
  • 取值规则
    • 0:绝缘体 — 塑料、石头、木头、混凝土、泥土等。只有漫反射,无金属反射
    • 1:导体 — 铁、铜、金、铝等。几乎没有漫反射,反射率高且带颜色
    • 0~1 之间:过渡值,实际物理世界中很少有”半金属”,通常用 0 或 1
  • 图中数值 0:表示这是一个非金属材质

  1. Smoothness (1) — 光滑度
  • 类型:Float(0~1)
  • 含义:控制表面的光滑/粗糙程度,直接决定高光的锐利度和反射的清晰度
  • 取值效果
    • 1:镜面般光滑,反射清晰(镜子、抛光金属、水面)
    • 0:完全粗糙,反射模糊,无清晰高光(磨砂混凝土、天鹅绒)
  • 图中数值 0.5:中等光滑度,有可见但不锐利的高光
  • 与 Roughness 的关系:Smoothness = 1 - Roughness(Unreal 使用 Roughness,Unity 使用 Smoothness)

  1. Emission (3) — 自发光
  • 类型:Vector3(RGB),支持 HDR
  • 含义:材质自身发出的光,不受场景光照影响
  • 特性
    • 只有颜色值,不直接照亮周围物体(除非开启全局光照烘焙或实时光照)
    • HDR(高动态范围):允许值超过 1(如 2、5、10),产生泛光(Bloom)效果
  • 常见用途:霓虹灯、屏幕、魔法特效、炽热金属、生物发光
  • 图中是黑色(HDR):表示当前不自发光

  1. Ambient Occlusion (1) — 环境光遮蔽
  • 类型:Float(0~1)
  • 含义:模拟光线难以到达的缝隙、角落、褶皱处的阴影
  • 效果
    • 1(白色):无遮蔽,完全接收环境光
    • 0(黑色):完全遮蔽,环境光被完全阻挡
  • 作用域:AO 只影响间接光照(环境光、反射探针),不影响直接光源(太阳光、点光源)
  • 图中数值 1:表示无额外遮蔽,使用默认环境光接收

unity会自动计算物体表面的漫反射和镜面反射强度,base color输出代表物体的反照率颜色(即表面基础反射色),其运行机制与无光照unlit 着色器中的表现完全一致

image-20260529142652203

然后我们了解一下这个黑白贴图的类型

名称 存储内容 用途
Metallic Map(金属度贴图) 黑=非金属,白=金属 控制 Metallic 参数
Smoothness Map(光滑度贴图) 黑=粗糙,白=光滑 控制 Smoothness 参数
Roughness Map(粗糙度贴图) 黑=光滑,白=粗糙 Unreal 等引擎使用,Unity 需反转
Ambient Occlusion Map(AO 贴图 / 环境光遮蔽贴图) 黑=遮蔽,白=无遮蔽 控制 Ambient Occlusion
Opacity Map(不透明度贴图) 黑=透明,白=不透明 控制 Alpha 裁剪或透明度
Height Map(高度贴图) 黑=低,白=高 用于 Parallax(视差)或 Displacement(置换)
Mask Map(遮罩贴图) 通道分别存不同数据 HDRP 常用,RGBA 各存 Metallic、AO、Detail Mask、Smoothness

高度贴图

然后添加纹理节点并添加纹理

image-20260529143029430

不过这个只是在视觉效果上改变,不会改变实际的模型

image-20260529143527553

然后再添加一个HeightMap Texture的纹理节点,然后再和Parallax mapping(视差贴图)节点相连,这个节点会结合高度图和特定算法参数来动态调整基底贴图的UV坐标,然后通过高度图和特定算法参数动态调整UV坐标

image-20260529144214106

左侧输入参数

参数 类型 含义
Heightmap Texture2D 高度图贴图,灰度图,白=高,黑=低
Heightmap Sampler Sampler State 高度图的采样器状态,控制过滤/寻址模式
Amplitude Float 深度强度,值越大凹凸越明显,通常 0~0.1
UV Vector2 原始 UV 坐标,输入基础纹理坐标
Heightmap Sample Channel Vector4 / 下拉选项 指定从高度图的哪个通道读取高度值

右侧输出

参数 类型 含义
Parallax UVs Vector2 偏移后的 UV 坐标,用于后续所有贴图采样

关键参数详解:

Heightmap Sample Channel

高度图可能是单通道灰度(R=G=B),也可能是把高度存在某个特定通道的 RGBA 贴图里。这个参数告诉节点读哪个通道

通道选择 对应值
R (1, 0, 0, 0)
G (0, 1, 0, 0)
B (0, 0, 1, 0)
A (0, 0, 0, 1)

法线贴图

image-20260529144747813

法线贴图的效果看起来和位移贴图差不多,不过存在很多区别:

① 位移贴图通过模拟在Z轴上的位移来制造深度假象

② 法线贴图是改变每个像素的表面法线方向,相当于告诉渲染引擎这个像素的实际朝向与模型几何表面不一致

法线贴图和位移贴图配合使用可以产生逼真的渲染效果

image-20260529145549890

然后我们添加一个叫做normal texture的2d纹理并选择normalmap模式

此时我们可以看到这个变成了一种淡淡的紫色

image-20260529145951892

然后我们把之间用位移贴图处理过的UV贴图坐标和这个sample texture2d的UV相连,并将type类型设置为normal 法线贴图,并将输出结果连到法线图的主输出端口Normal (Tangent Space)

image-20260529150418455

我们可以了解一下这个workflow mode工作流模式

Metallic(金属度) Specular(高光)
核心思路 “这材质含多少金属?” “这材质反射什么颜色?”
输入参数 Base Color + Metallic + Smoothness Diffuse + Specular + Smoothness
Base Color 含义 非金属的固有色 / 金属的反射色调 仅漫反射颜色
金属反射色 由 Base Color × Metallic 自动推导 由 Specular 贴图直接指定
物理正确性 强制遵守:金属无漫反射,非金属反射弱 容易设置错误(如非金属给强反射)
贴图数量 少(Metallic 存 R 或 Alpha) 多(Specular 需 RGB 颜色)
直观程度 更符合直觉 美术师传统习惯
主流程度 现代 PBR 标准,强烈推荐 兼容旧项目/传统管线

image-20260529150815803

高光模式允许直接调节反射高光的色彩属性

image-20260529151257776

我们添加一个浮点类型的metallic并设置为滑块模式(这个是在inspector窗口调节的)

粗糙度贴图

image-20260529151459189

image-20260529151707087

粗糙度贴图中黑色表示表面极度光滑,白色表示材质表面极度粗糙,不过unity中白色表示完美平滑

为了消除这个差异我们需要反转

我们需要添加一个Roughness texture节点,并选择红色通道输出,因为这是单通道灰度贴图,可以随便选择一个通道,不限于红色通道 R

然后连接反转节点 one minus进行黑白颜色反转,然后将处理后的值连接到smoothness平滑度通道

image-20260529152220226

One Minus 节点就是数学上的 1 - x,对每个通道单独做减法。

功能

plain

1
输出 = 1 - 输入

例如

输入 输出
0 1
0.25 0.75
0.5 0.5
0.75 0.25
1 0

本质上就是反转数值——黑的变白,白的变黑,中间灰互相颠倒

虽然我们得到的材质跟十几年的老游戏画质一样,不过问题不大

image-20260529162230985

自发光贴图

现在我们需要添加自发光颜色属性

先添加一个颜色节点,然后将模式设置为HDR

image-20260529162646727

然后就可以使用超高强度的颜色值

image-20260529162857707

image-20260529163251814

可以看到小球发光了,但是由于这个是我们在创建URP项目的时候自动添加的功能—–global volume

如果没有的话可以点击这里添加

image-20260529163441757

就是这个东西

image-20260529163841707

Global Volume

Unity 的 Global Volume(全局体积) 是 URP/HDRP 中用于控制后处理效果(Post-processing)视觉环境设置的核心系统。它不同于 Local Volume(局部体积,只在特定区域生效),Global Volume 一旦激活就影响整个场景

核心概念

Volume 系统基于层叠覆盖机制:

plain

1
2
Global Volume(全局)→ 始终生效,作为基础
Local Volume(局部) → 进入触发区域后,按优先级覆盖或混合

多个 Volume 可以同时存在,通过 Priority(优先级)Blend Distance(混合距离) 决定谁说了算。


Global Volume 的关键组件

1. Volume 组件本身

参数 作用
Is Global 勾选 = 全局生效,不依赖碰撞体范围
Priority 优先级,数值大的覆盖数值小的
Blend Distance 与局部体积混合时的过渡距离(全局通常 irrelevant)
Weight 整体权重 0~1,用于淡入淡出整个 Volume 效果
Profile 挂载的 Volume Profile 资产,存实际效果数据

2. Volume Profile(配置文件)

这是一个独立的 .asset 文件,里面可以添加多种 Override(覆盖) 效果。同一个 Profile 可以被多个 Volume 复用。

常见 Override 效果(URP)

效果 作用 常用场景
Bloom 泛光,亮部溢出 霓虹灯、强光、梦幻氛围
Tonemapping 色调映射,压缩 HDR 到 LDR 几乎所有场景,防止过曝
Color Adjustments 曝光、对比度、饱和度、色温 整体调色
White Balance 白平衡偏移 修正色温,冷暖调
Lift Gamma Gain 暗部/中间调/亮部分开调色 电影级调色
Shadows Midtones Highlights 阴影/中间调/高光独立控制 精细调色
Vignette 暗角 聚焦中心、复古感
Chromatic Aberration 色差,边缘 RGB 分离 镜头畸变、风格化
Depth of Field 景深 特写虚化、引导视线
Motion Blur 运动模糊 高速运动、镜头感
Film Grain 胶片颗粒 复古、电影质感
Panini Projection 透视校正 宽屏镜头畸变修正

HDRP 特有的高级效果

效果 作用
Ambient Occlusion 屏幕空间环境光遮蔽
Screen Space Reflection 屏幕空间反射
Volumetric Fog 体积雾
Volumetric Lighting 体积光(上帝光)
Exposure 自动曝光、眼适应
Indirect Lighting Controller 间接光强度控制

相比你也看到了inspector里面有很多属性,比如Bloom,Vignette什么的

每个volume都是单个profile文件配置的,例如我们现在使用的就是这个默认的SamepleSceneProfile

image-20260529164616056

当然我们还可以选择自己创建一个

image-20260529164724268

可以在这里找到

image-20260529171245332

创建完了之后并使用发现没有任何属性,小球也不发光了

image-20260529164821902

我们可以通过add override添加子属性

image-20260529165011991

我们可以调节强度大小intensity,默认为0 不发光,数值越高发光越亮

image-20260529165250048

image-20260529165428855

环境光遮蔽贴图

image-20260529170037850

比如某些模型上面会出现孔洞什么的,在现实中,对于那些小坑会显示出黑影,月球就是一个最好的例子,比如月亮上的黑斑就是陨石砸的坑

在unity中就是使用环境光遮蔽贴图可以标识物体表面各部位受环境光遮蔽的效果的程度即被环境光遮挡的情况

我们需要和之前一样的操作,用材质连接环境光遮蔽通道

image-20260529171106980

去掉自发光节点恢复成普通不发光的材质,现在来看是不是很真实呢(说实话,这个让我想起了玩早期GTA的时候的那个粗糙的建模了 狗头狗头)

image-20260529171458169