iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 11
0
自我挑戰組

初見Unity Shader系列 第 11

混和效果和一些我忘記的東西

目的

  • 標籤(Tags)
  • Pass
  • 認識混合效果(Blending)

忘記講的東西...

昨天(Day10)的時候介紹了繪製設定,我往前翻的時候才發現,忘記講Unity Shader的「標籤」以及「Pass」。

標籤

標籤是為了可以讓SubShader可以跟渲染引擎溝通的橋樑

// 寫在SubShader底下的Tags裡面
Shader "Shader"
{
    Properties
    {
        ...
    }
    SubShader
    {
        Tags { "TagName"="Status" }
    }
}

以下列出比較常用的標籤,之後我們也會碰到它們:

  • Queue:與「繪製順序」有關,Day9深度緩衝中說過,深度緩衝是對於繪製順序的一種處理方法,繪製佇列(Queue)也是,它讓開發者直接設定甚麼要先畫甚麼跟後畫甚麼。
  • RenderType:表示Shader的分類,例如Unity的Standard Surface Shader可以看到它是標記為"不透明(Opaque)"的Shader。
  • DisableBatching:只有TrueFalse兩種選項,表示是否要進行批次渲染。

注意: 這些標籤是字串,我們知道字串最大的問題是打錯一個字,則全部錯誤... = =|||

Pass

Pass可以視為我們繪製出一個圖像的完整流程,從傳入圖像的資料,進入渲染管線,輸出,為一個Pass

除了可以在SubShader當中加入標籤,Pass也可以加入標籤,目前常用的就一個:

  • LightMode:如名稱所示,指的就是光在渲染引擎的處理方式,常見的有兩種方式,正向繪製(Forward Rendering Path)和延遲繪製(Deferred Rendering Path)

混合效果

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,分別選擇不一樣的顏色,在互相靠近之後,可以看到我們在小時候知道的顏色混合的結果。

Reference


上一篇
深度緩衝,又或是Z緩衝
下一篇
看板、告示牌、Billboarding都是同一個東西
系列文
初見Unity Shader30

尚未有邦友留言

立即登入留言