GrabPass — это команда, которая создает специальный тип прохода, который захватывает содержимое буфера кадра в текстуру. Эту текстуру можно использовать в последующих проходах для создания расширенных эффектов на основе изображения.
Эта команда может значительно увеличить время кадра ЦП и ГП. Как правило, вам следует избегать использования этой команды, кроме как для быстрого прототипирования, и пытаться добиться эффекта другими способами. Если вы используете эту команду, постарайтесь максимально сократить количество операций захвата экрана; либо сократив использование этой команды, либо используя сигнатуру, которая захватывает экран с именованной текстурой, если применимо.
Render pipeline compatibility
Название функции | Встроенный конвейер рендеринга | Универсальный конвейер рендеринга (URP) | Конвейер рендеринга высокого разрешения (HDRP) | Пользовательский SRP |
---|---|---|---|---|
GrabPass | Да | Нет | Нет | Нет |
Использование
Используйте эту команду в блоке SubShader.
GrabPass работает только с буфером кадров. Вы не можете использовать эту команду для захвата содержимого других целей рендеринга, буфера глубиныхранилища памяти, в котором хранится глубина z-значения каждого пикселя изображения, где z-значение — это глубина каждого отображаемого пикселя от плоскости проекции. Подробнее
См. в Словарь и т. д.
Обратите внимание, что две разные сигнатуры имеют разную функциональность и разные последствия для производительности. Использование именованной текстуры может привести к значительному сокращению количества операций захвата экрана, что снижает влияние этой ресурсоемкой команды.
Подпись | Функции |
---|---|
GrabPass { } |
Захватывает содержимое буфера кадра в текстуру, которую можно использовать в последующих проходах в том же подшейдере.
Ссылайтесь на текстуру, используя имя _GrabTexture. При использовании этой подписи Unity захватывает экран каждый раз, когда обрабатывает пакет, содержащий эту команду. Это означает, что Unity может захватывать экран несколько раз за кадр: один раз для каждого пакета. |
GrabPass { "ExampleTextureName" } |
Захватывает содержимое буфера кадра в текстуру, к которой вы можете получить доступ в последующих проходах в одном и том же кадре через несколько подшейдеров.
Ссылка на текстуру по заданному имени. При использовании этой сигнатуры Unity захватывает экран в первый раз в кадре, в котором выполняется рендеринг пакета, содержащего эту команду, с заданным именем текстуры. |
Примеры
В этом примере для встроенного конвейера рендеринга показано использование 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
{
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
}
}
}