返回

URP Shader解析之旅:目录结构与Unlit Shader剖析[上篇]

前端

沿着URP Shader的道路前行,我们首先抵达的是目录结构的站点。ShaderLab着色器通常位于项目中的Assets/Shader文件夹下,这些着色器文件以.shader为扩展名,里面包含了HLSL语言编写的着色器代码。

HLSL(高层次着色语言)是微软开发的一种着色语言,它与C语言有着密切的联系,因此如果你熟悉C语言,那么你就能很快地上手HLSL。

ShaderLab着色器的基本结构通常由以下部分组成:

  • Properties :定义着色器可以接收的属性,这些属性可以在Unity中通过材质编辑器进行修改。
  • SubShaders :包含多个Pass,每个Pass定义了渲染管线的一个阶段,例如顶点着色器阶段和片段着色器阶段。
  • Pass :定义了渲染管线的具体细节,包括顶点着色器和片段着色器代码。

现在,让我们将目光转向Unlit着色器。Unlit着色器是一种特殊类型的着色器,它不会进行光照计算,而是直接输出固定的颜色或纹理。由于无需进行光照计算,因此Unlit着色器通常比其他类型的着色器更简单、更快速。

Unlit着色器通常用于制作一些不需要光照效果的物体,例如UI元素、粒子效果或简单的几何体。在URP中,Unlit着色器位于Packages/com.unity.render-pipelines.universal/Shaders/Unlit文件夹下。

让我们打开URP的Unlit着色器代码,看看它是如何工作的。

Shader "Universal Render Pipeline/Unlit"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            struct v2f
            {
                float4 position : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert(float4 position : POSITION, float2 uv : TEXCOORD0)
            {
                v2f o;
                o.position = position;
                o.uv = uv;
                return o;
            }

            fixed4 frag(v2f i) : SV_TARGET
            {
                fixed4 color = _Color;
                color *= tex2D(_MainTex, i.uv);
                return color;
            }
            ENDHLSL
        }
    }
}

首先,我们看到Properties块定义了两个属性:_MainTex和_Color。_MainTex是一个纹理属性,用于指定要应用到物体上的纹理;_Color是一个颜色属性,用于指定物体的颜色。

接下来,我们看到SubShader块定义了一个Pass。Pass块包含了HLSLPROGRAM,这是HLSL着色器代码的开始标志。

在HLSLPROGRAM块中,我们定义了两个结构体:v2f和v2f_noscreen。v2f结构体用于存储顶点数据,包括顶点位置和纹理坐标;v2f_noscreen结构体用于存储顶点数据,但不包括屏幕坐标。

接下来,我们定义了顶点着色器vert和片段着色器frag。顶点着色器负责将顶点数据从模型空间转换到裁剪空间;片段着色器负责计算每个片段的颜色。

最后,我们看到ENDHLSL,这是HLSL着色器代码的结束标志。

以上就是对URP Shader目录结构和Unlit Shader的简单剖析,更多精彩内容,敬请期待下篇!