-->



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
}
}
}
// 背景テクスチャ
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);
}




