通过一个简单的Shader,来了解Shader的基本结构与流程。
//ShaderLab关键字[Shader]:定义一个新的着色器
Shader "Custom/ColorShader" {
//ShaderLab关键字[Properties]:定义着色器的属性列表,用于在Unity编辑器中修改着色器属性。
Properties {
_Color ("Color", Color) = (1, 1, 1, 1)
}
//ShaderLab关键字[SubShader]:,定义一个子着色器,用于实现不同的渲染效果,可以定义多个SubShader。
SubShader {
//ShaderLab关键字[Tags]:,定义一些标签信息,用于在Unity编辑器中显示着色器的属性和菜单。 Opaque:表示当前SubShader渲染的是不透明物体
Tags {"RenderType"="Opaque"}
//ShaderLab关键字[Pass]:,定义一个渲染通道,通常包括顶点着色器、像素着色器和其他渲染状态设置,可以创建多个Pass。
Pass {
//ShaderLab关键字[CGPROGRAM]:,在 ShaderLab中嵌入CG/HLSL代码的标记。
CGPROGRAM
//使用 #pragma 声明了 vert 和 frag 函数,它们分别是顶点着色器和片元着色器。
#pragma vertex vert
#pragma fragment frag
//定义了一个顶点着色器,使用 appdata 和 v2f 两个结构体分别表示输入和输出数据。
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 vertex : SV_POSITION;
};
float4 _Color;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); //使用 UnityObjectToClipPos 函数将输入的顶点坐标转换到裁剪空间,输出裁剪空间的坐标。
return o;
}
//定义了一个片元着色器,使用 v2f 结构体表示输入数据。
fixed4 frag (v2f i) : SV_Target {
return _Color; //返回颜色属性 _Color,用于将物体或场景的颜色渲染到屏幕上。
}
ENDCG //结束CG代码
}
}
//ShaderLab关键字[FallBack]:定义一个备用的着色器,在当前着色器无法使用时使用备用着色器。"Diffuse"
FallBack "Diffuse"
}
具体的过程如下图所示(有点花不要在意)
基本结构:
以上的Shader包含了5个部分:
Shader:Shader "Custom/ColorShader" 表示这个shader的名字是"ColorShader",并且属于"Custom"这个分类。
Properties:_Color ("Color", Color) = (1, 1, 1, 1) 定义了一个名为"_Color"的属性,类型是Color,初始值是(1,1,1,1),在Shader Inspector中会显示为一个颜色选择器。在这里,我们可以添加自己的shader属性,使shader更加灵活。
SubShader:Shader至少要有一个SubShader,它是Shader的主要部分。这里只有一个SubShader,它包含一个Pass。
Pass:表示一个渲染通道,定义了渲染这个shader所需的所有信息,比如要使用哪个顶点着色器和哪个像素着色器,以及其他渲染状态和参数等。
CGPROGRAM和ENDCG:表示这里是一个HLSL代码块,使用CG语言编写。在这里,我们可以编写一些像素着色器、顶点着色器等渲染函数。#pragma vertex vert和#pragma fragment frag分别定义了使用哪个顶点着色器和哪个像素着色器。
关于上述Shader使用到的一些些关键字(其实看备注就好了,这里就不多说了):
Shader:定义一个新的着色器。
Properties:定义着色器的属性列表,用于在 Unity 编辑器中修改着色器属性。
SubShader:定义一个子着色器,用于实现不同的渲染效果。
Pass:定义一个渲染通道,通常包括顶点着色器、像素着色器和其他渲染状态设置。
CGPROGRAM:在 ShaderLab 中嵌入 CG/HLSL 代码的标记。
Tags:定义一些标签信息,用于在 Unity 编辑器中显示着色器的属性和菜单。
Fallback:定义一个备用的着色器,在当前着色器无法使用时使用备用着色器。