[Unityシェーダー基礎] Renderer 2D DataでGrabPassの代替え処理。
URP環境での全画面反映シェーダーの作り方。
関連ページ
前回のページ
ではRender Graphを使って全画面反映のシェーダーを作りました。
しかしプロジェクトが
Renderer 2D Data
を使用している場合、RenderGraph無しで、シェーダーコードのみで全画面反映シェーダーが作れます。

URPの設定について
ProjectSettingsから使用しているRenderer 2D Dataを使っているか確認が可能です。
詳しくはこちら。
p.64 : シェーダー基礎、URP環境の確認の仕方
プロジェクト作成時にUniversal 2Dを選択している場合は、Renderer 2D Dataが指定されているはずです。
プロジェクトがUniversal Renderer Dataを選択している場合、このページのシェーダーは使う事はできません。
前回のページ
のRender Graphを作る必要があります。

全画面色反転シェーダー
以下の
URPGrab2D/InvertColor
のコード全文を.shaderファイルに丸コピしてください。
中身の細かい意味については
こちらの記事
に目を通しておくと分かり易いです。

Shader
"URPGrab2D/InvertColor"
{
Properties
{
[HideInInspector]_MainTex("-",2D)="white"{}
}
SubShader
{
Tags
{
"Queue"="Transparent"
"RenderPipeline"
=
"UniversalPipeline"
}
Cull
Off
ZWrite
Off
Blend
SrcAlpha
OneMinusSrcAlpha
Pass
{
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"
struct
Attributes
{
float4
positionOS
:
POSITION;
//オブジェクト空間座標(対象の大元の座標と寸法)
};
struct
Varyings
{
float4
positionCS
:
SV_POSITION;
//クリップ空間座表(カメラの四角い画角内での対象の座標)
float4
positionVP
:
TEXCOORD1;
//ビューポート空間座標(クリップ空間座表 -w ~ +w を 0 ~ w の範囲に修正した座標)
};
// 背景テクスチャ
TEXTURE2D(_CameraSortingLayerTexture);
SAMPLER(sampler_CameraSortingLayerTexture);
Varyings
vert
(Attributes
input)
{
Varyings
output;
//オブジェクト空間座標をクリップ空間、ビューポート空間座標にそれぞれ変換
output.positionCS
=
TransformObjectToHClip(input.positionOS.xyz);
output.positionVP
=
ComputeScreenPos(output.positionCS);
return
output;
}
half4
frag
(Varyings
input)
:
SV_Target
{
//ビューポート空間座標から奥行を省いて座標を平面化する
float2
screenUV
=
input.positionVP.xy
/
input.positionVP.w;
//受け取った全画面情報から指定uv座標のピクセル色を抜き取る
half4
background
=
SAMPLE_TEXTURE2D(_CameraSortingLayerTexture,
sampler_CameraSortingLayerTexture,
screenUV);
//ピクセル色をリニア空間ルールから一旦ガンマ空間ルールへ変換
half3
sRGB
=
LinearToSRGB(background.rgb);
//ガンマ空間ルール上で色を反転
sRGB
=
abs(1
-
sRGB);
//色をガンマ空間ルールからリニア空間ルールに戻す
half3
invertColor
=
SRGBToLinear(sRGB);
return
half4(invertColor,
1);
}
ENDHLSL
}
}
}

コードの以下の部分で、
_CameraSortingLayerTexture
というテクスチャを受け取っています。
これはRender 2D Dataがそのポストプロセス処理の中で、デフォルトで送信しているテクスチャです。
// 背景テクスチャ
TEXTURE2D(_CameraSortingLayerTexture);
SAMPLER(sampler_CameraSortingLayerTexture);
この中にカメラの全画面の色情報が格納さています。
受け取ったテクスチャ情報はピクセルシェーダー内で
色反転
させています。
half4
frag
(Varyings
input)
:
SV_Target
{
//ビューポート空間座標から奥行を省いて座標を平面化する
float2
screenUV
=
input.positionVP.xy
/
input.positionVP.w;
//受け取った全画面情報から指定uv座標のピクセル色を抜き取る
half4
background
=
SAMPLE_TEXTURE2D(_CameraSortingLayerTexture,
sampler_CameraSortingLayerTexture,
screenUV);
//ピクセル色をリニア空間ルールから一旦ガンマ空間ルールへ変換
half3
sRGB
=
LinearToSRGB(background.rgb);
//ガンマ空間ルール上で色を反転
sRGB
=
abs(1
-
sRGB);
//色をガンマ空間ルールからリニア空間ルールに戻す
half3
invertColor
=
SRGBToLinear(sRGB);
return
half4(invertColor,
1);
}

Render 2D Dataの変更
描画済みの背景をテクスチャとして利用するため、一点だけRenderer 2D Dataの設定を変更します。
Camera Sorting Layer Texture
の
Foremost Sorting Layer
をDefaultに変えてください。

Unityにシェーダーを反映
次にHierarchy上で_CameraSortingLayerTexture専用のOverlay CameraとCanvasを追加します。
作成したカメラは、Base CameraのStackの一番下に登録してください。
作成したCanvasにuGUI Imageを配置して、ストレッチで全画面に伸ばします。
Imageのマテリアルには先ほど作ったURPGrab2D/InvertColorを指定したマテリアルをアタッチします。
すると以下のようにカメラに映っている全ての色が反転するのを確認できるはずです。
Imageの描画範囲を変えると、色反転の範囲も追随して変わります。
0
0