Unity 6.3
0 онлайн 54 гостей 3 в системе
Вход

Получить текущий кадровый буфер с помощью команды GrabPass во Встроенном Render Pipeline

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

Эта команда может значительно увеличить время кадров CPU и GPU. Вы должны избегать использования этой команды, кроме как для быстрого прототипирования, и пытаться достичь эффекта другими способами. Если вы используете эту команду, постарайтесь сократить количество операций захвата экрана как можно больше; либо уменьшив использование этой команды, либо используя подпись, которая захватывает экран к названной текстуре, если это применимо.

GrabPass работает только на буфере кадров. Вы не можете использовать эту команду для захвата содержимого других целей рендеринга, буфера глубины и т.д.

Примеры

Этот пример для Built-in Render Pipeline демонстрирует использование GrabPass для инвертирования цветов рендерного объекта. Обратите внимание, что это не эффективный способ достижения этого эффекта, и предназначен только для демонстрации использования GrabPass; тот же эффект может быть достигнут более эффективно с помощью режима инвертированного смешивания.

Shader "GrabPassInvert"
{
    SubShader
    {
        // Draw 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
        {
            HLSLPROGRAM
            #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;
            }
            ENDHLSL
        }

    }
}

##

Предоставление цвета фрагмента в качестве входа

Некоторые GPUs (особенно те, что основаны на PowerVR на iOS) позволяют выполнять программируемое смешивание, предоставляя текущий цвет фрагмента в качестве входа для Фрагмент-Шейдера (см. EXT_shader_framebuffer_fetch на khronos.org). Этот процесс иногда называется получением кадрового буфера.

Для этого используйте аргумент цвета inout при написании шейдера фрагмента. Например:

HLSLPROGRAM
// only compile Shader for platforms that can potentially
// do it (currently gles,gles3,metal)
#pragma only_renderers framebufferfetch

void frag (v2f i, inout half4 ocol : SV_Target)
{
    // ocol can be read (current framebuffer color)
    // and written into (will change color to that one)
    // ...
}
ENDHLSL

Дополнительные ресурсы