本部分是对《Unity Shader入门精要》的学习记录和总结反思,之后更新的更多部分也是如此
1、基础框架和结构体概念
Shader "Unlit/Shader/Test01"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
float4 vert(a2v v) : SV_POSITION {
return UnityObjectToClipPos(v.vertex);
}
fixed4 frag() : SV_Target {
return fixed4 (1.0, 1.0, 1.0, 1.0);
}
ENDCG
}
}
}
在此先不考虑开放属性Properties模块,由Shader、SubShader、和其中的pass作为基础模块,而核心的代码部分在CGPROGRAM-ENDCG之间,其中包括了上面的struct结构体,通过声明一个额外的结构体,可以让vertex(顶点着色器)和fragment(片元着色器)读取,这便是结构体的作用
2、顶点和片元着色器之间的通信
Shader "Unlit/Shader/Test01"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
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
}
}
}
这里通过v2f这个结构体来储存顶点、片元着色器的信息传递。
通过这个思路,再加上properties就能够看到之前模拟挑战中代码的整体结构了
基本框架大概了解后就能更方便的看懂其他人的代码了,之后比较基础的地方就不再更新,应用在Shader测试部分都有记录