//一、定義shader標題,經過/定義shader目錄
Shader "Custom/MyShader"{
}
複製代碼
Properties用於定義Shader中須要使用的屬性編程
如下例子分別定義了Int、Float、2D紋理、Vector、Color的屬性bash
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來定義不一樣顯卡的渲染任務測試
Shader "Custom/MyShader"{
Properties{
}
SubShader{
Tags{} // 可選 標籤
RenderSetup{} //可選 狀態
Pass{ // 表示一次完整的渲染流程
}
}
}
複製代碼
RenderSetup沒有固定的關鍵字和結構體,只需在SubShader裏直接書寫對應指令便可,支持的指令如代碼所示ui
Shader ...{
...
...{
//剔除指令 可剔除背面、正面渲染或關閉剔除
Cull Off/Back/Front
//深度測試使用的函數
ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always
//深度寫入
ZWrite On/Off 開啓/關閉
//開啓和設置混合模式
Blend SrcFactor DstFactor
}
}
複製代碼
全部的RenderSetup都會做用於每個Pass,若是須要單獨對某個Pass進行不一樣的狀態設置,能夠單獨在Pass裏定義以上指令spa
Tags以鍵值對的形式存在,其定義了 怎樣 和 什麼時候 進行對象渲染code
Shader ...{
...
...{
Tags {
"Queue" = "Transparent" //渲染順序
"RenderType" = "Opaque" //着色器分類,用於替換着色器
"DiableBatching" = "True" //是否使用批處理
"ForceNoShadowCasting" = "True" //是否使用投影
"IgnorProjector" = "True" //是否忽略Projector的影響
"CanUseSpriteAtlas" = "True" //是否用於精靈模型
"PreviewType" = "Plane" //設置在材質面板如何預覽該材質
}
}
}
複製代碼
Shader ...{
...
...{
Pass{
Name "AAAA" //可選
Tags {
"LightMode" = "ForwardBase" //定義Pass在流水線中的的角色
"RequireOptions" = "SoftVegetation" //定義知足某條件時渲染
}
[RenderSetup] //與SubShader裏的RenderSetup一致
// other code
}
UsePass "...." //能夠使用該方式來複用已經定義的Pass 須要用大寫字母
}
}
複製代碼
Shader ...{
...
Fallback "VertexLit" // 若是顯卡不支持Pass 用該模式
...{
Pass{
}
}
}
複製代碼
着色器是指用於渲染的一小段函數對象
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
}
}
}
複製代碼