Синтаксис 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 прохода: Первый проход захватывает что бы там ни было за объектом в момент рендера, а затем применяет это во втором проходе. Теперь, конечно, такой эффект может быть достигнут проще, используя обращение режима смешивания.
Смотрите также