#pragma vertex ver//创建顶点着色器
#pragma fragment fra//创建一个片元着色器
先创建一个顶点着色器的代码,将模型顶点坐标输入,并将顶点坐标从模型空间转换到裁剪空间
float4 vert(float4 pos:POSITION):SV_POSITION
{
return UnityObjectToClipPos(pos);
}
POSITION为语义告诉unity将模型的顶点坐标输入到参数pos中
SV_POSITION也是语义告诉unity顶点着色器输出是裁剪空间的顶点坐标
UnityObjectToClipPos是将顶点从模型坐标转换到裁剪空间
再创建一个片元着色器,将用户的输出颜色储存到一个渲染目标
fixed4 frag():SV_Target
{
return fixed4(1,1,1,1);
}
这里frag函数没有输入,SV_Target是一个语义告诉渲染器把用户输出的颜色存储到一个渲染目标里
最终显示图
使用结构体控制顶点着色器的输入
struct a2v
{
float4 pos:POSITION;
float4 nor:NORMAL;
float4 tex:TEXCOORD0;
};
声明一个结构体来定义顶点着色器的输入
POSITION语义告诉unity,用模型顶点坐标填充pos变量
NORMAL语义告诉unity,用模型法线方向填充nor变量
TEXCOORD0语义告诉unity,用模型第一套纹理坐标填充tex变量
使用结构体控制顶点着色器的输出
struct v2f
{
float4 svpos:SV_POSITION;
float4 color:COLOR0;
};
声明一个结构体来定义顶点着色器的输出
顶点着色器输出结构必须包含一个变量,他的语义为SV_POSITION否则渲染器无法得到裁剪空间的顶点坐标,就无法将顶点渲染到屏幕上
COLOR0语义可以自由定义,一般用来存储颜色
v2f vert(a2v v)
{
v2f o;
o.svpos = UnityObjectToClipPos(v.pos);
o.color = v.nor * 0.5+fixed4(0.5, 0.5, 0.5, 1);
return o;
}
fixed4 frag(v2f i):SV_Target
{
return fixed4(i.color);
}
声明输入结构在这里定义为v
将输出结构定义为o
把顶点坐标输出到裁剪空间
v.nor包含顶点的法线方向,分量在[-1,1],代码把分量范围映射到[0,1],然后储蓄o.color里传入片元着色器
然后在片元着色器里输入刚刚传入的值
将i.color显示在屏幕上