基本属性
Shader "test/test1"{
Properties{
//属性
_Color("Color",Color) = (1,1,1,1)
_Vector("Vector",Vector) = (1,2,3,4)
_Int("Int",Int) = 34234
_Float("Float",Float) = 4.5
_Range("Range",Range(1,11)) = 6
_2D("Texture",2D) = "red"{}
_Cube("Cube",Cube) = "white"{}
_3D("Texure",3D) = "black"{}
}
//SubShader可以写很多个 显卡运行效果的时候,从第一个SubShader开始,如果第一个SubShader里面的效果都可以实现,那么就使用第一个SubShader,如果显卡这个SubShader里面某些效果它实现不了,它会自动去运行下一个SubShader
SubShader{
//至少有一个Pass
Pass{
//在这里编写shader代码 HLSLPROGRAM
CGPROGRAM
//使用CG语言编写shader代码
float4 _Color; //float half fixed
//fixed4
float3 t1;// half3 fixed3
float2 t;//half2 fixed2
float t2;
float4 _Vector;
float _Int;
float _Float;
float _Range;
sampler2D _2D;
samplerCube _Cube;
sampler3D _3D;
//float 32位来存储
//half 16位 -6万 ~ +6万
//fixed 11位 -2 到 +2,一般颜色直接用fixed,颜色0-1
ENDCG
}
}
Fallback "VertexLit"
}
定点函数、片元函数
Shader "test/test2"{
SubShader{
//至少有一个Pass
Pass{
//在这里编写shader代码 HLSLPROGRAM
CGPROGRAM
//顶点函数 这里只是声明了,顶点函数的函数名
//基本作用是 完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境转换到视野相机屏幕上)
#pragma vertex vert
//片元函数 这里只是声明了,片元函数的函数名
//基本作用 返回模型对应的屏幕上的每一个像素的颜色值
#pragma fragment frag
float4 vert(float4 v : POSITION) :SV_POSITION{//通过语义告诉系统,我这个参数是干嘛的, 比如POSITION是告诉系统我需要顶点坐标
//SV_POSITION这个语义用来解释说明返回值, 意思是返回值是剪裁空间下的顶点坐标
//float4 pos = mul(UNITY_MATRIX_MVP,v); //通过矩阵进行转换
//return pos;
return UnityObjectToClipPos(v);
}
fixed4 frag() :SV_Target{
return fixed4(0.5,0.5,1,1);
}
ENDCG
}
}
Fallback "VertexLit"
}
使用Struct
Shader "Siki/03 Use struct"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//application to vertex 应用到定点
struct a2v {
float4 vertex:POSITION;//告诉unity把模型空间下的顶点坐标填充给vertex
float3 normal:NORMAL;//告诉unity把模型空间下的法线方向填充给normal
float4 texcoord : TEXCOORD0;//告诉unity把第一套纹理坐标填充给texcoord
};
struct v2f {
float4 position:SV_POSITION;
float3 temp:COLOR0;//这个语义可以由用户自己定义,一般都存储颜色
};
v2f vert(a2v v) {
v2f f;
f.position = mul(UNITY_MATRIX_MVP,v.vertex);
f.temp = v.normal;
return f;
}
fixed4 frag(v2f f) :SV_Target{
return fixed4(f.temp,1);
}
ENDCG
}
}
Fallback "VertexLit"
}