unity shader
- 主要框架
-
- Properties格式
-
- Attribute属性标记
- Type属性类型
- SubShaders格式
主要框架
- Shader “learn/MyShader”:unity工程里shader的名称, / 表示子级。
- Properties{}属性、材料球面板显示的贴图、属性参数等都需要在这里定义设置,也可以不设置。
- SubShaders{}SubShader第一个对应高、中、低三种机器配置SubShader当你不能满足的时候,你会以此类推。
- FallBack “Diffuse”:如果SubShaders三个都不满意或者写了shader当一些机器不支持时,它会自动切换到引号中的名称shader。
Properties格式
- 通用格式:
- 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//关闭