创建shader( 如下 )
一、Shader Lab基本结构
//此处shader的名字不要求和文件名一致
Shader "Chichi/01-myshader"{
//(在面板显示,可调节)属性
Properties{
//属性 _Color("属性名",类型) = (r,g,b,a)
//在shader语言中必须再自定义一次它显示的属性名
_Color("_Color",Color) = (1,1,1,1)
}
/*属性块,可以编写多个SubShader,显卡运行效果时,
如果第一个SubShader某些效果显卡显示不了,它会自动运行下一个SubShader */
SubShader{
//一个pass块相当于一个功能方法(至少一个)
Pass{
//此处编写shader代码(也能写HLSLPROGRAM)
CGPROGRAM
//使用CG语言编写shader代码
ENDCG
}
}
//用来指定一个已经存在的Shader(当上述方案显卡都无法执行时的后备方案)
FallBack "VertexLit" //有一个指定的_Color,注意重名
}
( 补充说明 )
二、属性(Properties{})的几种类型
_Colour("Colour",Color) = (1,1,1,1) //float4
_Vector("Vector",Vector) = (1,2,3,4) //float4
//Color和Vector本质上是一种类型_Int("Int",Int) = 3233 //float
_Float("Float",Float) = 4.5 //float
//Shader里面只有float没有double,不用加f_Range("Range",Range(1,11)) = 6 //float
//Range本支上相当于做了范围限制的Float_2D("Texture",2D) = "white"{} //sampler2D
//不指定图片时默认颜色white_Cube("Cube",Cube) = "white"{} //samplerCube
//立方体纹理——天空盒子_3D("Texture",3D) = "black"{} //sampler3D
三、使用CG语言编写shader代码(pass块中)
Pass{
CGPROGRAM
//使用CG语言编写shader代码
//需要重新对上述属性定义,但是不用再赋默认值(会自动取到)
/*
fixed(-2 到 +2),可以存储颜色的值
float4对应4个值
所有的float都能用half代替
float用32位进行存储,half用16位进行存储(-6万 到 +6万)
*/
//fixed4 _Colour
float4 _Colour;
float4 _Vector;
float3 t1;
half2 t;
float _Int;
float _Float;
float _Range;
sampler2D _2D;
samplerCube _Cube;
sampler3D _3D;
ENDCG
}
四、制作一个可运行的简易Shader
顶点函数:以建模中心为原点,对渲染物体的顶点进行几何变换( 每个顶点被函数处理 ),使其从模型空间转换到剪裁(屏幕)空间
片元函数:一个模型对应若干像素(即片元),函数对每个像素点的颜色进行处理,并返回一个颜色值
顶点函数和片元函数的方法名、返回值、参数都不是固定的,而且是被系统自动调用的,无需自己调用
Shader "Chichi / 02 - myshader can Run"{
//Properties 可以没有
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert //顶点函数(函数名自定义)
#pragma fragment frag //片元函数(函数名自定义)
// 参数(v): POSITION →固定语义:把顶点坐标传递给参数
// 方法() : SV_POSITION →固定语义:返回值是剪裁空间下的顶点坐标
float4 vert(float4 v : POSITION) : SV_POSITION {
//矩阵和position的乘法运算
float4 pos = mul(UNITY_MATRIX_MVP,v);
return pos;
}
//返回颜色
fixed4 frag() : SV_Target {
return fixed4(0.5,0.5,1,0.5);
}
ENDCG
}
}
Fallback "VertexLit"
}