unity shader
主要框架
- Shader “learn/MyShader”:unity工程里shader的名称, / 表示子层级。
- Properties{}:属性,材质球面板显示的贴图、属性参数等需要在这里定义设置,也可以不要。
- SubShaders{}:游戏中通常做3个SubShader对应高中低三种机器配置,在第一个SubShader不能满足时会换第二个,以此类推。
- FallBack “Diffuse”:如果SubShaders里的3个都不满足或者写的shader在一些机器上不支持时,会自动切换成引号内名称的shader。
Properties格式
- 通用格式:[Attribute]_Name (“Display Name”,Type) = Default Value
- Attribute属性标记,对当前这条属性做一些特殊处理。
- _Name名称,即shader中的变量名,也是外部脚本的调用名。
- Display Name材料面板上显示的名称,主要起注释作用。
- Type属性类型,有Range(滑竿), Color, Int, Float, Vector, 2D, 3D, Cube等类型。
- Default Value属性默认值,与类型对应。
Attribute属性标记
- [Header(text)]:在界面生成一个内容为“text”的文本,通常用作分类组别用,只支持英文、数字、空格以及下划线。
- [HideInInspector]:不在在材质面板中显示此条属性,隐藏之。
- [Toggle]:勾选项,只接受数字类型,勾选时为1,否则为0。
- [IntRange]:把参数限制在整数范围。
- [PowerSlider(Value)]:指数级的缩放滑动条的疏密程度,靠近Range的左值会拥有更精确的调整范围,Value接受指数等级控制,值为1时相当于普通Range。
- [Enum(List)]:枚举类型,把参数限制下拉列表的可选项中。
- [NoScaleOffset]:不显示纹理的缩放/偏移编辑器。
- [Normal]:提示这是一个法线纹理。
更多标记见官方文档unity3D/Editor/Data/en/ScriptReference/MaterialPropertyDrawer.html
Type属性类型
//定义Numbers(数值)和Sliders(区间值)
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
//定义Colors(颜色)和Vectors(向量)
//颜色表示为一个四维向量,对应颜色的RGBA通道;每个分量取值为[0,1]
//向量必须是四维向量
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
//定义Textures(纹理)
name ("display name", 2D) = "defaulttexture" {
}
name ("display name", Cube) = "defaulttexture" {
}
name ("display name", 3D) = "defaulttexture" {
}
- 其中defaulttexture为纹理声明时的默认值,有以下默认值:
- 非2维纹理,如:Cube, 3D, 2DArray,默认值是empty string,当他们没有材质指定时,默认使用“gray”
SubShaders格式
SubShader
{
//[Tags]标签,[RenderSeup]状态 都是可选的,如果在pass里面用的话那么将会应用于所有的pass
//[RenderSeup]用来设置显卡的各种状态,例如开启混合|深度测试等等
//[Tags]是一个键值对,用来表示,subshader和渲染引擎之间的关系,告诉引擎,我该怎样,或者如何渲染对象
Tags {
"RenderType" = "Opaque" "LightMode" = "ForwardBase" }
LOD 100
//顶点,片元着色器的书写都会在pass里面,但是surfaceShader不需要
//surfaceShader是对片元,顶点着色器更高一层的抽象,价值在于处理光照细节
Pass
{
CGPROGRAM //开启CG代码段
//编译指令
#pragma vertex vert
#pragma fragment frag
//颜色和向量用float4 / half4 / fixed4存储,精度从高到低
//数值用float / half/ fixed存储,精度从高到低
//2D纹理 / 3D纹理 / Cubemap分别用sampler2D / 3D / CUBE存储
sampler2D _Texture;
float4 _Texture_ST;
float4 _Texture_TexelSize;
fixed4 _Color;
float4 _Vector;
samplerCUBE _Cubemap;
//定义了一个结构体
struct appdata//vert的输入
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f//vert的输出
{
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/ENDCGsampler
}
}
//如果上面的subshader都不满足条件,就会执行下面的东西
FallBack "Diffuse"
FallBack off//关闭