HLSLでGaussian Blur

提供: MonoBook
2019年1月22日 (火) 04:41時点における180.15.192.154 (トーク)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

HLSLで画面全体(=画面全体をテクスチャ化したもの)にGaussian Blurを掛けたい。

「ぼけた画像からフェードイン」「ぼかしながらフェードアウト」というポケモンなどのゲームのシーン切り替え時によく使われるエフェクトのアレ。

実装例[編集 | ソースを編集]

Android版のMonoGameで動かす前提(OpenGL ESで動かす前提)なので、シェーダーモデルは3.0にしてある。

#define RADIUS  7
#define KERNEL_SIZE (RADIUS * 2 + 1)

//-----------------------------------------------------------------------------
// Globals.
//-----------------------------------------------------------------------------

float weights[KERNEL_SIZE];
float2 offsets[KERNEL_SIZE];

//-----------------------------------------------------------------------------
// Textures.
//-----------------------------------------------------------------------------

sampler colorMapTexture : register(s0);

//-----------------------------------------------------------------------------
// Pixel Shaders.
//-----------------------------------------------------------------------------

float4 PS_MAIN(float4 position : SV_Position, float4 col : COLOR0, float2 uv : TEXCOORD0) : COLOR0
{
    float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);

    for (int i = 0; i < KERNEL_SIZE; ++i)
        color += tex2D(colorMapTexture, uv + offsets[i]) * weights[i];
    
    return color;
}

//-----------------------------------------------------------------------------
// Techniques.
//-----------------------------------------------------------------------------

technique GaussianBlur
{
    pass Pass1
    {
        PixelShader = compile ps_3_0 PS_MAIN();
    }
}