SHOEISHA iD

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

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

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

MikuMikuEffectで学ぶHLSL入門

3DCGツール「MikuMikuDance」のエフェクトを拡張する「MikuMikuEffect」
専用モデルを利用したエフェクト

MikuMikuEffectで学ぶHLSL入門(6)


ラインのスクロールアニメーション

 次はラインをアニメーションさせてみましょう。

 54行目

//時間
float time : TIME;

 この「:TIME」という部分はMMEの機能で、これを付けた変数に、再生からの経過時間を取得することができます(詳細はMME本体同梱の「REFFERENCE.txt」を参照)。

 この変数を利用して、時間経過に従ってラインがスクロールするようにしてみましょう。

~
    // カメラ視点ビュー射影変換
    Out.Pos = mul( LastPos, ViewProjMatrix );
   
    // テクスチャ座標
    Tex.y += time;//追加
    Out.Tex = Tex;
   
    return Out;
}

 頂点シェーダからピクセルシェーダに渡すテクスチャのV座標に経過時間を加算しています。

 テクスチャ設定をWRAP(繰り返し)に設定しているのでこれだけでラインに光が流れるような表現になります。

画像では分かりませんが…
画像では分かりませんが…

ラインを複数表示する

 最後に、このラインを複数表示してみます。コード先頭に以下のコードを追加します。

//複製回数
int CloneNum = 8;
int index;

 引き続き、コード最下部、オブジェクト描画用テクニックを以下のように書き換えます。

// オブジェクト描画用テクニック
technique MainTec < string MMDPass = "object";
    string Script =
        "LoopByCount=CloneNum;"
        "LoopGetIndex=index;"
        "Pass=DrawObject;"
        "LoopEnd=;"
    ;
> {
    pass DrawObject
    {
        ZENABLE = TRUE;
        ZWRITEENABLE = FALSE;
        CULLMODE = NONE;
        ALPHABLENDENABLE = TRUE;
        SRCBLEND=SRCALPHA;
        DESTBLEND=ONE;
        VertexShader = compile vs_3_0 Line_VS();
        PixelShader  = compile ps_3_0 Line_PS();
    }
}

 "string Script~"以降で行っている処理もMME専用の構文となり、"DrawObject"パスを繰り返し実行する処理になっています(詳細はMME本体同梱の「REFFERENCE.txt」を参照)。

 以上の処理を追加することで、ラインが太くなったような見た目になります。

太く?なる
太く?なる

 複数のラインが重なっているため、このような見た目になってしまっているので、ラインをばらつかせてみましょう。

// 頂点シェーダ
VS_OUTPUT Line_VS(float4 Pos : POSITION, float2 Tex : TEXCOORD0)
{
    VS_OUTPUT Out = (VS_OUTPUT)0;
   
    //ターゲット用座標
    float3 TargetPos = TargetPos2;

    //---追加---//
    //インデックス番号を元に乱数テクスチャから色取得
    float4 RndCol_Start = (tex2Dlod(RndSampler,float4(index/RND_SIZE,0,0,0))-0.5)*2;
    float4 RndCol_End = (tex2Dlod(RndSampler,float4((index*2)/RND_SIZE,0,0,0))-0.5)*2;

    //エルミート曲線用始点ベクトル
    float3 StartVec = RndCol_Start.xyz * 50; //修正
    //エルミート曲線用終点ベクトル
    float3 EndVec = RndCol_End.xyz * 100; //修正

 ここで新たに登場した関数、tex2Dlodですが、これは頂点シェーダからテクスチャを参照するための関数、と捉えていただいて問題ありません。

 「index」変数に現在のループ数が格納されているので、それを利用して下のようなテクスチャから-1~1の数値(色)を取得しています。

乱数取得用テクスチャ
乱数取得用テクスチャ

 このコードを追加するとこのようになります。

複数出ます
複数出ます

 複製数を増やすことでさらに派手な見た目にすることもできますが、PCへの負荷もそのまま増えていくので程々の数値で止めておきましょう(このテクスチャでは128本まで設定が可能です)。

こんどこそ完成!
こんどこそ完成!

最後に

ビームマンP

 最終回、ずいぶんとお待たせして申し訳ありませんでした…

 第2、4、6回担当のビームマンPです。

 ともあれ、駆け足気味な所もありましたがいかがでしたでしょうか。

 昨今では、iOSやAndroid OSを搭載したモバイル端末の普及に伴い、モバイル端末でもシェーダが動作するのが当たり前になってきました。

 Unityなど、高機能なエディタも普及して来ましたが、それでもシェーダコードは手書きのケースが多々見られます。

 ぜひMMEを足がかりにして、他のプラットフォームでのシェーダ作成にも挑戦してみてください。

舞力介入P

 第1、3、5回を担当しました舞力介入Pです。

 エフェクトファイルのプログラミングに興味を持っていただこうと始めた本連載ですが、いかがでしたでしょうか。

 MMEユーザーの方がエフェクトファイルの改変や実装をしてみようと思い至っても、まず躓くのがHLSLについての参考資料の少なさだと聞きます。この連載が、そんな方々の最初のとっかかりになれたらと期待しています。

 全6回で内容をまとめなければならなかった関係で、説明が不足しているところも多々ありましたでしょうが、お役に立てたら幸いです。

 では、またの機会にお会いしましょう。

またどこかで!
またどこかで!

参考資料

  1. 3Dモデリングツールmetasequoia metaseq.net
  2. MSDNライブラリ 『HLSL のリファレンス
修正履歴

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
MikuMikuEffectで学ぶHLSL入門連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6517 2012/11/13 11:11

イベント

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

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

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

メールバックナンバー