昨天(Day10)的時候介紹了繪製設定,我往前翻的時候才發現,忘記講Unity Shader的「標籤」以及「Pass」。
標籤是為了可以讓SubShader可以跟渲染引擎溝通的橋樑
// 寫在SubShader底下的Tags裡面
Shader "Shader"
{
Properties
{
...
}
SubShader
{
Tags { "TagName"="Status" }
}
}
以下列出比較常用的標籤,之後我們也會碰到它們:
True
與False
兩種選項,表示是否要進行批次渲染。注意: 這些標籤是字串,我們知道字串最大的問題是打錯一個字,則全部錯誤... = =|||
Pass可以視為我們繪製出一個圖像的完整流程,從傳入圖像的資料,進入渲染管線,輸出,為一個Pass
除了可以在SubShader當中加入標籤,Pass也可以加入標籤,目前常用的就一個:
Day10介紹過了對於深度緩衝的設定,今天來說另外一個設定,混合。比起深度緩衝的設定,混合有更多的設定。
這是Blend指令的樣子:
Blend SrcFac DstFac
記得之前說過的光柵化階段嗎?
先說Src
是指fragment shader出來後的顏色,Dst
表示在顏色緩衝裡的顏色,SrcFac
是對Src
進行處理的因數,DstFac
也相同的對應到了Dst
。
還有一個叫做設定叫做「混合操作(BlendOp)」,也是我們可以操作的。預設的狀態是Add,也就是相加。
結合上面所述,開啟混合設定,輸出的顏色就會變成:
Ouput = SrcFac * Src + DstFac * Dst
我們知道顏色的組成有RGB,以及一個透明通道A,除了對顏色進行混合,我們可以單獨對透明通道採取不一樣的混合方式。
Blend SrcFac DstFac, SrcFacA DstFacA
下面寫一個簡單範例結束這回合:
Shader "Learning/SimpleBlend"
{
Properties
{
_Color ("Color", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
Pass
{
Tags { "LightMode"="ForwardBase" }
ZWrite Off
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Color;
struct v2f
{
float4 vertex : SV_POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return _Color;
}
ENDCG
}
}
}
在場景中新增兩個物件並附加一樣的Shader,分別選擇不一樣的顏色,在互相靠近之後,可以看到我們在小時候知道的顏色混合的結果。