ピクセルシェーダ
ピクセルシェーダは引数で頂点シェーダから構造体を受け取っています。サンプルに追加するコードは以下になります。
//ピクセルシェーダ本体
float4 TestShader_PS(OutVS IN) : COLOR
{
//出力色
float4 Color;
//---追加---//
//歪ませる量を計算
//法線が視点方向からずれている程歪む
float add = (1-dot(normalize(IN.Eye),normalize(IN.Normal)));
//歪み量を色に代入する
Color = float4(add,0,0,1);
//----------//
/* 削除
//仮の色を代入
Color = float4(0,0,0,1);
*/
//色を出力
return Color;
}
歪ませる量の計算
ここではdot関数(内積)を使います。関数の細かい解説についてはMSDNライブラリ内のリファレンスを参照してみてください(参考資料2)。
内積とは?
内積や外積というと難しいイメージがありますが、基本的にシェーダ上ではいち関数として扱うだけの物なので気負わないで見ていきましょう。こと3Dプログラムでの内積は「2つのベクトルの角度差」を計算するためだけに使用すると考えて問題ありません。
両ベクトルからなる角が鋭角になると1に、鈍角になると0に近づく、といった性質があります。
dot関数の使用
今回dot関数には頂点シェーダで入力された変数「IN.Eye」と「IN.Normal」を引数として渡していますので、該当ピクセルがカメラの方を向いている具合を得ることができるわけです。
なお、IN.Eye、IN.Normalに対してnormalize関数を使っていますが、これは「正規化関数」と言い、引数に渡されたベクトルを-1~1の値に正規化するための関数です。法線(Normal)と名前が似ていますがまったく違うものなので誤解をしないよう気を付けてください。
計算結果のテスト表示
まずはテストのために現在の数値を画面に反映してみます。
Color = float4(add,0,0,1);としている部分では、出力色の赤成分に歪み値、緑、青に0、透明度に1を代入しています。
視点に垂直に近づくほど色が黒く、角度が離れる程赤くなっています。赤ければ赤い程、背景が歪んで映るという訳です。


