普通视图

发现新文章,点击刷新页面。
今天 — 2025年11月30日首页

【URP】Unity[内置Shader]非光照Unlit

作者 SmalBox
2025年11月30日 11:38

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

URP内置Unlit Shader的作用与原理

Unlit Shader是Unity通用渲染管线(URP)中的基础着色器,主要用于渲染不受光照影响的物体。其核心原理是通过直接采样纹理或颜色值输出到屏幕,跳过了复杂的光照计算流程。这种着色器特别适合UI元素、粒子特效、全息投影等需要保持恒定亮度的场景,因为它的渲染结果不会随光照环境变化而改变。

在URP架构中,Unlit Shader通过ShaderLab语法定义,内部使用HLSL编写核心逻辑。与Built-in管线相比,URP版本优化了渲染流程,包含三个关键Pass:主绘制Pass、深度Only Pass和元数据Pass(用于光照烘焙)。其核心特点是:

  • 无光照计算:直接输出Albedo颜色或纹理采样结果
  • 支持Alpha混合:可实现透明效果
  • 移动端优化:减少了GPU指令数量

发展历史演变

Unlit Shader随着Unity渲染管线的演进经历了三个阶段:

  • Built-in管线时期‌(2012-2018):最初作为简单着色器出现在标准资源包中,使用CG语言编写,功能较为基础
  • LWRP过渡期‌(2018-2020):轻量级渲染管线中首次针对移动平台优化,引入HLSL替代CG
  • URP成熟期‌(2020至今):成为Universal RP的核心组件,支持Shader Graph可视化编程,并优化了多Pass协作机制

具体使用示例

创建Unlit材质的基本步骤:

  • 在Project窗口右键创建Material
  • 材质Inspector中选择Shader路径:"Universal Render Pipeline/Unlit"
  • 配置基础属性:
    • Base Map‌:主纹理贴图
    • Base Color‌:色调叠加
    • Alpha‌:透明度控制

代码说明:

  • 定义包含纹理和颜色属性的基础Unlit Shader

  • 使用URP核心库中的TransformObjectToHClip方法进行坐标转换

  • 片元着色器直接返回纹理采样结果与颜色的乘积

  • UnlitExample.shader

    Shader "Custom/UnlitTexture"
    {
        Properties {
            _MainTex ("Texture", 2D) = "white" {}
            _Color ("Color", Color) = (1,1,1,1)
        }
        SubShader {
            Tags { "RenderType"="Opaque" }
            Pass {
                HLSLPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    
                struct Attributes {
                    float4 positionOS : POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                struct Varyings {
                    float4 positionCS : SV_POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                sampler2D _MainTex;
                float4 _Color;
    
                Varyings vert(Attributes IN) {
                    Varyings OUT;
                    OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
                    OUT.uv = IN.uv;
                    return OUT;
                }
    
                half4 frag(Varyings IN) : SV_Target {
                    return tex2D(_MainTex, IN.uv) * _Color;
                }
                ENDHLSL
            }
        }
    }
    
  • UnlitGraph.shadergraph

    {
        "m_Nodes": [
            {
                "m_Id": "d4f5e3c7-1a2d-4b8f-a3e1-6c9b8d2e1f0a",
                "m_Type": "UnityEditor.ShaderGraph.Texture2DNode",
                "m_Position": { "x": -208, "y": -16 },
                "m_Outputs": [ { "m_Id": "out" } ],
                "m_Texture": { "m_DefaultValue": {} }
            },
            {
                "m_Id": "a1b2c3d4-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
                "m_Type": "UnityEditor.ShaderGraph.ColorNode",
                "m_Position": { "x": -200, "y": 100 },
                "m_Outputs": [ { "m_Id": "out" } ],
                "m_Color": { "r": 1, "g": 1, "b": 1, "a": 1 }
            },
            {
                "m_Id": "b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7",
                "m_Type": "UnityEditor.ShaderGraph.MultiplyNode",
                "m_Position": { "x": 0, "y": 0 },
                "m_Inputs": [
                    { "m_Id": "a", "m_SlotId": 0 },
                    { "m_Id": "b", "m_SlotId": 1 }
                ],
                "m_Outputs": [ { "m_Id": "out" } ]
            }
        ],
        "m_Edges": [
            { "m_OutputSlot": "d4f5e3c7-1a2d-4b8f-a3e1-6c9b8d2e1f0a.out", "m_InputSlot": "b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7.a" },
            { "m_OutputSlot": "a1b2c3d4-e5f6-7g8h-9i0j-k1l2m3n4o5p6.out", "m_InputSlot": "b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7.b" }
        ]
    }
    

Shader Graph应用示例

在Shader Graph中创建Unlit效果的步骤:

  • 创建新的Shader Graph文件(右键 > Create > Shader > Universal Render Pipeline > Unlit Shader Graph)
  • 核心节点配置:
    • 添加‌Sample Texture 2D‌节点作为基础纹理输入
    • 连接‌Color‌参数节点实现色调控制
    • 使用‌Multiply‌节点混合纹理和颜色
  • 高级功能扩展:
    • 添加‌Time‌节点驱动UV动画
    • 通过‌Vertex Position‌节点实现顶点变形

代码说明:

  • 构建包含纹理采样和颜色混合的基础Unlit着色器

  • 通过节点连接实现材质属性的可视化编辑

  • 可扩展添加UV滚动、顶点动画等高级效果

  • UnlitExample.shader

    Shader "Custom/UnlitTexture"
    {
        Properties {
            _MainTex ("Texture", 2D) = "white" {}
            _Color ("Color", Color) = (1,1,1,1)
        }
        SubShader {
            Tags { "RenderType"="Opaque" }
            Pass {
                HLSLPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    
                struct Attributes {
                    float4 positionOS : POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                struct Varyings {
                    float4 positionCS : SV_POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                sampler2D _MainTex;
                float4 _Color;
    
                Varyings vert(Attributes IN) {
                    Varyings OUT;
                    OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
                    OUT.uv = IN.uv;
                    return OUT;
                }
    
                half4 frag(Varyings IN) : SV_Target {
                    return tex2D(_MainTex, IN.uv) * _Color;
                }
                ENDHLSL
            }
        }
    }
    
  • UnlitGraph.shadergraph

    {
        "m_Nodes": [
            {
                "m_Id": "d4f5e3c7-1a2d-4b8f-a3e1-6c9b8d2e1f0a",
                "m_Type": "UnityEditor.ShaderGraph.Texture2DNode",
                "m_Position": { "x": -208, "y": -16 },
                "m_Outputs": [ { "m_Id": "out" } ],
                "m_Texture": { "m_DefaultValue": {} }
            },
            {
                "m_Id": "a1b2c3d4-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
                "m_Type": "UnityEditor.ShaderGraph.ColorNode",
                "m_Position": { "x": -200, "y": 100 },
                "m_Outputs": [ { "m_Id": "out" } ],
                "m_Color": { "r": 1, "g": 1, "b": 1, "a": 1 }
            },
            {
                "m_Id": "b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7",
                "m_Type": "UnityEditor.ShaderGraph.MultiplyNode",
                "m_Position": { "x": 0, "y": 0 },
                "m_Inputs": [
                    { "m_Id": "a", "m_SlotId": 0 },
                    { "m_Id": "b", "m_SlotId": 1 }
                ],
                "m_Outputs": [ { "m_Id": "out" } ]
            }
        ],
        "m_Edges": [
            { "m_OutputSlot": "d4f5e3c7-1a2d-4b8f-a3e1-6c9b8d2e1f0a.out", "m_InputSlot": "b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7.a" },
            { "m_OutputSlot": "a1b2c3d4-e5f6-7g8h-9i0j-k1l2m3n4o5p6.out", "m_InputSlot": "b2c3d4e5-f6g7-8h9i-0j1k-l2m3n4o5p6q7.b" }
        ]
    }
    

实际应用时可结合粒子系统创建发光轨迹,或为UI元素添加动态高亮效果。URP Unlit Shader的轻量级特性使其在移动设备上能保持60fps以上的渲染性能

典型应用场景及实现

光晕效果(Halo)

  • 应用实例‌:角色技能特效、UI高亮提示。通过透明纹理实现边缘发光,如1中描述的透明光晕材质。
  • 实现步骤‌:
    • 导入纹理并设置:Texture TypeDefault (sRGB),勾选Alpha Is TransparencyWrap Mode设为Clamp
    • 创建材质:选择Universal Render Pipeline/Unlit Shader,设置Surface TypeTransparent,拖拽纹理到Base Map插槽。
    • 调整Tint颜色控制光晕色彩。

全息投影效果

  • 应用实例‌:科幻场景中的虚拟角色或界面。结合透明度与扫描线纹理。
  • 实现步骤‌:
    • 使用Unlit Shader并启用透明混合(Blend SrcAlpha OneMinusSrcAlpha)。
    • 添加顶点偏移代码模拟全息抖动,通过_Time变量控制动态效果。
    • 叠加扫描线纹理(如_HologramLine1)和菲涅尔反射增强立体感。

透明遮罩(如塑料薄膜)

  • 应用实例‌:UI遮罩或半透明装饰物。通过Alpha通道控制透明度,如中的塑料薄膜材质。
  • 实现步骤‌:
    • 在图片编辑器中创建带Alpha通道的纹理,白色区域不透明,灰色区域半透明。
    • 材质Shader选择Unlit,设置Transparent模式,纹理绑定到Base Map

发光广告牌(Billboard)

  • 应用实例‌:游戏内固定亮度标识或霓虹灯。直接显示纹理颜色不受光照影响。
  • 实现步骤‌:
    • 使用Unlit Shader,Surface Type设为Opaque
    • 通过Base Map设置发光纹理,调整Tint颜色增强亮度。

景深遮挡标记

  • 应用实例‌:半透明物体深度写入(如玻璃瓶),解决景深效果失效问题。
  • 实现步骤‌:
    • 创建两个材质:一个透明材质(Queue=Transparent),一个深度写入材质(Queue=2000)。
    • 深度写入材质使用Unlit Shader并启用ZWrite On

关键注意事项

  • 渲染顺序‌:透明物体需关闭深度写入(ZWrite Off),并合理设置Queue标签避免混合错误。
  • 性能优化‌:复杂效果(如全息投影)建议结合顶点着色器计算,减少片元着色器负担

【从UnityURP开始探索游戏渲染】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

❌
❌