URP Shader解析之旅:目录结构与Unlit Shader剖析[上篇]
2024-02-18 19:31:45
沿着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的简单剖析,更多精彩内容,敬请期待下篇!