【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偏移模拟折射。示例代码片段:

    cpp 复制代码
    hlsl
    GrabPass { "_GrabTexture" }
    sampler2D _GrabTexture;
    float4 frag(v2f i) : SV_Target {
        float2 offset = /* 基于法线或高度的偏移计算 */;
        return tex2D(_GrabTexture, i.uvgrab + offset);
    }

    此方法需配合透明材质和混合模式使用。

  • 菲涅尔效应

    在片元着色器中加入视角相关透明度变化,增强边缘高光:

    cpp 复制代码
    hlsl
    float NDotV = saturate(dot(worldNormal, viewDir));
    float fresnel = pow(1 - NDotV, _FresnelPower);
    alpha *= fresnel;

    通过调整_FresnelPower控制效果强度。

性能注意事项

  • 透明渲染会禁用Early-Z优化,建议控制透明物体数量。
  • 复杂效果(如折射)可能需自定义Shader变体,URP Lit的Surface TypeBlending 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:控制渲染优化选项

【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
小贺儿开发1 天前
Unity3D 智慧城市管理平台
数据库·人工智能·unity·智慧城市·数据可视化
June bug2 天前
【领域知识】休闲游戏一次发版全流程:Google Play + Apple App Store
unity
星夜泊客2 天前
C# 基础:为什么类可以在静态方法中创建自己的实例?
开发语言·经验分享·笔记·unity·c#·游戏引擎
dzj20212 天前
PointerEnter、PointerExit、PointerDown、PointerUp——鼠标点击物体,则开始旋转,鼠标离开或者松开物体,则停止旋转
unity·pointerdown·pointerup
心前阳光2 天前
Unity 模拟父子关系
android·unity·游戏引擎
在路上看风景2 天前
26. Mipmap
unity
咸鱼永不翻身2 天前
Unity视频资源压缩详解
unity·游戏引擎·音视频
在路上看风景2 天前
4.2 OverDraw
unity
在路上看风景2 天前
1.10 CDN缓存
unity
ellis19703 天前
Unity插件SafeArea Helper适配异形屏详解
unity