来源:《UNITY SHADER入门精要》
Shader "Unity Shaders"{
SubShader{
Pass{
CGPROGRAM
#pragma vertext vert
#pragma fragment frag
float4 vert(float4 v : POSITION) : SV_POSITION{
return mul(UNITY_MATRIX_MVP, v);
}
fixed4 frag() : SV_Target{
return fixed4(1.0, 1.0, 1.0, 1.0);
}
ENDCG
}
}
}
①第5、6行的#pragma vertext vert
和#pragma fragment frag
这两条编译指令将告诉Unity,哪个函数包含了片元着色器的代码,哪个函数包含了顶点着色器的代码。
②第8、9行的函数:
float4 vert(float4 v : POSITION) : SV_POSITION{
return mul(UNITY_MATRIX_MVP, v);
}
首先,它返回的是一个 float4 类型的变量。POSITION
和 SV_POSITION
都是 CG/HLSL 中的 语义(semantics),这些语义讲告诉系统哪些是输入值,哪些是输出值。这里,POSITION
表达的是 把模型空间的顶点填充到输入参数 v 中, SV_POSITION
将告诉 Unity 顶点着色器的输出是裁剪空间中的顶点坐标。
③第12、13行的函数:
fixed4 frag() : SV_Target{
return fixed4(1.0, 1.0, 1.0, 1.0);
}
这个函数返回一个 fixed4 类型的值,返回的是 SV_Target
这也是 HLSL 中的一个系统语义,它告诉渲染器,把用户的输出颜色储存到一个渲染目标之中,这里将输出到磨人的帧缓存中。片元着色器中的代码很简单,返回的一个表示白色的 fixed4 类型的变量。片元着色器的输出的颜色的每个分量范围在 [0, 1]之间。(1,1,1)代表白色。
&emsp我们想要得到模型上每个顶点的坐标和法线向量。
Shader "MyShader"{
SubShader{
Pass{
CGPROFRAM
#pragma vertex vert
#pragma fragment frag
struct a2v{
// POSITION 语义告诉Unity,用模型空间的顶点坐标填充vertex变量
float4 vertex : POSITION;
// NORMAL 语义告诉Unity,用模型空间的法线方向填充normal变量
float3 normal : NORMAL;
//TEXCOORD0 语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量
float4 textcoord : TEXCOORD0;
};
struct v2f{
float4 ppos : SV_POSITION;
fixed3 color : COLOR0;
}
float4 vert(a2v v) : SV_POSITION{
return mul(UNITY_MATRIX_MVP, v.vertex);
}
fixed4 frag() : SV_Target{
return fixed(1.0, 1.0, 1.0, 1.0);
}
ENDCG
}
}
}
上述代码的9-16行,我们定义一个新的结构体a2v,其中使用了更多的Unity支持的语义:NORMAL(法线)、TEXCOORD0(纹理坐标)。
其中,我们命名结构体的名字 a2v
是什么含义呢?a代表 application,v代表vertex shader,a2v 代表把数据从 应用阶段 转到 顶点着色器。
18-21行定义了 v2f ,其中,SV_POSITION 语义是最终裁剪空间的意思,而COLOR0 的语义规则可以由用户自行定义,用来存储颜色。
Shader "MyShader"{
Proerties{
_Color ("颜色", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#prama fragment frag
fixed _Color;
float4 vert(){...}
float4 frag(){...}
}
}
}
在上面的代码中,我们声明的是一个 Color 类型的变量,也赋予了它初始值。为了能够在CG代码中访问它,我们需要定一个变量,在12行,这个变量名称和类型必须和 Properties 语义块中的属性定义相匹配。
有时,我们可能会发现在CG变量前会有一个 uniform 关键字,例如:
uniform fixed4 _Color;
uniform关键词是CG中修饰变量和参数的一种修饰词,它仅仅用于提供一些关于该变量的初始值是如何指定和存储的相关信息(这和其他一些图像编程接口中的uniform关键词的作用不太一样)。在Unity Shader中,uniform关键词是可以省略的。