スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ガウスエフェクト

HDRを試してみたくなったのでとりあえず「ぼかし」を作ってみた
ウェイトを求めてエフェクトファイルに渡しておきXぼかし→Yぼかしといった手順
ぼかし具合で重さが変わらないのが利点?


ロードあたりに
//ガウスエフェクト
gaussEffect = Content.Load(@"fx/gauss");
gaussWeight = new float[8];
UpdateWeight(15.0f,gaussWeight);//ぼかし具合
gaussEffect.Parameters["weight"].SetValue(gaussWeight);
gaussEffect.Parameters["Darkness"].SetValue(6.5f);//暗さ(0はダメ)



メソッド一個
#region ガウスさんの考えた曲線を作ってみる
//引数1【ぼかし具合を表す数値(float)】
//引数2【置き換えたい配列(float[]型要素数は8)】
//=直接ではないが参照した配列の中身を直接置き換える
void UpdateWeight(float dispersion,float[] ary)
{
int i;
float total=0;
for (i = 0; i < ary.Length; i++)
{
ary[i] = (float)(Math.Exp(-0.5f * (float)(i * i) / dispersion));
if(0==i){
total += ary[i];
}else{
total += 2.0f * ary[i];
}
}
// 規格化
for (i = 0; i < ary.Length; i++)
{ ary[i] /= total; }
}
#endregion



fxファイル
//Gauss.fx

float MAP_WIDTH = 512.0f; //GAUSS_MAP_SIZEと合わせてね
float MAP_HEIGHT = 512.0f;


// グローバル変数
float Darkness;//0はエラー ってかつかってないね。。
float weight[8];

//samplar
sampler SrcSamp = sampler_state
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Clamp;
AddressV = Clamp;
};

//ピクセル入力
struct PS_INPUT
{
float2 TexCoord : TEXCOORD0;
};

//関数

//pass0 Xガウス
float4 PS_GaussX(PS_INPUT Input) : COLOR0
{
float4 Color;

Color = weight[0] * tex2D( SrcSamp, Input.TexCoord );
Color += weight[1]
* (tex2D( SrcSamp, Input.TexCoord + float2( + 2.0f/MAP_WIDTH, 0 ) )
+ tex2D( SrcSamp, Input.TexCoord + float2( - 2.0f/MAP_WIDTH, 0 ) ));
Color += weight[2]
* (tex2D( SrcSamp, Input.TexCoord + float2( + 4.0f/MAP_WIDTH, 0 ) )
+ tex2D( SrcSamp, Input.TexCoord + float2( - 4.0f/MAP_WIDTH, 0 ) ));
Color += weight[3]
* (tex2D( SrcSamp, Input.TexCoord + float2( + 6.0f/MAP_WIDTH, 0 ) )
+ tex2D( SrcSamp, Input.TexCoord + float2( - 6.0f/MAP_WIDTH, 0 ) ));
Color += weight[4]
* (tex2D( SrcSamp, Input.TexCoord + float2( + 8.0f/MAP_WIDTH, 0 ) )
+ tex2D( SrcSamp, Input.TexCoord + float2( - 8.0f/MAP_WIDTH, 0 ) ));
Color += weight[5]
* (tex2D( SrcSamp, Input.TexCoord + float2( +10.0f/MAP_WIDTH, 0 ) )
+ tex2D( SrcSamp, Input.TexCoord + float2( -10.0f/MAP_WIDTH, 0 ) ));
Color += weight[6]
* (tex2D( SrcSamp, Input.TexCoord + float2( +12.0f/MAP_WIDTH, 0 ) )
+ tex2D( SrcSamp, Input.TexCoord + float2( -12.0f/MAP_WIDTH, 0 ) ));
Color += weight[7]
* (tex2D( SrcSamp, Input.TexCoord + float2( +14.0f/MAP_WIDTH, 0 ) )
+ tex2D( SrcSamp, Input.TexCoord + float2( -14.0f/MAP_WIDTH, 0 ) ));

//白黒テスト
//Color.rgb = (Color.r +Color.g + Color.b)/Darkness;
//Color.a = 1.0f;

return Color;
}

//pass1 Yガウス
float4 PS_GaussY(PS_INPUT Input) : COLOR0
{
float4 Color;

Color = weight[0] * tex2D( SrcSamp, Input.TexCoord );
Color += weight[1]
* (tex2D( SrcSamp, Input.TexCoord + float2( 0, + 2.0f/MAP_HEIGHT) )
+ tex2D( SrcSamp, Input.TexCoord + float2( 0, - 2.0f/MAP_HEIGHT) ));
Color += weight[2]
* (tex2D( SrcSamp, Input.TexCoord + float2( 0, + 4.0f/MAP_HEIGHT) )
+ tex2D( SrcSamp, Input.TexCoord + float2( 0, - 4.0f/MAP_HEIGHT) ));
Color += weight[3]
* (tex2D( SrcSamp, Input.TexCoord + float2( 0, + 6.0f/MAP_HEIGHT) )
+ tex2D( SrcSamp, Input.TexCoord + float2( 0, - 6.0f/MAP_HEIGHT) ));
Color += weight[4]
* (tex2D( SrcSamp, Input.TexCoord + float2( 0, + 8.0f/MAP_HEIGHT) )
+ tex2D( SrcSamp, Input.TexCoord + float2( 0, - 8.0f/MAP_HEIGHT) ));
Color += weight[5]
* (tex2D( SrcSamp, Input.TexCoord + float2( 0, +10.0f/MAP_HEIGHT) )
+ tex2D( SrcSamp, Input.TexCoord + float2( 0, -10.0f/MAP_HEIGHT) ));
Color += weight[6]
* (tex2D( SrcSamp, Input.TexCoord + float2( 0, +12.0f/MAP_HEIGHT) )
+ tex2D( SrcSamp, Input.TexCoord + float2( 0, -12.0f/MAP_HEIGHT) ));
Color += weight[7]
* (tex2D( SrcSamp, Input.TexCoord + float2( 0, +14.0f/MAP_HEIGHT) )
+ tex2D( SrcSamp, Input.TexCoord + float2( 0, -14.0f/MAP_HEIGHT) ));

//白黒テスト
//Color.rgb = (Color.r +Color.g + Color.b)/Darkness;
//Color.a = 1.0f;

return Color;
}

// -------------------------------------------------------------
// テクニック
technique gaussdayo
{
pass P0
{
PixelShader = compile ps_2_0 PS_GaussX();
}
pass P1
{
PixelShader = compile ps_2_0 PS_GaussY();
}
}


一応ぼけたけどこれどうなんでしょ・・
保留して別の方法も考えてみます

もうねよっと


コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。