シャイニングのシェーダー

ついこの間シャイニングのピアレビューが通りました
審査してくれた方ありがとうございます

この頃はXNAコンテストに向け新作を作成中です
前に作った「あちゃちゃ」というゲームを大幅リニューアルして出す予定
時間があればもう一本!
欲張って出してもろくなものはできなさそうですが

今回追加したシャイニングの機能で、
やられたときに画面の明暗が反転(ネガティブフィルタ)する処理と
ブースト使用時のブラーのシェーダーを載せてみます
後、アナグリフモードも実装したのでそれも
単にビューの位置をずらしたタイミングで赤青を切り替えるだけです





sampler BloomSampler : register(s0);
sampler BaseSampler : register(s1);

float BloomIntensity;
float BaseIntensity;

float BloomSaturation;
float BaseSaturation;

//ここを本体から切り替え
bool GreenViewEnable;
bool BuleRedViewEnable;
bool BuleRedSwitch;
bool RevViewEnable;

float2 m_CenterTexel ; //ブラーの中心のテクセル座標
float BlurPower = 9.9f; //ぼけ強度(0.0f でボケなし)
float m_TU; //X方向の隣のテクセル位置
float m_TV; //Y方向の隣のテクセル位置


float4 AdjustSaturation(float4 color, float saturation)
{
float grey = dot(color, float3(0.3, 0.59, 0.11));

return lerp(grey, color, saturation);
}

float4 Expl( float2 texCoord : TEXCOORD0 ) : COLOR0
{
float4 Color[10];

m_CenterTexel.x = 0.5;
m_CenterTexel.y = 0.5;
//ブラーの中心位置 ← 現在のテクセル位置
float2 dir = m_CenterTexel - texCoord;

//距離を計算する
float len = length( dir );

//1テクセルの大きさをセット
m_TU = 1.0f / 1024;
m_TV = 1.0f / 768;

//方向ベクトルの正規化し、1テクセル分の長さとなる方向ベクトルを計算する
dir = normalize( dir ) * float2( m_TU, m_TV );

//m_BlurPower でボケ具合を調整する
//距離を積算することにより、爆発の中心位置に近いほどブラーの
//影響が小さくなるようにする
dir *= BlurPower * len;

//合成する
Color[0] = tex2D( BaseSampler, texCoord ) * 0.19f;
Color[1] = tex2D( BaseSampler, texCoord + dir ) * 0.17f;
Color[2] = tex2D( BaseSampler, texCoord + dir * 2.0f ) * 0.15f;
Color[3] = tex2D( BaseSampler, texCoord + dir * 3.0f ) * 0.13f;
Color[4] = tex2D( BaseSampler, texCoord + dir * 4.0f ) * 0.11f;
Color[5] = tex2D( BaseSampler, texCoord + dir * 5.0f ) * 0.09f;
Color[6] = tex2D( BaseSampler, texCoord + dir * 6.0f ) * 0.07f;
Color[7] = tex2D( BaseSampler, texCoord + dir * 7.0f ) * 0.05f;
Color[8] = tex2D( BaseSampler, texCoord + dir * 8.0f ) * 0.03f;
Color[9] = tex2D( BaseSampler, texCoord + dir * 9.0f ) * 0.01f;

return Color[0] + Color[1] + Color[2] + Color[3] + Color[4] + Color[5]
+ Color[6] + Color[7] + Color[8] + Color[9];
}

float4 PixelShader(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 bloom = tex2D(BloomSampler, texCoord);
float4 base;
float gray;
float4 color;

if(BlurPower > 0)
{
base = Expl(texCoord);
}
else
{
base = tex2D(BaseSampler, texCoord);
}
// ブルームの処理
bloom = AdjustSaturation(bloom, BloomSaturation) * BloomIntensity;
base = AdjustSaturation(base, BaseSaturation) * BaseIntensity;

base *= (1 - saturate(bloom));

//色調変更モード
if (GreenViewEnable)
{
color = float4( base.g +bloom.g ,base.b +bloom.b, base.r
+bloom.r*0.4, base.a +bloom.a );
}
//赤青アナグリフモード
else if (BuleRedViewEnable)
{
gray = 0.3*base.r + 0.59 *base.g + 0.11*base.b;
gray += 0.3*bloom.r + 0.59 *bloom.g + 0.11*bloom.b;
//ここで赤青を切り替える
if(BuleRedSwitch)
{
color = float4( gray * 1.5, 0, 0, base.a );
}
else
{
color = float4( 0, 0, gray * 1.5, base.a );
}
}
//通常モード
else
{

color = base + bloom;
//反転モード
if (RevViewEnable)
{
color.rgb = 1.0f - color.rgb;
}
}
return color;
}




technique BloomCombine
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShader();
}
}



鋼鉄の戦士さんのサイトを参考にしています
http://maverickproj.web.fc2.com/pg48.html
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

プロフィール

TEA(てぃあ)

Author:TEA(てぃあ)
親サイト:
フリーのゲームがダウンロードできます
主にシューティング系

最新記事
最新コメント
カテゴリ
PSP Vita
カウンター
ジャスティスレギオン 無料ダウンロード
インディーズPSPVitaゲーム
リンクや作った物
検索フォーム
RSSリンクの表示