Untiy Shader 结构
标题
//1、定义shader标题,通过/定义shader目录
Shader "Custom/MyShader"{
}
property
Properties用于定义Shader中需要使用的属性
以下例子分别定义了Int、Float、2D纹理、Vector、Color的属性
Shader "Custom/MyShader"{
Properties {
_IntValue("IntValue",Int) = 2
_FloatValue("FloatValue",Float) = 2.0
_MainTex("MainText",2D) = "black"{}
_Vector("Vector",Vector) = (1,1,2,3)
_Color("Color",Color) = (1,1,1,1)
}
}
在Properties中定义的属性最终会在Inspector中出现,开发可以在Inspector中重载其初始值
SubShader
定义一个显卡的渲染流程 可配置多个SubShader来定义不同显卡的渲染任务
Shader "Custom/MyShader"{
Properties{
}
SubShader{
Tags{} // 可选 标签
RenderSetup{} //可选 状态
Pass{ // 表示一次完整的渲染流程
}
}
}
RenderSetup
RenderSetup没有固定的关键字和结构体,只需在SubShader里直接书写对应指令即可,支持的指令如代码所示
Shader ...{
...
...{
//剔除指令 可剔除背面、正面渲染或关闭剔除
Cull Off/Back/Front
//深度测试使用的函数
ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always
//深度写入
ZWrite On/Off 开启/关闭
//开启和设置混合模式
Blend SrcFactor DstFactor
}
}
所有的RenderSetup都会作用于每一个Pass,如果需要单独对某个Pass进行不同的状态设置,可以单独在Pass里定义以上指令
Tags
Tags以键值对的形式存在,其定义了 怎样 和 何时 进行对象渲染
Shader ...{
...
...{
Tags {
"Queue" = "Transparent" //渲染顺序
"RenderType" = "Opaque" //着色器分类,用于替换着色器
"DiableBatching" = "True" //是否使用批处理
"ForceNoShadowCasting" = "True" //是否使用投影
"IgnorProjector" = "True" //是否忽略Projector的影响
"CanUseSpriteAtlas" = "True" //是否用于精灵模型
"PreviewType" = "Plane" //设置在材质面板如何预览该材质
}
}
}
Pass
Shader ...{
...
...{
Pass{
Name "AAAA" //可选
Tags {
"LightMode" = "ForwardBase" //定义Pass在流水线中的的角色
"RequireOptions" = "SoftVegetation" //定义满足某条件时渲染
}
[RenderSetup] //与SubShader里的RenderSetup一致
// other code
}
UsePass "...." //可以使用该方式来复用已经定义的Pass 需要用大写字母
}
}
Fallback
Shader ...{
...
Fallback "VertexLit" // 如果显卡不支持Pass 用该模式
...{
Pass{
}
}
}
Shader着色器
着色器是指用于渲染的一小段函数
-
按照处理的类型分:
-
顶点着色器:用于负责顶点的几何计算和顶点的颜色计算。
-
片元着色器:负责片元的几何计算和颜色计算。
-
-
根据着色器的代码类型
-
表面着色器 Unity中对顶点和片元着色器的高度封装而成,不需要我们操心诸如光照等复杂场景处理。
Shader ...{ SubShader{ Tags {...} //表面着色器卸载SubShader里 CGPROGRAM //在CGPROGRAM和ENDCG之间的就是表面着色器 #pragma surface surf Lambert struct Input{ float4 color : COLOR; }; void surf(Input IN,inout SurfaceOutput o){ o.Albedo = 1; } ENDCG } Fallback ... }-
顶点/片元着色器 基础的着色器语言,也更复杂,封装程度不如表面着色器,所以灵活性比表面着色器高。
Shader ...{ SubShader{ Tags{ ... } //顶点/片元着色器定义在Pass里 Pass{ CGPROGRAM //在CGPROGRAM和ENDCG之间的就是顶点/片元着色器 #pragma vertex vert #pragma fragment frag float4 vert(float4 v : POSITION) : SV_POSITION { return mul (UNITY_MATRIX_MVP , v); } fixed4 frag() : SV_Target{ return fixed4(1.0,0.0,0.0,1.0); } ENDCG } } }-
固定函数着色器 一种古老的不可编程的着色器,只能实现固定简单的功能 不展开讲
-