ShaderLab 语法:混合 (Blending)

混合用于制作透明对象。

渲染图形时,执行所有着色器且应用所有纹理之后,将像素写入屏幕。混合 (Blend) 命令控制这些像素如何与已有像素混合。

语法

Blend Off
关闭混合
Blend SrcFactor DstFactor
配置和启用混合。生成的颜色乘以 SrcFactor。已在屏幕上的颜色乘以 DstFactor,然后两者相加。
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
与上述操作相同,但是混合 alpha 通道要使用不同的因子
BlendOp Min | Max | Sub | RevSub
不将混合颜色相加,而是对它们进行不同的操作。

属性

以下属性对 SrcFactor 和 DstFactor 都有效。源颜色 (Source) 是指已计算的颜色,目标颜色 (Destination)指已显示在屏幕上的颜色。

One值为 1 - 用它可使源颜色或目标颜色完全显示出来。
Zero值为 0 - 用它可删除源颜色值或者目标颜色值。
SrcColor这个阶段的值乘以源颜色值。
SrcAlpha这个阶段的值乘以源 alpha 值。
DstColor这个阶段的值乘以帧缓存源颜色值。
DstAlpha这个阶段的值乘以帧缓存源 alpha 值。
OneMinusSrcColor这个阶段的值乘以(1 - 源颜色之间的值)。
OneMinusSrcAlpha这个阶段的值乘以(1 - 源颜色 alpha 之间的值)。
OneMinusDstColor这个阶段的值乘以(1 - 目标颜色之间的值)。
OneMinusDstAlpha这个阶段的值乘以(1 - 目标颜色 alpha 之间的值)。

详细信息

以下是最常见的混合类型:

Blend SrcAlpha OneMinusSrcAlpha     // Alpha 混合
Blend One One                       // 相加
Blend OneMinusDstColor One          // 柔和相加
Blend DstColor Zero                 // 相乘
Blend DstColor SrcColor             // 2 倍相乘

示例

以下是一个小的示例着色器,它可以在已显示在屏幕上的任何东西上添加纹理:

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

下面是一个复杂的示例着色器,玻璃 (Glass)。它是一个双通道着色器:

  1. 第一个通道将一个光照、alpha 混合纹理渲染至屏幕。Alpha 通道决定透明度。
  2. 第二个通道使用附加透明度渲染 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]
            }
        }
    }
} 

Page last updated: 2013-06-28