SHOEISHA iD

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

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

MikuMikuEffectで学ぶHLSL入門

3DCGツール「MikuMikuDance」のエフェクトを拡張する「MikuMikuEffect」
ポストエフェクトの作成方法

MikuMikuEffectで学ぶHLSL入門(5)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード sample.zip (10.5 KB)

実装方法

 ポストエフェクトに必要なものはすでにBasicPostEffect.fxに実装してあるので、これを元に簡単に解説します。

ポストエフェクトとしての宣言

 ポストエフェクトを作成する際には、必ず以下の記述が必要です。

ポストエフェクト宣言
float Script : STANDARDSGLOBAL <
    string ScriptOutput = "color";
    string ScriptClass = "scene";
    string ScriptOrder = "postprocess";
> = 0.8;

 これは、このエフェクトファイルがポストエフェクトであることを宣言するもので、これがないと後述するScriptExternalコマンドなども使用できません。基本的に、パラメータは変更せず、このまま記述して使用します。

描画結果を受け取るためのテクスチャを作成

 ポストエフェクトの処理のためには、描画の出力先(レンダーターゲット)となる、特殊なテクスチャを用意する必要があります。

 これには、以下のように記述します。

レンダーターゲットテクスチャ作成
// レンダーターゲットテクスチャ
texture ScnMap : RENDERCOLORTARGET <
    float2 ViewPortRatio = {1.0,1.0};
>;

// 深度バッファ
texture DepthBuffer : RENDERDEPTHSTENCILTARGET <
    float2 ViewPortRatio = {1.0,1.0};
>;

 "RENDERCOLORTARGET"が指定されたtextureパラメータは、描画結果の色情報を記録できるテクスチャとなります。また、"RENDERDEPTHSTENCILTARGET"が指定されたtextureパラメータは、深度バッファ(Zバッファ)となります。

 レンダーターゲットを変更する際には、必ずこの2種類のtextureパラメータがそれぞれ必要となります。

 上記のとおりに設定すると、それぞれのテクスチャは、スクリーンと同じサイズで生成されます。これらのパラメータの詳細については、MME同梱のREFERENCE.txtを参照ください。

 また、テクスチャに出力された描画結果をシェーダから参照するために、「サンプラ」と呼ばれるものを作成します。これをtex2D()関数の第1引数に指定することで、シェーダ内でこのテクスチャに記録された色情報が取得できます。

サンプラ作成
//テクスチャを読み取るためのサンプラ
sampler ScnSamp = sampler_state {
    texture = <ScnMap>;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    MipFilter = NONE;
};

テクニックのスクリプトでレンダーターゲットを変更

 レンダーターゲットの変更処理は、テクニックに「スクリプト」と呼ばれる特殊なコマンド列を記述することで行います。下記の、"string Script = "で始まる一連の文字列がそれにあたります。

テクニックのスクリプト
technique PostEffect <
  string Script = 
        "RenderColorTarget0=ScnMap;"
        "RenderDepthStencilTarget=DepthBuffer;"
        "ClearSetColor=ClearColor;"
        "ClearSetDepth=ClearDepth;"
        "Clear=Color;"
        "Clear=Depth;"
        "ScriptExternal=Color;"
        "RenderColorTarget0=;"
        "RenderDepthStencilTarget=;"
        "Pass=DrawBuffer;"
    ;
> {
    pass DrawBuffer ... {
       ...
    }
}

 これら一行一行がコマンドになっていて、それぞれ以下の処理を行います。

  1. レンダーターゲットを用意したテクスチャで変更
        "RenderColorTarget0=ScnMap;"
        "RenderDepthStencilTarget=DepthBuffer;"
  2. レンダーターゲットを指定した背景色でクリア
        "ClearSetColor=ClearColor;"
        "ClearSetDepth=ClearDepth;"
        "Clear=Color;"
        "Clear=Depth;"
  3. 他のオブジェクトを現在のレンダーターゲットに対して描画
        "ScriptExternal=Color;"
  4. レンダーターゲットをスクリーンに戻す
        "RenderColorTarget0=;"
        "RenderDepthStencilTarget=;"
  5. パス"DrawBuffer"を実行
        "Pass=DrawBuffer;"

 これについても、詳しくはMME同梱のREFERENCE.txtを参照ください。

次のページ

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
MikuMikuEffectで学ぶHLSL入門連載記事一覧

もっと読む

この記事の著者

舞力介入P(ブリョクカイニュウピー)

ニコニコ動画でMMD関連のツール開発者として活動中。代表作は「MikuMikuEffect」。我流のAPI Hookを常套手段とする、邪道プログラマです。ニコニコ動画マイリスト

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6298 2011/12/09 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング