[Unityシェーダー基礎] Render FeatureとFull Screen Pass。
URP環境での全画面反映シェーダーの作り方。
関連ページ
URP環境ではビルトインRPにあった
GrabPass
が使えなくなりました。
全画面反映シェーダーを作るには基本
Full Screen Pass
を利用するか
RernderGraph
を自作する必要があります。
このページではFull Screen Passを使った全画面反映シェーダーを解説していきます。
ただ自分でこんなページを作っておいてなんですが、Full Screen Passを用いた開発は小回りが利かず使いづらいです。
次のページ
のRernderGraphを使って全画面反映シェーダーを作ったほうが良いと思います。

Full Screen Pass Renderer Feature
Full Screen Passは正式名称で
Full Screen Pass Renderer Feature
と言います。
これをお使いのプロジェクトの
Universal Renderer Data
か
Renderer 2D Data
にカスタムポストプロセスとして登録します。
プロジェクトがどちらを使ってるかは
こちらのページ
の方法で確認が可能です。
Universal Renderer Data、あるいはRenderer 2D Dataの一番下から、
Add Renderer Feature
をクリックしてください。
今回追加するのは前述のとおりFull Screen Pass Renderer Featureです。
Addすると、最初からURPの
FullScreenInvertColors
というマテリアルがアタッチされているのを確認できます。
Injection Point
は
After Rendering Post Processing
に変更する必要があります。
画面を確認すると、カメラに写っている全ての色が反転しているのを確認できます。
もしCameraのStack処理で複数Canvas描画している際は、もう一つFull Screen Pass Renderer Featureを追加します。
追加した方のInjection Pointは
Before Rendering Transparent
に設定します。

自作Full Screen Passシェーダー
Unityが標準で用意しているFullScreenInvertColorsは実はバグに近い挙動を持っています。
色の反転処理を全部リニア空間ルールで行っているため、人間の目にはかなり白浮きした結果に移ります。
左がガンマ空間ルールで反転した画像、右がリニア空間ルールで反転した画像です。(
リニア空間、ガンマ空間について
)
処理を修正するためにFull Screen Pass用のシェーダーを自作します。下がコード全文です。
Shader
"FullScreen/FSP_InvertColor"
{
SubShader
{
Pass
{
Cull
Off
ZWrite
Off
HLSLPROGRAM
#pragma
vertex
Vert
#pragma
fragment
frag
#include
"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
//後述のLinearToSRGB、SRGBToLinearで必要なライブラリ
#include
"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
//これをインクルードすると頂点シェーダーやVaryingsが自動で定義される
#include
"Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"
half4
frag(Varyings
input)
:
SV_Target
{
//input.texcoord は自動的に渡されるUV座標
float2
uv
=
input.texcoord;
//_BlitTexture は Blit.hlsl 内で定義済された、全画面のキャプチャー画像情報
//そこからinputで受け取ったuv座標のピクセル色を取得
half4
col
=
SAMPLE_TEXTURE2D(_BlitTexture,
sampler_LinearClamp,
uv);
//ピクセル色をリニア空間ルールから一旦ガンマ空間ルールへ変換
half3
sRGB
=
LinearToSRGB(col.rgb);
//ガンマ空間ルール上で色を反転
sRGB
=
1
-
sRGB;
//色をガンマ空間ルールからリニア空間ルールに戻す
col.rgb
=
SRGBToLinear(sRGB);
return
col;
}
ENDHLSL
}
}
}
Blit.hlslをincludeしているお陰で、自分で構造体や頂点シェーダーを定義する必要がなく、かなり簡潔なコードになっています。
//これをインクルードすると頂点シェーダーやVaryingsが自動で定義される
#include
"Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"
作成したFullScreen/FSP_InvertColorシェーダーをマテリアルから指定して、
PassMaterial
に割り当てて修正完了です。
以上、Full Screen Passの解説でした。
この機能の弱点は、プロジェクト全体で適用されてしまうため、シーンごとの管理が面倒なことです。
場面場面で明示的に以下のようなコードを実行し、Full Screen Passを有効にしたり無効にしたりする必要があります。
public
UniversalRendererData
rendererData;
// URPのRendererアセットをアサイン
public
void
ToggleEffect(bool
s)
{
// リストの中から特定のFeatureを探して切り替える
var
feature
=
rendererData.rendererFeatures.Find(f
=>
f.name
==
"MyFullScreenPass");
if
(feature
!=
null)
{
feature.SetActive(s);
}
}
また文字通り全画面の適用しか出来ないので、例えば画面半分だけシェーダー効果を反映させたいということは出来ません。
他にも2Pass、3Passの複雑なシェーダーを作りたい場合は、結局
RenderGraph
を頼ることになります。
開発の小回りは利きづらいので、自分的には二度と使うことはないと思います。
0
0