一.书写格式
Shader "learn/MyShader" //shader名称
{
Properties //面板上面出现的一些属性需要在这里定义
{
//代码里用的名字("面板上现实的名字",类型)= 默认值
m_int("disInt",Int) = 0
m_float("disFloat",Float) = 0
m_rand("disRange",Range(0.0,5.0)) = 3.0
m_color("disColor",Color) = (1,1,1,1)
m_vector("disVec",Vector) = (1,1,1,1)
m_2d("dis2D",2D) = ""{}
m_cube("disCube",Cube) = "white"{}
m_3D("dis3D",3D) = "black" {}
_MainTex ("Texture", 2D) = "white" {}
}
SubShader //这个语句块是必须的,看可以有多个,会根据平台去选择,多个原因是,不同的平台,显卡,渲染能力不行,我们可以指定什么显卡用什么渲染方式
{
//[Tags]标签,[RenderSeup]状态 都是可选的,这两个可以再pass外面用也可以在里面用(具体用法不同),如果在里面用的话那么将会应用于所有的pass
//[RenderSeup]用来设置显卡的各种状态,例如开启混合|深度测试等等
//[Tags]是一个键值对,用来表示,subshader和渲染引擎之间的关系,告诉引擎,我该怎样,或者如何渲染对象
Tags { "RenderType"="Opaque" }
LOD 100
//顶点,片元着色器的书写都会在pass里面,但是surfaceShader不需要,,
//surfaceShader是对片元,顶点着色器更高一层的抽象,他的价值在于会帮我们处理很多光照细节,使我们不需要操心了
Pass
{
//一般包含以下内容
//[name] 名字,如果指定了名字,别的shader可以使用这个,例如USEPASS "MyShader/我这个pass的名字"注:unity会把所有名称转成大写,所以usepass 后面要大写
//[Tags] 这里面的tag和在外面生命用法不一样了,表示希望我们来怎么渲染该物体,具体用法后期整理
CGPROGRAM //开启CG代码段
//编译指令
#pragma vertex vert
#pragma fragment frag
//定义了一个结构体
struct appdata
{
float4 vertex : POSITION;//:后面表示不同的语义,这个表示,用模型空间的顶点坐标填充vertex
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return col;
}
ENDCG
}
}
//如果上面的subshader都不满足条件,就会执行下面的东西
FallBack "指定pass"
FallBack off//关闭
}
Shader "learn/MyShader" //shader名称
{