《Unity Shader入门精要》第五章笔记 | 开始shader练习
一个简单的顶点/片元着色器
代码
Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
Properties {
// 声明一个Color类型的属性
_Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量
fixed4 _Color;
// 使用一个结构体来定义顶点着色器的输入
struct a2v {
// POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量
float4 vertex : POSITION;
// NORMAL语义告诉Unity,用模型空间的法线方向填充normal变量
float3 normal : NORMAL;
// TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量
float4 texcoord : TEXCOORD0;
};
// 使用一个结构体来定义顶点着色器的输出
struct v2f {
// SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息
float4 pos : SV_POSITION;
// COLOR0语义可以用于存储颜色信息
fixed3 color : COLOR0;
};
v2f vert(a2v v) : SV_POSITION {
v2f o;
// 使用v.vertex来访问模型空间的顶点坐标
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
return o;
}
fixed4 frag(v2f i) : SV_Target {
fixed3 c = i.color;
// 使用_Color属性来控制输出颜色
c *= _Color.rgb;
return fixed4(c, 1.0);
}
ENDCG
}
}
}
- 模型数据从哪里来: a2v结构体定义了顶点着色器的输入
- 顶点着色器和片元着色器之间如何通信: v2f结构体定义了顶点着色器的输入和片元着色器的输入
- 如何使用属性: Properties 语义块中,并在其中声明了一个属性_Color。并在Cg代码中定一个变量。
- 顶点着色器是逐顶点调用的,而片元着色器是逐片元调用的。片元着色器中的输入实际上是把顶点着色器的输出进行插值后得到的结果。
ShaderLab中属性的类型和Cg中变量的类型之间的匹配关系 如下:
……