- 每个顶点着色器的输入输出需要有对应的结构体,方便把输出的结构传入片元着色器操作
- 结构体除自己定义以外,还可以引入UnityShader库 #include "UnityCG.cginc,在库中有unity方便开发者定义的一些常用结构类型,我们可以拿来直接使用
Shader "Unlit/003"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color("Color",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引入unityShader库
//#include "UnityCG.cginc"
//只有在CGPROGRAM内再次定义一个与属性块内名字与类型相同的变量,属性块对应的变量才能起作用
fixed4 _Color;
//定义输入结构体
struct a2v//a application dao vert
{
float4 vertex:POSITION;//用模型顶点填充V变量
float3 normal:NORMAL;//用模型的法线填充n变量
float4 texcoord:TEXCOORD;//用模型的第一套UV填充texcoord
};
//定义输出结构体
struct v2f// v vert dao frag
{
float4 pos:SV_POSITION;//SV_POSITION 语义告诉Unity :pos 为裁剪空间中的位置信息
fixed3 color:COLOR;//COLORO 语义可以储存颜色信息
};
//使用UnityShader库里预制结构体
//v2f vert(appdata_full v)
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//将【-1,1】转变成【0,1】的常用方法 x/2+0.5
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;
//.xyzw .rgb .x .y .xw
c*=_Color.rgb;
return fixed4(c,1);
}
ENDCG
}
}
}
网友评论