ひきぷろのプログラミング日記

プログラミングの日記です。

(Unity) 移動平均フィルタを Unity に移植してみた

Unity のシェーダーで書きなおしてみました。

// SMAFilter.shader
Shader "Custom/SMAFilter" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_Size ("Size", Int) = 1
	}
	SubShader {
		CGPROGRAM
		#pragma surface surf Lambert
		struct Input {
			float2 uv_MainTex;
		};
		sampler2D _MainTex;
		// Size 値は
		// 1: 3x3
		// 2: 5x5
		// 3: 7x7
		// というような感じです
		int _Size;
		void surf (Input IN, inout SurfaceOutput o) {
			if (_Size < 0) {
				_Size = 0;
			}
			float3 pixel = 0;
			float2 uv = IN.uv_MainTex;
			for (int y = -_Size; y <= _Size; y++) {
				for (int x = -_Size; x <= _Size; x++) {
					// テクスチャの座標系は 0.0 から 1.0 というようなサイズで指定するので、
					// スクリーンのピクセル数で割っています。
					float2 position = float2(x, y) / _ScreenParams.xy;
					pixel += tex2D(_MainTex, uv + position).rgb;
				}
			}
			pixel /= pow(_Size * 2 + 1, 2);
			o.Albedo = pixel.rgb;
		}
		ENDCG
	}
	FallBack "Diffuse"
}