Получить текущий кадровый буфер с помощью команды 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