Version: 5.3 (switch to 5.4b)
ShaderLab: Culling & Depth Testing
Синтаксис ShaderLab: тэги Pass

Синтаксис ShaderLab: Blending

Блендинг (Blending) используется при создании прозрачных объектов.

При отрисовке объектов, пиксели выводятся на экран после выполнения всех шейдеров и применения всех текстур. Команда Blend определяет, как эти новые пиксели будут соединяться с теми, что уже есть на экране.

Синтаксис

Blend Off: Выключить блендинг

Blend SrcFactor DstFactor: Включить и настроить блендинг. Новый (только что вычисленный) цвет умножается на SrcFactor. Цвет, который уже есть на экране, умножается на DstFactor, после чего оба цвета складываются.

Blend SrcFactor DstFactor, SrcFactorA DstFactorA: То же, что и выше, но для альфа каналов используются отдельные множители.

BlendOp BlendOp: Вместо сложения двух цветов, выполнить другую операцию

Blend SrcFactor DstFactor, SrcFactorA DstFactorA: То же, что и выше, но для альфа каналов используются отдельные множители.

AlphaToMask On: Turns on alpha-to-coverage. When MSAA is used, alpha to coverage modifies multisample coverage mask proportionally to the pixel shader result alpha value. This is typically used for less aliased outlines than regular alpha-test; useful for vegetation and other alpha tested shaders.

Операции команды Blend

Можно использовать следующие операции блендинга:

Add Новый и старый цвета складываются.
Sub Вычесть старый цвет из нового.
RevSub Вычесть новый цвет из старого.
Min Выбрать минимальное значение между новым и старым цветом.
Max Выбрать максимальное значение между новым и старым цветом.
LogicalClear Логическая операция: Clear (0) только для DX11.1.
LogicalSet Логическая операция: Set (1) только для DX11.1.
LogicalCopy Логическая операция: Copy (s) только для DX11.1.
LogicalCopyInverted Логическая операция: Copy inverted (!s) только для DX11.1.
LogicalNoop Логическая операция: Noop (d) только для DX11.1.
LogicalInvert Логическая операция: Invert (!d) только для DX11.1.
LogicalAnd Логическая операция: And (s & d) только для DX11.1.
LogicalNand Логическая операция: Nand !(s & d) только для DX11.1.
LogicalOr Logical operation: Or (s | d) только для DX11.1.
LogicalNor Logical operation: Nor !(s | d) только для DX11.1.
LogicalXor Логическая операция: Xor (s ^ d) только для DX11.1.
LogicalEquiv Логическая операция: Equivalence !(s ^ d) только для DX11.1.
LogicalAndReverse Логическая операция: Reverse And (s & !d) только для DX11.1.
LogicalAndInverted Логическая операция: Inverted And (!s & d) только для DX11.1.
LogicalOrReverse Logical operation: Reverse Or (s | !d) только для DX11.1.
LogicalOrInverted Logical operation: Inverted Or (!s | d) только для DX11.1.

Коэффициенты для команды Blend

В команде Blend, все представленные ниже свойства применимы и к SrcFactor, и к DstFactor. Source - новый вычисленный цвет, Destination - цвет, который уже присутствует на экране. Эти свойства игнорируются, если в качестве BlendOp выбрана любая логическая операция.

One Единица — на экран будет выведен либо только новый цвет, либо только старый.
Zero Ноль — из конечного отображения будет полностью убран старый или новый цвет.
SrcColor Значение умножается на значение нового цвета.
SrcAlpha Значение умножается на значение альфа канала нового цвета.
DstColor Значение умножается на значение уже присутствующего на экране цвета.
DstAlpha Значение умножается на значение альфа канала уже присутствующего на экране цвета.
OneMinusSrcColor Значение умножается на (1 - srcColor), где srcColor - значение нового цвета.
OneMinusSrcAlpha Значение умножается на (1 - srcAlpha), где srcAlpha - значение альфа канала нового цвета.
OneMinusDstColor Значение умножается на (1 — dscColor), где dstColor - значение уже присутствующего на экране цвета.
OneMinusDstAlpha Значение умножается на (1 — dstAlpha), где dstAlpha - значение альфа канала цвета, уже присутствующего на экране.

Детали

Ниже показаны наиболее часто встречающиеся варианты блендинга:

Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency
Blend One OneMinusSrcAlpha // Premultiplied transparency
Blend One One // Additive
Blend OneMinusDstColor One // Soft Additive
Blend DstColor Zero // Multiplicative
Blend DstColor SrcColor // 2x Multiplicative

Alpha Blending, Alpha Testing, Alpha To Coverage

For drawing mostly fully opaque or fully transparent objects, where transparency is defined by texture’s alpha channel (e.g. leaves, grass, chain fences etc.), several approaches are commonly used:

Синтаксис ShaderLab: Blending

Regular alpha blending
Regular alpha blending

Often this means that objects have to be considered as “semitransparent”, and thus can’t use some of the rendering features (deferred shading; can’t receive shadows etc.). Concave or overlapping alpha blended objects often also have draw ordering issues.

Most often alpha blended shaders also set transparent render queue, and turn off depth writes. So the shader code looks like:

// inside SubShader
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }

// inside Pass
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

Alpha Testing / Cutout

clip() in pixel shader
clip() in pixel shader

By using clip() HLSL instruction in the pixel shader, a pixel can be “discarded” or not based on some criteria. This means that object can still be considered as fully opaque, and has no draw ordering issues. However, this means that all pixels are fully opaque or transparent, leading to aliasing (“jaggies”).

Most often alpha tested shaders also set cutout render queue. So the shader code looks like:

// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }

// inside CGPROGRAM in the fragment shader:
clip(textureColor.a - alphaCutoffValue);

Alpha to Coverage

AlphaToMask On, at 4xMSAA
AlphaToMask On, at 4xMSAA

When using multisample anti-aliasing (MSAA, see QualitySettings), it is possible to improve alpha testing approach by using “alpha to coverage” GPU functionality. This improves edge appearance, depending on the MSAA level used.

This functionality works best on texures that are mostly opaque or transparent, and have very thin “partially transparent” areas (grass, leaves and similar).

Most often alpha-to-coverage shaders also set cutout render queue. So the shader code looks like:

// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }

// inside Pass
AlphaToMask On

Пример

Ниже показан простой шейдер, который добавляет текстуру поверх присутствующих на на экране пикселей.

Shader "Simple Additive" {
    Properties {
        _MainTex ("Texture to blend", 2D) = "black" {}
    }
    SubShader {
        Tags { "Queue" = "Transparent" }
        Pass {
            Blend One One
            SetTexture [_MainTex] { combine texture }
        }
    }
}
ShaderLab: Culling & Depth Testing
Синтаксис ShaderLab: тэги Pass