ShaderLab: Culling & Depth Testing
ShaderLab: Pass Tags

ShaderLab: Blending

El Blending se utiliza para volver los objetos transparentes.

Cuando las gráficas son renderizadas, después de que todos los shaders han sido ejecutados y todas las texturas han sido aplicadas, los pixeles son escritos en la pantalla. La manera como se combina con lo que ya está se controla por el comando Blend.

Sintaxis

Blend Off: Apaga el blending (esto es lo predeterminado)

Blend SrcFactor DstFactor: Configura y habilita el blending. El color generado es multiplicado por el SrcFactor. El color que ya está en la pantalla es multiplicado por DstFactor y los dos se agregan juntos.

Blend SrcFactor DstFactor, SrcFactorA DstFactorA: Lo mismo que arriba, pero tienen diferentes factores para hacerle blending (mezclar) el canal alpha.

BlendOp BlendOp: En vez de agregar los colores blended (mezclados) juntos, haga otra operación diferente en ellos.

BlendOp OpColor, OpAlpha: Lo mismo que arriba, pero utiliza una operación diferente de blend para los canales de color (RGB) y alpha (A).

AlphaToMask On: Prende alpha-to-coverage. Cuando se utilice MSAA, alpha to coverage modifica la mask de coverage (cubrimiento) multisample (varias muestras) proporcionalmente al valor resultante alpha del pixel shader. Este típicamente se utiliza para unos outlines menos aliased que un alpha-test regular; útil para la vegetación y otros shaders probados para alpha.

Operaciones Blend

Las siguientes operaciones blend se pueden utilizar:

Add Agrega una fuente y destino juntos.
Sub Resta el destino de la fuente.
RevSub Resta la fuente del destino.
Min Utiliza la fuente y el destino más pequeño.
Max Utiliza la fuente y destino más grande.
LogicalClear Operación lógica: Clear (0) DX11.1 solamente.
LogicalSet Operación lógica: Configure (1) DX11.1 solamente.
LogicalCopy Operación lógica: Copie (s) DX11.1 solamente.
LogicalCopyInverted Operación lógica: Copia invertida (!s) DX11.1 solamente.
LogicalNoop Operación lógica: Noop (d) DX11.1 solamente.
LogicalInvert Operación lógica: Invertir (!d) DX11.1 solamente.
LogicalAnd Operación lógica: And (s & d) DX11.1 solamente.
LogicalNand Operación lógica : Nand !(s & d) DX11.1 solamente.
LogicalOr Operación lógica : Or (o) (s | d) DX11.1 solamente.
LogicalNor Operación lógica: Nor !(s | d) DX11.1 solamente.
LogicalXor Operación lógica: Xor (s ^ d) DX11.1 solamente.
LogicalEquiv Operación lógica: Equivalencia !(s ^ d) DX11.1 solamente.
LogicalAndReverse Operación lógica: Reverse And (s $ !d) DX11.1 solamente.
LogicalAndInverted Operación lógica: Invertida And (y) (!s & d) DX11.1 solamente.
LogicalOrReverse Operación lógica: Reverse Or (s | !d) DX11.1 solamente.
LogicalOrInverted Operación lógica: Or (o) invertido (!s | d) DX11.1 solamente.

Blend factors

Todas las siguientes propiedades son válidas para ambos SrcFactor & DstFactor en el comando Blend. Source (fuente) se refiere al color calculado, Destination (destino) es el color que ya está en la pantalla. Los blend factors son ignorados si *BlendOp está utilizando operaciones lógicas.

One El valor de uno - utilice esto para permitir que el color fuente o destino venga completamente.
Zero El valor cero - utilice esto para quitar los valores ya sea de la fuente o el destino.
SrcColor El valor de este estado es multiplicado por el valor del color fuente.
SrcAlpha El valor de este estado es multiplicado por el valor alpha fuente.
DstColor El valor de este estado es multiplicado por el valor del color fuente del frame buffer.
DstAlpha El valor de este estado es multiplicado por el valor fuente alpha del frame buffer.
OneMinusSrcColor El valor de este estado es multiplicado por (1 - color fuente).
OneMinusSrcAlpha El valor de este estado es multiplicado por (1 - alpha fuente).
OneMinusDstColor El valor de este estado es multiplicado por (1 - color destino).
OneMinusDstAlpha El valor de este estado es multiplicado por (1 - alpha destino).

Detalles

Abajo están los tipos de blend más comunes:

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

Para dibujar objetos completamente opacos o completamente transparentes, dónde la transparencia se define por el canal alpha de la textura (e.g. hojas, pato, cercas alambradas etc.), hay varios acercamientos comunes utilizados:

Alpha Blending

Un alpha blending regular
Un alpha blending regular

A menudo esto significa que los objetos tienen que ser considerados como “semitransparentes”, y por lo tanto no pueden utilizar algunas de las características de renderizado (deferred shading; no puede recibir sombras etc.). Los objetos alpha blended Concave (cóncavos) u overlapping (superpuestos) a menudo también tienen problemas de orden de dibujo.

La mayoría de alpha blended shaders también configuran transparent render queue, y apaga depth writes. Por lo que el código shader se ve así:

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

// inside Pass
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

Alpha Testing / Cutout

clip() en el pixel shader
clip() en el pixel shader

Al utilizar la instrucción HLSL clip() en el pixel shader, un pixel se puede “omitir” o no se basa en este dependiendo de algunos criterios. Esto significa que el objeto todavía se puede considerar como completamente opaco, y no tiene problemas de orden al dibujar. Sin embargo, esto significa que todos los pixeles están completamente opacos o transparentes, llevando a aliasing (“jaggies”).

La mayoría de los shaders probados con alpha también pueden configurar cutout render queue. Por lo que el código shader se ve así:

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

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

Alpha to Coverage

AlphaToMask prendida, en 4xMSAA
AlphaToMask prendida, en 4xMSAA

Cuando se utilice anti-aliasing multisample (varias muestras) (MSSA, ver QualitySettings), es posible mejorar el acercamiento del alpha testing al utilizar la funcionalidad del GPU “alpha to coverage”. Esto mejora la apariencia del borde, dependiendo en el nivel MSAA utilizado.

Esta funcionalidad funciona mejor en texturas que son en su mayoría opacas o transparentes, y tienen áreas “parcialmente transparentes” demasiado delgadas (pasto, hojas y similar).

La mayoría de los alpha-to-coverage shader también configuran cutout render queue. Por lo que el código shader se ve así:

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

// inside Pass
AlphaToMask On

Ejemplo

Aquí hay un pequeño shader ejemplo que agrega una textura a lo que sea que esté en la pantalla ahorita:

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 Tags