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
選項代號 |
與之等價的代碼 |
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]區間。