Shader - Pass (五)

                    Blending

這裏寫圖片描述

當圖像被渲染時,所有着色器被執行以後,所有貼圖被應用後,像素將被寫到屏幕。他們是如何通過Blend命令的控制和已有的圖像合併呢?

Syntax 語法

  • Blend Off: 關閉混合
  • Blend SrcFactor DstFactor:配置並啓動混合。產生的顏色被乘以SrcFactor. 已存在於屏幕的顏色乘以DstFactor,並且兩者將被疊加在一起。
  • Blend SrcFactor DstFactor, SrcFactorA DstFactorA:同上,但是使用不同的要素來混合alpha通道
  • BlendOp Min | Max | Sub | RevSub:不是添加混合顏色在一起,而是對它們做不同的操作。

Properties 屬性

以下所有屬性對SrcFactor或DstFactor都可用。Source指的是被計算的顏色,Destination是已經在屏幕上的顏色。

  1. One:值爲1,使用此設置來讓源或是目標顏色完全的通過。
  2. Zero:值爲0,使用此設置來刪除源或目標值。
  3. SrcColor:此階段的值是乘以源顏色的值。
  4. SrcAlpha:此階段的值是乘以源alpha的值。
  5. DstColor:此階段的值是乘以幀緩衝區源顏色的值。
  6. DstAlpha:此階段的值是乘以幀緩衝區源alpha的值。
  7. OneMinusSrcColor:此階段的值是乘以(1 - source color)。
  8. OneMinusSrcAlpha:此階段的值是乘以(1 - source alpha)。
  9. OneMinusDstColor:此階段的值是乘以(1 - destination color)。
  10. OneMinusDstAlpha:此階段的值是乘以(1 - destination alpha)。

以下是最常見的混合類型:

  • Blend SrcAlpha OneMinusSrcAlpha // Alpha blending
  • Blend SrcAlpha OneMinusSrcAlpha // Alpha blending
  • Blend One One // Additive
  • Blend One OneMinusDstColor // Soft Additive
  • Blend DstColor Zero // Multiplicative
  • Blend DstColor SrcColor // 2x Multiplicative

Example 示例
這裏是一個着色器的小例子,添加一個紋理,無論是否已在屏幕上:

Shader "Simple Additive" {
    Properties {
        _MainTex ("Texture to blend", 2D) = "black" {}
    }
    SubShader {
        Tags { "Queue" = "Transparent" }
        Pass {
            Blend One One
            SetTexture [_MainTex] { combine texture }
        }
    }
}

更復雜的一個例子,玻璃。這是一個two-pass着色器:

    第一個pass渲染光照、alpha混合紋理到屏幕上。Alpha通道決定的透明度。
    第二個pass渲染在alpha混合窗口頂部一個反射立方體貼圖,使用附加透明度。
Shader "Glass" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "white" {}
        _Reflections ("Base (RGB) Gloss (A)", Cube) = "skybox" { TexGen CubeReflect }
    }
    SubShader {
        Tags { "Queue" = "Transparent" }
        Pass {
            Blend SrcAlpha OneMinusSrcAlpha
            Material {
                Diffuse [_Color]
            }
            Lighting On
            SetTexture [_MainTex] {
                combine texture * primary double, texture * primary
            }
        }
        Pass {
            Blend One One
            Material {
                Diffuse [_Color]
            }
            Lighting On
            SetTexture [_Reflections] {
                combine texture
                Matrix [_Reflection]
            }
        }
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章