-->


Shader "UI/BoxBlur"
{
Properties
{
[HideInInspector]_MainTex("-",2D)="white"{}
_BlurCount("Blur Count", Range(0, 20)) = 1 //何回Blur処理を繰り返すか
_BlurDistance("Blur Distance", Range(1, 10)) = 1 //Blurの際、何ピクセルずれた場所からピクセル色を抜き出すか
}
SubShader
{
Tags
{
"RenderPipeline" = "UniversalPipeline"
"Queue" = "Transparent"
}
Cull Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
HLSLINCLUDE
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
//uGUI Image > Source Imageにアタッチされた画像を参照できるようにする
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
//Source Imageにアタッチされた画像のピクセルサイズを参照できるようにする
float4 _MainTex_TexelSize;
//SRP Batcherを適用
CBUFFER_START(UnityPerMaterial)
//今回追加したプロパティに対応する変数
int _BlurCount;
half _BlurDistance;
CBUFFER_END
struct Attributes
{
half2 uv : TEXCOORD0;
float4 positionOS : POSITION;
half4 color : COLOR;
};
struct Varyings
{
half2 uv : TEXCOORD0;
float4 positionCS : SV_POSITION;
half4 color : COLOR;
};
Varyings vert (Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.uv = input.uv;
output.color = input.color;
return output;
}
ENDHLSL
Pass
{
HLSLPROGRAM
half4 frag (Varyings input) : SV_Target
{
//Source Imageにアタッチされた画像の縦横ピクセルサイズに対し、その逆数を取得
//x: 1/width(ピクセル幅の逆数)
//y: 1/height(ピクセル高さの逆数)
//z: width(ピクセル幅そのもの)
//w: height(ピクセル高さそのもの)
half2 texelSize = _MainTex_TexelSize.xy;
half4 color = 0;
int count = 0;
for (int x = -_BlurCount; x <= _BlurCount; x++)
{
for (int y = -_BlurCount; y <= _BlurCount; y++)
{
//x軸、y軸に対しuv座標をいくらずらすか取得
half2 offset = half2(x * _BlurDistance, y * _BlurDistance) * texelSize;
//inputから渡されたuv座標に、offsetの修正値を与えて指定画像からピクセル色を取得してcolorに色を加算
color += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv + offset);
count++;
}
}
//加算した回数分だけ割って平均色を出す
return color / count;
}
ENDHLSL
}
}
}


//Source Imageにアタッチされた画像の縦横ピクセルサイズに対し、その逆数を取得
//x: 1/width(ピクセル幅の逆数)
//y: 1/height(ピクセル高さの逆数)
//z: width(ピクセル幅そのもの)
//w: height(ピクセル高さそのもの)
half2 texelSize = _MainTex_TexelSize.xy;
for (int x = -_BlurCount; x <= _BlurCount; x++)
{
for (int y = -_BlurCount; y <= _BlurCount; y++)
{
//x軸、y軸に対しuv座標をいくらずらすか取得
half2 offset = half2(x * _BlurDistance, y * _BlurDistance) * texelSize;