Shader入门:Shader结构简介

2024-08-21  本文已影响0人  IT前沿技术分享

Unity Shader 文件的结构由多个部分组成,每个部分负责不同的渲染和控制任务。

完整结构

下面是 Unity Shader 文件的一般结构

Shader "MyShader/CustomShader"
{
    // 1. Properties - 定义可在 Inspector 中调节的属性
    Properties
    {
        _MainTex ("Base (RGB)", 2D) = "white" {}  // 纹理属性
        _Color ("Main Color", Color) = (1,1,1,1)  // 颜色属性
        _Glossiness ("Smoothness", Range(0,1)) = 0.5  // 数值属性
        _Metallic ("Metallic", Range(0,1)) = 0.0  // 数值属性
    }

    // 2. SubShader - 定义渲染逻辑
    SubShader
    {
        // 2.1 Tags - 渲染标签
        Tags { "RenderType"="Opaque" "Queue"="Geometry" }

        // 2.2 Pass - 渲染阶段
        Pass
        {
            // 渲染状态设置
            Cull Off
            ZWrite On
            ZTest LEqual
            Blend SrcAlpha OneMinusSrcAlpha

            // 2.3 CGPROGRAM - 着色器代码块
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            // 2.4 Uniforms - 定义着色器中的全局变量
            sampler2D _MainTex;
            fixed4 _Color;
            half _Glossiness;
            half _Metallic;

            // 2.5 Input Structure - 输入结构体
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            // 2.6 Output Structure - 输出结构体
            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            // 2.7 Vertex Shader - 顶点着色器
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            // 2.8 Fragment Shader - 片段着色器
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 texColor = tex2D(_MainTex, i.uv);
                return texColor * _Color;
            }
            ENDCG
        }
    }

    // 3. Fallback - 备用 Shader
    Fallback "Diffuse"

    // 4. CustomEditor - 自定义编辑器(可选)
    CustomEditor "MyShaderEditor"
}

结构各个部分解析

1. Shader 声明

Shader "ShaderName"

Shader Name: 定义 Shader 的名称,通常采用 "Category/ShaderName" 的格式来组织和分类。

2. Properties

Properties
{
    _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
    _Color ("Main Color", Color) = (1,1,1,1)
}

3. SubShader

SubShader
{
    Tags { "RenderType"="Opaque" }
    Pass
    {
        CGPROGRAM
        // Shader code here
        ENDCG
    }
}

4. Pass

Pass
{
    Name "ForwardBase"
    Tags { "LightMode" = "ForwardBase" }
    Cull Back
    ZWrite On
    ZTest LEqual
    Blend SrcAlpha OneMinusSrcAlpha
    
    CGPROGRAM
     // Shader code here
    ENDCG
}

5. CGPROGRAM / ENDCG

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
// Shader code here
ENDCG

6. 顶点着色器

v2f vert (appdata v)
{
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
    o.uv = v.uv;
    return o;
}

7. 片段着色器

fixed4 frag (v2f i) : SV_Target
{
    return tex2D(_MainTex, i.uv) * _Color;
}

8. Fallback 和 CustomEditor

Fallback "Diffuse"
CustomEditor "MyShaderEditor"

9. Include Files

#include "UnityCG.cginc"

10. SubShader 切换条件

SubShader
{
    Tags { "RenderPipeline" = "UniversalRenderPipeline" }
    ...
}

11. Multiple SubShaders

SubShader { ... }
SubShader { ... }

Multiple SubShaders: 在不同的 SubShaders 中可以提供不同的实现,以支持各种硬件和渲染路径。Unity 会根据设备能力选择最合适的 SubShader。

12. 优化和调试

Optimization: 使用 Unity 提供的工具(如 Shader Variant Collection)优化 Shader 性能。
Debugging: 使用 Frame Debugger 调试 Shader 行为,查看每个 Pass 的渲染结果。

结语

了解Shader结构帮助你更好地理解 Unity Shader 的工作原理,并可以在实际项目中灵活运用和调整 Shader 代码。

上一篇 下一篇

猜你喜欢

热点阅读