SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MikuMikuEffectで学ぶHLSL入門

3DCGツール「MikuMikuDance」のエフェクトを拡張する「MikuMikuEffect」
はじめてのエフェクト制作

MikuMikuEffectで学ぶHLSL入門(4)

ピクセルシェーダ

 ピクセルシェーダは引数で頂点シェーダから構造体を受け取っています。サンプルに追加するコードは以下になります。

//ピクセルシェーダ本体
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つのベクトルの角度差」を計算するためだけに使用すると考えて問題ありません。

dot
dot

 両ベクトルからなる角が鋭角になると1に、鈍角になると0に近づく、といった性質があります。

dot関数の使用

 今回dot関数には頂点シェーダで入力された変数「IN.Eye」と「IN.Normal」を引数として渡していますので、該当ピクセルがカメラの方を向いている具合を得ることができるわけです。

 なお、IN.Eye、IN.Normalに対してnormalize関数を使っていますが、これは「正規化関数」と言い、引数に渡されたベクトルを-1~1の値に正規化するための関数です。法線(Normal)と名前が似ていますがまったく違うものなので誤解をしないよう気を付けてください。

計算結果のテスト表示

 まずはテストのために現在の数値を画面に反映してみます。

 Color = float4(add,0,0,1);としている部分では、出力色の赤成分に歪み値、緑、青に0、透明度に1を代入しています。

dist_param
dist_param

 視点に垂直に近づくほど色が黒く、角度が離れる程赤くなっています。赤ければ赤い程、背景が歪んで映るという訳です。

コラム:身近な内積

 今回は視点・法線という計算をした内積ですが、実は3D描画の世界ではとても広く使われています。内積の重要な使い道、それはライティングです。

 

light
light

 平行光源ライトの角度と法線の内積計算結果です。

float3   LightDir    : DIRECTION  < string Object = "Light"; >;

 このように変数を宣言することで取得したライトの角度を使っています。光関係のエフェクトでは特に重宝する関数なのでこの機会にぜひ覚えてみてください。

次のページ

修正履歴

この記事は参考になりましたか?

MikuMikuEffectで学ぶHLSL入門連載記事一覧

もっと読む

この記事の著者

ビームマンP(ビームマンピー)

ニコニコ動画等でMikuMikuEffect用シェーダプログラム開発者として活動。 開発を始めた理由はカッコいいビームやミサイルが作りたかった為。 エフェクト配布用サイト http://www43.atwiki.jp/beamman/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6192 2011/10/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー