Unity中的CG編寫Shader系列(Blend)


1.不透明度

當我們要將兩個半透的紋理貼圖到一個材質球上的時候就遇到混合的問題,由於前面的知識我們已經知道了片段着色器以及后面的環節的主要工作是輸出顏色與深度到幀緩存中,所以兩個紋理在每個像素上的顏色到底以怎樣的形式混合在一起最后輸出到幀緩存中是我們現在首要討論的內容。

1.混合(blending)

上一篇文章中的管道環節中的“逐幀操作”環節中的一項操作就是混合操作,可見混合操作是不可編程的固定功能環節。

在混合操作中,我們將片段着色器中計算出來的顏色稱之為 “源顏色”,幀緩存中對應的像素已經存在的顏色叫做“目標顏色”。混合操作就是將源顏色與目標顏色以一些選項進行結合。

既然是固定功能環節,那么這些選項我們只能選擇,不能編寫。

我們選擇混合的選項的過程是通過以下面的等式來進行RGBA顏色的計算的:

float4 result = SrcFactor * fragment_output + DstFactor * pixel_color;

Unity中的Shader 通過ShaderLab語法表達的混合操作過程為,例:

        Blend SrcAlpha OneMinusSrcAlpha        //alpha blending
        Blend One OneMinusSrcAlpha             //premultiplied alpha blending
        Blend One One                          //additive
        Blend SrcAlpha One                     //additive blending
        Blend OneMinusDstColor One             //soft additive
        Blend DstColor    Zero                 //multiplicative
        Blend DstColor SrcColor                //2x multiplicative
        Blend Zero SrcAlpha                    //multiplicative blending for attenuation by the fragment's alpha

所以混合操作的基本語法為

Blend SrcFactor DstFactor

其中這2個代號分別可以選擇的選項如下表:

選項代號

與之等價的代碼

One

float4(1.0)

Zero

float4(0.0)

SrcColor

fragment_output

SrcAlpha

float4(fragment_output.a)

DstColor

pixel_color

DstAlpha

float4(pixel_color.a)

OneMinusSrcColor

float4(1.0) - fragment_output

OneMinusSrcAlpha

float4(1.0 - fragment_output.a)

OneMinusDstColor

float4(1.0) - pixel_color

OneMinusDstAlpha

float4(1.0 - pixel_color.a)

其中float4(1.0)的寫法我們前面已經見過,等價於float4(1.0,1.0,1.0,1.0)

並且其中所有向量的分量區間都是[0,1]區間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM