- 第一个顶点/片元着色器
Shader "Unlit/Chapter5/SimpleShader" //shader的名字
{
SubShader {
Pass {
//渲染通道 一个占用
CGPROGRAM
#pragma vertex vert //vert 就是函数名称 定义顶点
#pragma fragment frag // frag 就是name 定义片元
/*
float4: float类型的四维变量为返回值
POSITION: 模型的顶点信息
float4 v:就是一个输入变量,包含了顶点位置POSITION
SV_POSITION:顶点着色器的输出的是顶点坐标
*/
float4 vert(float4 v : POSITION) : SV_POSITION
{
//模型坐标转换到裁剪坐标 矩阵
return UnityObjectToClipPos(v);
}
/*
frag:前面定义的片元函数名
SV_TARGET:输出存储到的渲染目标
*/
fixed4 frag() : SV_TARGET
{
//返回了一个xx颜色 RGBA[0,1]
return fixed4(0.87,0.61,0.19,0.82);
}
ENDCG
}
}
FallBack "Diffuse"
}
Unity支持的语义
1.应用阶段传递模型数据到顶点着色器
语义 | 描述 | 类型 | 分量范围 |
---|---|---|---|
POSITION | 模型空间中的顶点位置 | float4 | |
NORMAL | 顶点法线 | float3 | [-1,1] |
TANGENT | 顶点切线 | float4 | |
TEXCOORDn1 | 该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标 | float2/float4 | |
COLOR | 顶点颜色 | fixed4/float4 | [0,1] |
2.顶点着色器传递数据给片元着色器
语义 | 描述 |
---|---|
SV_POSITION | 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量,否则渲染器无法得到裁剪空间中的顶点坐标 |
TEXCOORD0~7 | 用于输出纹理坐标 |
COLOR0 | 用于输出第一组顶点颜色 |
COLOR1 | 用于输出第二组顶点颜色 |
3.片元着色器的输出
语义 | 描述 |
---|---|
SV_Target | 输出值将会存储到渲染目标中 |
- 在材质面板上显示一个颜色拾取器
Shader "Unlit/Chapter5/ColorTint" //shader的名字
{
Properties{
//声明一个Color类型的属性
_Color("Color Tint",Color) = (1,1,1,1)
}
SubShader{
Pass{
CGPROGRAM
#pragma vertext vert
#pragma fragment frag
//定义顶点输入结构体
struct a2v{
float4 vertex:POSITION; //模型顶点填充vertex
float3 normal:NORMAL; //顶点法线填充normal
float4 texcoord:TEXCOORD0; //第一组纹理填充texcoord
};
//定义顶点输出/片元的输入结构体
struct v2f{
float4 pos:SV_POSITION; //pos包含了顶点在裁剪空间中的位置信息
float3 color:COLOR0; //存储颜色信息
};
}
//CG代码中需要能够访问到属性的变量
float4 _Color;
v2f vert(av2 v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertext);
//法线的分量范围为【-1,1】需要映射到【0,1】
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;
c *= _Color.rgb; //使用_Color属性来控制输出颜色
return fixed4(c, 1.0);
}
ENDCG
}
Fallback "Diffuse"
}
着色器 | 调用方式 | 输入 | 输出 |
---|---|---|---|
顶点着色器 | 逐顶点 | 模型数据 | 传递给片元着色器 |
片元着色器 | 逐片元 | 顶点着色器的输出插值结果 | 渲染目标 |
n的数目与ShaderModel有关。Shader Model [2,3]–>8 /[4,5]–>16
Shader Model:决定了shader中各个特性的能力。运算指令数目、寄存器个数等
一个模型的纹理坐标组数一般不超过2。 ↩︎