Version: 2021.1
Синтаксис ShaderLab: UsePass
ShaderLab: SubShader Tags

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

GrabPass - особый вид прохода: он захватывает содержимое экрана в текстуру там, где объект будет нарисован. Эта текстура может быть использована в последующих проходах для расширенных эффектов основанных на изображении.

Синтаксис

GrabPass указывается внутри субшейдера. Может принимать 2 формы:

  • Просто GrabPass { } захватит текущее содержимое экрана в текстуру. Доступ к текстуре в дальнейших проходах может быть получен используя имя _GrabTexture. На заметку: эта форма GrabPass проведёт сложную операцию захвата экрана для каждого объекта, что использует GrabPass.
  • GrabPass { "ИмяТекстуры" } захватит содержимое экрана в текстуру, но будет это делать только раз в кадр для первого объекта, что использует текстуру с указанным именем. В дальнейших проходах доступ к текстуре может быть получен используя указанное имя текстуры. Это более производительный способ, в случае, если у вас есть несколько объектов в сцене, использующих GrabPass.

В дополнение, GrabPass может использовать команды Name и Tags.

Пример

Вот затратный по мощности способ обратить цвета того, что рендерилось перед этим:

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
        }

    }
}

У этого шейдера есть 2 прохода: Первый проход захватывает что бы там ни было за объектом в момент рендера, а затем применяет это во втором проходе. Теперь, конечно, такой эффект может быть достигнут проще, используя обращение режима смешивания.

Смотрите также

Синтаксис ShaderLab: UsePass
ShaderLab: SubShader Tags