第五章实验
第一个Shader-最简单的顶点/片元着色器
Shader "Unlit/NewUnlitShader"
{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 v : POSITION) : SV_POSITION{
return mul(UNITY_MATRIX_MVP,v);
}
//通过POSITION获取顶点数据,并且返回到SV_POSITION中
fixed4 frag() : SV_TARGET0{
return fixed4(1.0,1.0,1.0,1.0);
}
//(1,1,1)表示白色
ENDCG
}
}
}
- Pass中将填写Cg代码片段,,CGPROGRAM,宣告CG代码的开始,首先需要进行编译指令(类似于声明函数?)其中的vert和frag是随意取的名字,分别代表顶点着色器和片元着色器的编译指令。
float4
以及fixed4
都是Cg中的变量类型,都是浮点型,区别在于精度,fixed4 最低而float4最高,精度的高低在后期可能影响到性能的问题
POSITION
以及SV_TARGET0
都是Cg的语义,实际上就是一个赋给 Shader输入和输出的字符串,通俗的讲,这可以让Shader知道从哪里读取数据,又把数据输出到哪里,起到一个指代性的作用
POSITION
将告诉Unity把模型的顶点坐标填充到参数v中,SV_POSITION
将告诉Unity顶点着色器的输出是裁剪空间中的顶点坐标。
使用结构体
Shader "Unlit/NewUnlitShader"
{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL; //法线
float4 texcoord : TEXCOORD; //使用模型的第一套纹理(以后会提到)
};
float4 vert(a2v v) : SV_POSITION{
return UnityObjectToClipPos(v.vertex);
}
fixed4 frag() : SV_TARGET0{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
}
- 法线为什么是三维矢量: 因为在矩阵变换时,由于发现方向矢量,并不会受到平移变换的影响
实现顶点与片元着色器通信
Shader "Unlit/NewUnlitShader"
{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD;
};
struct v2f
{
float4 pos : SV_POSITION;
fixed3 color : COLOR0;
};
v2f vert(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);
return o;
}
fixed4 frag(v2f i) : SV_Target{
return fixed4(i.color,1.0);
}
ENDCG
}
}
}
增加属性:颜色拾取器
Shader "Unlit/NewUnlitShader"
{
Properties{
_Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD;
};
struct v2f
{
float4 pos : SV_POSITION;
fixed3 color : COLOR0;
};
v2f vert(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos(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;
c *=_Color.rgb;
return fixed4(c,1.0);
}
ENDCG
}
}
}