HLSL WorkShop 3

~ Cutting Edge DX 9 - 第 18 回目 ~

Hiroyuki Kawanishi (川西 裕幸)
マイクロソフト株式会社
テクニカル エバンジェリスト

2004 年 6 月 21 日

今回は環境マッピング (goal3.fx) を説明します。ダウンロードファイルは、goal3.fx のコメントを日本語化したものです。前回は、頂点単位のアニメーションを行いましたが、今回はキューブマップを使った環境マッピングを紹介します。エフェクト内でテクスチャを取り扱うためにテクスチャとサンプラを作成し、シェーダ内でそのテクスチャを参照します。キューブ環境マップの参照に必要な反射ベクトルの計算も行います。

Dd188553.download(ja-jp,MSDN.10).gif この記事のソースコードをダウンロードする (WorkShop3.zip, 3.9 KB)

目次

  • ダウンロード ファイルの使い方
  • ゴール 3A : 環境マップ用テクスチャとサンプラの作成
  • ゴール 3B : キューブマップ テクスチャ参照
  • ゴール 3C : 反射ベクトルの計算
  • ゴール 3D : 反射割合の調整
  • まとめ
  • HLSL WorkShop フォルダと解答
  • Effect Edit の使い方

ダウンロード ファイルの使い方

ダウンロードしたファイルには、DirectX 9.0 Update (Summer 2003) チュートリアルにあるエフェクトファイルの日本語版が入っています (goal3.fx) 。

DirectX 9.0 SDK Update (Summer 2003) がインストールされていることを確認してください。ダウンロードした圧縮ファイルを展開して、任意のフォルダに保存します。[スタート] → [Microsoft DirectX 9.0 SDK Update (Summer 2003)] → [DirectX Utilities] → [Effect Edit] で Effect Edit を起動します。Effect Edit の [File] → [Open...] から保存した goal3.fx を開くと、次のように表示されるはずです。

Dd188553.WorkShop3_2(ja-jp,MSDN.10).jpg

注意: このエフェクト ファイルを実行するには DirectX 9.0 SDK Update (Summer 2003) が必要です。シェーダ バージョン 2.0 が動作するグラフィックス アクセラレータを装備したシステムを推奨します。[Warning: Technique not valid with current device settings] と赤字で表示されたら、F2 キーを押して、[Render Device] を [D3DDEVTYPE_REF] に変更し [OK] をクリックしてください、リファレンス ラスタライザを使って描画できるようになります (ただしパフォーマンスはかなり遅くなります)。

ゴール 3A : 環境マップ用テクスチャとサンプラの作成

シェーダ内でテクスチャ処理をするために、どのテクスチャをどうやってサンプリングするかを指定するために、texture 変数と sampler 変数 (キューブマップの場合は samplerCUBE 変数) を定義する必要があります。

texture 変数の定義は < と > にはさんだ、"type" (種類) と "name" (ファイル名) で指定します。今回はキューブマップの "lobbycube.dds" を使うので、次のように定義します。


texture EnvironmentMap 
<  
    string type = "CUBE";  
    string name = "lobbycube.dds";  
>;

サンプラは、sampler_state キーワードと中括弧を使って定義します。次のように、中括弧の中でテクスチャ自身とフィルタなどのテクスチャ ステートを指定します。今回はミップフィルタ・縮小フィルタ・拡大フィルタを線形 "LINEAR" とします。


samplerCUBE EnvironmentSampler = sampler_state
{  
    Texture = (EnvironmentMap); 
    MipFilter = LINEAR; 
    MinFilter = LINEAR; 
    MagFilter = LINEAR; 
}; 

ゴール 3B : キューブマップ テクスチャ参照

Dd188553.WorkShop3_3(ja-jp,MSDN.10).jpg

定義しただけでは、テクスチャは反映されません。次に行わなければならないのは、先に定義したサンプラとテクスチャ座標を使って、テクスチャの色を参照することです。テクスチャ参照は、その種類に応じて tex1D, tex2D, tex3D, texCUBE 関数を使います。今回はキューブテクスチャなので、次のように texCUBE 関数を使います。


return texCUBE(EnvironmentSampler, CubeTexcoord);

ゴール 3C : 反射ベクトルの計算

Dd188553.WorkShop3_4(ja-jp,MSDN.10).jpg

これで一見正しいように見えますが、反射ベクトルとして法線ベクトルを使っているため、正しい反射ではありません。次のように、ビューベクトル (視点から頂点へのベクトル "ViewToPos") と法線ベクトル "Normal" から、反射ベクトルを作成して戻り値にします。reflect 関数は反射ベクトルを生成する関数です。


return reflect(ViewToPos, Normal);

ゴール 3D : 反射割合の調整

Dd188553.WorkShop3_1(ja-jp,MSDN.10).jpg

これで、正しい反射を表示できましたが、光による陰影がなくなってしまいました。光の効果と反射を、ピクセル シェーダ内で次のように lerp 関数を使ってうまくブレンドしましょう。0.25 は補間係数ですので、これを大きくすれば反射がもっと強い画像となります。


OutColor = lerp(In.Diff, Environment, 0.25);

まとめ

今回は、頂点シェーダで反射ベクトルを計算し、その反射ベクトルを基にピクセル シェーダでテクスチャをサンプリングし、テクスチャの色とディフューズ色をブレンドしました。また、テクスチャ参照に必要な texture 変数と sampler 変数の定義方法も紹介しました。次回は、手続き型テクスチャの作成と 3D ボリュームテクスチャの参照方法を紹介します。

HLSL WorkShop フォルダと回答

DirectX 9.0 SDK Update (Summer 2003) には、200 3年の Game Developers Conference (GDC 2003) で行われた HLSL ワークショップで使用した教材が含まれています。Summer 2003 SDK ドキュメントにも載っていますが、(オリジナルの DirectX 9.0 には含まれていなかったため) 日本語ドキュメントには記載されていません。ファイルは、(SDKROOT)\samples\C++\Tutrials\HLSLWorkShop フォルダにあります。解答はその下の Solutions フォルダにあるので、行き詰ったら参考にしてください。

Effect Edit の使い方

EffectEdit は 4 つのペインで構成されています。左上が編集用ペイン、左下がエラー メッセージ表示用ペイン、右上が描画用ペイン、右下がオプション設定用ペインです。

編集用ペインでエフェクト ファイルの編集を行います、[File] → [Save] で保存できますが、保存しなくてもリアルタイムで編集結果が描画用ペインに反映されます。修正によってコンパイル エラーが発生すると、左下のペインにそのエラーを発生させた行番号とメッセージが表示され、右上のペインには [Error in effect file] と赤字で表示されます。

左下のペインではテクニックとパスが指定できます (複数のテクニックあるいはパスがあるとき)。左のラジオボタンでは単独のパスを使うか、指定したパスまで使うか、全てのパスを使うかを指定できます。中央のラジオボタンでは、ワイヤーフレーム表示、テクスチャなし表示、テクスチャ付き表示が指定できます。右のラジオボタンでは、連続的にレンダリングするか、ボタンを押したときだけレンダリングするかを指定できます。いろいろいじって試してみてください。

この記事についての感想・意見などのフィードバックは、directxj@microsot.com にお送りください。