Version: 2019.3
ShaderLab: UsePass
ShaderLab: SubShader Tags (etiquetas SubShader)

ShaderLab: GrabPass

GrabPass es un tipo de pass especial - que agarra el contenido de la pantalla donde el objeto está a punto de ser dibujado en una textura. Esta textura se puede utilizar en passes posteriores para realizar efectos basados en imágenes avanzadas.

Sintaxis

El GrabPass pertenece dentro de un subshader. Puede tomar dos formas:

  • Sólo GrabPass {} agarra el contenido de la pantalla actual en una textura. La textura se puede acceder en passes posteriores por el nombre del _GrabTexture. Nota: esta forma de grab pass hará la operación de captura de agarre de la pantalla que consume mucho tiempo para cada objeto que lo usa.
  • GrabPass { "TextureName" } toma el contenido actual de la pantalla en una textura, pero solo lo hará una vez por frame para el primer objeto que usa el nombre de textura dado. La textura se puede acceder en pases adicionales por el nombre de textura dado. Este es un método más eficaz cuando tiene varios objetos utilizando GrabPass en la escena.

Además, GrabPass puede utilizar los comandos Name y Tags.

Ejemplo

He aquí una manera ineficaz de invertir los colores de lo que se renderizó antes:

Shader "GrabPassInvert"
{
    SubShader
    {
        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }

        // Grab the screen behind the object into _BackgroundTexture
        GrabPass
        {
            "_BackgroundTexture"
        }

        // Render the object with the texture generated above, and invert the colors
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f
            {
                float4 grabPos : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert(appdata_base v) {
                v2f o;
                // use UnityObjectToClipPos from UnityCG.cginc to calculate 
                // the clip-space of the vertex
                o.pos = UnityObjectToClipPos(v.vertex);
                // use ComputeGrabScreenPos function from UnityCG.cginc
                // to get the correct texture coordinate
                o.grabPos = ComputeGrabScreenPos(o.pos);
                return o;
            }

            sampler2D _BackgroundTexture;

            half4 frag(v2f i) : SV_Target
            {
                half4 bgcolor = tex2Dproj(_BackgroundTexture, i.grabPos);
                return 1 - bgcolor;
            }
            ENDCG
        }

    }
}

Este shader tiene dos passes: El primer pass grabs (agarra) lo que haya detrás del objeto en el momento de renderizado, y luego aplica esto en el segundo pass. Tenga en cuenta que el mismo efecto podría lograrse de manera más eficiente utilizando un modo blend mode inverso.

Véase también

ShaderLab: UsePass
ShaderLab: SubShader Tags (etiquetas SubShader)