汤昕昕 发表于 2025-11-27 11:05:02

【URP】Unity[内置Shader]光照着色器Lit

【从UnityURP开始探索游戏渲染】专栏-直达
Lit Shader的作用与原理

Lit Shader是Unity通用渲染管线(URP)中的核心着色器,专门用于实现基于物理的渲染(PBR)效果。它能以照片级质量渲染真实世界的表面材质,如石头、木材、玻璃、塑料和金属,使光照和反射在各种光照条件下(如明亮的阳光或黑暗的洞穴)都能呈现逼真效果。

工作原理

Lit Shader采用物理正确的光照模型,考虑了能量守恒和微表面理论。它通过以下核心参数控制材质表现:

[*]‌金属度Metallic‌: 控制材质是金属(1)还是非金属(0),金属材质具有更强烈的镜面反射
[*]‌光滑度Smoothness‌: 决定表面粗糙程度,影响高光反射的扩散范围
[*]‌法线贴图Normal Map‌: 增加表面微观细节的视觉表现
[*]‌环境光遮蔽Ambient Occlusion‌: 模拟表面缝隙和凹陷处的阴影效果
URP中的Lit Shader通过SubShader和多个Pass实现渲染,每个Pass都有特定用途(如主光源、附加光源、阴影等)。与内置渲染管线不同,URP不需要为每个附加光源创建额外Pass,而是通过优化后的单Pass前向渲染实现高效多光源处理。
发展历史

Lit Shader随着Unity渲染管线的发展经历了几个关键阶段:

[*]‌内置渲染管线时期‌:Unity最初提供标准着色器(Standard Shader),采用类似PBR的工作流程,但性能开销较大
[*]‌LWRP阶段‌:Unity推出轻量级渲染管线(LWRP),包含简化版的Lit Shader,专注于移动平台优化
[*]‌URP阶段‌:LWRP升级为通用渲染管线(URP),Lit Shader成为核心着色器,支持更广泛平台并优化性能
[*]‌持续优化‌:Unity不断改进Lit Shader,增加功能如透明混合模式、双面渲染等,同时保持高性能
具体使用方法

基本设置步骤


[*]在项目中创建或选择材质
[*]在材质检查器窗口中选择Shader为"Universal Render Pipeline > Lit"
[*]配置材质属性:
Surface Options:
- 表面类型(不透明/透明)
- 渲染面(正面/双面)
- 混合模式(Alpha/Premultiply/Additive/Multiply)

Surface Inputs:
- 基础颜色
- 金属度
- 光滑度
- 法线贴图
- 高度图等
示例:创建金属材质


[*]新建材质并应用Lit Shader
[*]设置Surface Type为Opaque
[*]调整Base Color为金属色调(如银灰色)
[*]将Metallic滑块调至1(完全金属)
[*]调整Smoothness控制反射清晰度
[*]添加法线贴图增加表面细节
Shader Graph中的应用

虽然Lit Shader本身是代码实现的,但可以在Shader Graph中创建类似效果:
示例:在Shader Graph中创建PBR材质


[*]创建新的Shader Graph,选择URP模板
[*]添加以下节点:

[*]‌PBR Master‌节点(核心光照模型)
[*]‌Sample Texture 2D‌节点(基础贴图)
[*]‌Normal From Texture‌节点(法线贴图)
[*]‌Slider‌节点(控制金属度和光滑度)

[*]连接节点:

[*]基础贴图连接到Albedo
[*]法线连接到Normal
[*]金属度和光滑度滑块连接到相应输入

[*]导出为Shader并应用到材质
高级示例

透明玻璃效果


[*]在Shader Graph中设置PBR Master的Surface Type为Transparent
[*]设置Blend Mode为Alpha
[*]添加Fresnel Effect节点模拟玻璃边缘反射
[*]使用Vertex Position节点驱动折射效果
[*]通过Time节点添加动态反射变化
基础配置


[*]‌创建材质并选择Lit Shader‌
在材质Inspector中选择Shader路径为Universal Render Pipeline > Lit,这是URP下实现物理渲染的基础着色器。
[*]‌设置表面类型为透明‌
在Surface Options中将Surface Type从默认的Opaque改为Transparent,此时会激活Blending Mode选项。
[*]‌选择混合模式‌

[*]‌Alpha模式‌:适用于普通半透明效果,通过Alpha值控制透明度(0完全透明,1不透明),计算公式为OutputRGBA = (SourceRGB × SourceAlpha) + DestinationRGB × (1 − SourceAlpha)。
[*]‌Premultiply模式‌:适合保留高光和反射的透明材质(如玻璃),可减少边缘伪影。

进阶调整


[*]‌深度写入与双Pass优化‌
若出现透明物体内部穿模问题,可通过双Pass解决:第一个Pass仅写入深度(ZWrite On + ColorMask 0),第二个Pass关闭深度写入并启用混合(ZWrite Off + Blend SrcAlpha OneMinusSrcAlpha)。
[*]‌折射效果增强‌
使用GrabPass捕获屏幕纹理,结合模型UV偏移模拟折射。示例代码片段:
hlsl
GrabPass { "_GrabTexture" }
sampler2D _GrabTexture;
float4 frag(v2f i) : SV_Target {
    float2 offset = /* 基于法线或高度的偏移计算 */;
    return tex2D(_GrabTexture, i.uvgrab + offset);
}此方法需配合透明材质和混合模式使用。
[*]‌菲涅尔效应‌
在片元着色器中加入视角相关透明度变化,增强边缘高光:
hlsl
float NDotV = saturate(dot(worldNormal, viewDir));
float fresnel = pow(1 - NDotV, _FresnelPower);
alpha *= fresnel;通过调整_FresnelPower控制效果强度。
性能注意事项


[*]透明渲染会禁用Early-Z优化,建议控制透明物体数量。
[*]复杂效果(如折射)可能需自定义Shader变体,URP Lit的Surface Type和Blending Mode已覆盖多数基础需求
金属材质


[*]‌工作流模式‌:选择"Metallic"模式,通过调整Metallic滑块控制金属度(1.0为全金属效果)
[*]‌光滑度‌:增加Smoothness值(0.8-1.0)可获得镜面反射效果
[*]‌基础贴图‌:使用带有金属质感的基础颜色贴图,建议配合法线贴图增强细节
头发材质


[*]‌多层结构‌:使用两个材质球(Front+Transparent)组合,Transparent材质需开启Alpha混合和双面渲染
[*]‌参数配置‌:

[*]Front材质:Surface Type=Opaque, Render Face=Front
[*]Transparent材质:Alpha=0.3-0.5, Render Face=Both

雪地材质


[*]‌世界法线混合‌:通过法线贴图的Y轴值作为蒙版,混合雪地与原材质
[*]‌参数设置‌:

[*]BaseMap:使用雪地纹理
[*]Smoothness:0.4-0.6模拟湿雪反光
[*]Normal Map:增强表面凹凸细节

岩石/混凝土


[*]‌工作流模式‌:选择"Specular"模式更易控制非金属反射
[*]‌表面细节‌:

[*]使用高对比度法线贴图
[*]Smoothness=0.1-0.3保持粗糙质感
[*]开启Height Map实现视差遮挡

动态效果实现


[*]对于火焰/水球等特效,建议通过ShaderGraph扩展Lit Shader:

[*]‌UV扰动‌:使用Voronoi噪点+Time节点驱动UV动画
[*]‌进度控制‌:通过脚本动态调整Cutoff参数实现填充效果

[*]关键参数组位置:

[*]Surface Options:定义材质基础类型和渲染方式
[*]Surface Inputs:配置纹理和物理属性
[*]Advanced Options:控制渲染优化选项

<blockquote>
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

姊囝 发表于 前天 16:12

感谢,下载保存了
页: [1]
查看完整版本: 【URP】Unity[内置Shader]光照着色器Lit