【Unity】Shader代码的大结构.
有机紫菜
2024年08月26日 23:03

Unity支持多种类型的Shader结构,每种结构适用于不同的渲染需求和场景。以下是一些常见的Shader类型及其结构:

  1. 顶点和片元着色器(Vertex and Fragment Shaders): 这是最基础的Shader类型,允许直接编写顶点着色器和片元着色器代码。

代码块
C#
自动换行
复制代码
Shader "Custom/VertexFragmentShader"
{
    Properties
    {
        // 属性定义
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // HLSL代码
            ENDCG
        }
    }
}
复制成功

2.表面着色器(Surface Shaders): 表面着色器是Unity的高级抽象,用于简化复杂光照模型的编写。

代码块
C#
自动换行
复制代码
Shader "Custom/SurfaceShader"
{
    Properties
    {
        // 属性定义
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200
        CGPROGRAM
        #pragma surface surfaceFunction lightModel [optional params]
        // HLSL代码
        ENDCG
    }
}
复制成功

3.固定功能着色器(Fixed Function Shaders): 这是一种较老的Shader类型,不常用,它不使用HLSL代码,而是使用ShaderLab的固定功能设置。

代码块
C#
自动换行
复制代码
Shader "Custom/FixedFunctionShader"
{
    Properties
    {
        // 属性定义
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        // 固定功能设置
        Blend Off
        AlphaTest Greater 0.5
        ColorMaterial AmbientAndDiffuse
        // ...
    }
}
复制成功

4.计算着色器(Compute Shaders): 计算着色器用于执行不需要渲染到屏幕的计算任务

代码块
C#
自动换行
复制代码
ComputeShader "Custom/ComputeShader"
{
    CGPROGRAM
    #pragma kernel myComputeKernel
    // HLSL代码
    ENDCG
}
复制成功

5.阴影投射器着色器(Shadow caster shaders): 用于生成阴影贴图。

代码块
C#
自动换行
复制代码
Shader "Custom/ShadowCasterShader"
{
    Properties
    {
        // 属性定义
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Geometry+1" "ForceNoShadowCasting"="True" }
        LOD 100
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // HLSL代码
            ENDCG
        }
    }
}
复制成功

6.自定义渲染器着色器(Custom Renderers): 用于与Unity的渲染管线交互的自定义渲染器。 每种Shader类型都有其特定的用途和结构,但它们都遵循ShaderLab的基本语法。在编写Shader时,应根据项目的具体需求和性能要求选择合适的Shader类型。

7.我看一个地形的Shader,块结构,是一个属性块,紧跟着没有块,但是这个没有块的部分写了HLSLINCLUDE部分.然后是SubShader块,如下,这是什么结构.

代码块
C#
自动换行
复制代码
Shader "Custom/TerrainShader"
{
    Properties
    {
        // 属性定义
    }

    HLSLINCLUDE
    // HLSL代码,比如宏定义、结构体、函数等
    #include "UnityCG.cginc"
    #define MY_MACRO ...
    struct MyDataStruct
    {
        // ...
    };
    ENDCG

    SubShader
    {
        // 标签 (Tags)
        // LOD级别 (LOD)

        Pass
        {
            CGPROGRAM
            // 使用HLSLINCLUDE中的代码
            #pragma vertex vert
            #pragma fragment frag

            // 顶点和片元着色器实现
            // ...

            ENDCG
        }
    }
}
复制成功

在Unity的Shader代码中,部分是一种特殊的方式来包含HLSL代码,它通常位于属性块和子着色器块之间。不是ShaderLab的正式部分,但它是一种约定,Unity在编译Shader时会将其内容包含在每个Pass中。

附录:Shader代码中常用的关键字

以下是代码的主要部分关键字和解释:

  1. Properties部分:定义了着色器的一些属性,如是否启用高度混合、阴影模式、纹理映射等。

  2. SubShader部分:定义了着色器的多个Pass,分别负责不同的渲染阶段。每个Pass包含一个标签(如"LightMode"),用于指定当前Pass的光照模式。

  3. Pass "GBuffer":用于渲染物体的基本信息(如颜色、法线、深度等)。

  4. Pass "META":用于提取纹理信息,为光照等进行预处理。

  5. Pass "ShadowCaster":用于渲染物体的阴影。

  6. Pass "DepthOnly":用于渲染物体的深度。

  7. Pass "Forward":用于渲染物体的透明部分。

  8. Pass "SceneSelectionPass":用于渲染场景选择时的深度。

  9. UsePass "Hidden/Nature/Terrain/Utilities/PICKING":用于渲染选定物体的伪颜色。

  10. Dependency "BaseMapShader":指向一个用于纹理映射的着色器。

  11. Dependency "BaseMapGenShader":指向一个用于纹理生成的着色器。

  12. CustomEditor:指定一个自定义的编辑器,用于修改着色器属性。