エクスポート (0) 印刷
すべて展開
展開 最小化

HLSL WorkShop 1

~ Cutting Edge DX 9 - 第 16 回目 ~

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

2004 年 4 月 26 日

前回まで HLSL を描画する C# アプリケーションの実装方法を紹介しました。今回からは、HLSL 自身の実装方法を紹介していきます。DirectX 9.0 SDK Update (Summer 2003) には、2003年の Game Developers Conference (GDC 2003) で行われた HLSL ワークショップで使用した教材が含まれています。Summer 2003 SDK ドキュメントにも載っていますが、(オリジナルの DirectX 9.0 には含まれていなかったため) 日本語ドキュメントには記載されていません。ファイルは、(SDKROOT)\samples\C++\Tutrials\HLSLWorkShow フォルダにあります。goal1.fx から goal4.fx まで 4 段階のチュートリアルになっており、それぞれのファイルにコメントされている課題を解いていきます。解答は Solutions フォルダにあるので、行き詰ったら参考にしてください。今回は goal1.fx を説明します。ダウンロードファイルは、goal1.fx のコメントを日本語化したものです。

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

目次


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

ダウンロードしたファイルには、DirectX 9.0 Update (Summer 2003) チュートリアルにあるエフェクトファイルの日本語版が入っています (goal1.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...] から保存した goal1.fx を開くと、次のように表示されるはずです。

Dd188551.WorkShop1(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] をクリックしてください、リファレンス ラスタライザを使って描画できるようになります (ただしパフォーマンスはかなり遅くなります)。


Effect Edit の使い方

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

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

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


半球ライティング

半球ライティングは、イメージ ベース ライティング テクニックの 1 つで、グローバルな 2 種類の光 (例えば、空と地面) のジオメトリへの影響を半球を使って反映させる手法です。

Dd188551.WorkShop1_1(ja-jp,MSDN.10).jpg


ゴール1A 各頂点に格納されている遮蔽項を使う

Dd188551.WorkShop1_A(ja-jp,MSDN.10).jpg

遮蔽項とは、このモデルの各頂点に格納されているデータで、その頂点が外部の光が他の部分によってどの程度遮られるかを示しています。0 がまったく遮られていない状態で、1 が完全に遮られている状態です。元の goal1.fx では遮蔽項を使っていないので、表示される骸骨はアンビエント色で塗りつぶされた状態です。遮蔽因子の 1 を 1 - Occ にすることで、遮蔽項を有効にでき、目の奥など光のあたらない部分が分かるようになります。



float4 Hemi = MaterialAmbientIntensity;
// ゴール 1A; 各頂点に格納された遮蔽項を使って、半球項をモジュレートする
//
//  遮蔽項とは何か:
//    遮蔽項は、モデルで事前に計算された重みであり、半球の何パーセントが
//    モデルの別部分によってブロックされるかを表します。その項の値が 0 のとき、
//    他のジオメトリがその頂点をまったく遮蔽しないことを意味します (全ての光を受け取る)。
//    一方、その項の値が 1 のとき、その頂点は光が完全にブロックされている
//    ことを意味します。
//      
//  アドバイス:
//    (1 - Occ) を乗算すると、この頂点が半球ライトの影響をどの程度受けるか
//    に応じて、半球光は暗くなります。
Hemi *= 1; // 遮蔽因子


ゴール 1B 半球ライトの値を計算する

Dd188551.WorkShop1_B(ja-jp,MSDN.10).jpg

まだ、光の方向を考慮した計算を行っていないので、骸骨を回転させても、光の方向 (上部にある矢印オブジェクト) を変えても、骸骨の陰影は変化しません。半球ライティングでは、空の方向と法線の向きを基に、空の色と地面の色を線形補間します。基の gola1.fx では、0.5 と一定になっていますので、これを空の方向と法線との内積に変更します。これで光の効果によって、陰影が表現できるようになります。



// ゴール 1B: 半球ライトの値を求める
//
//   半球ライトとは何か:
//      「半球」ライトは、2 つの色 (空と地面) から成るアンビエント項であり、
//      法線を基にその間を補間します。つまり、「空」の方を指す法線を持つ領域は
//      「空」の色になり、「地面」の方を指す領域はより「地面」の色になります。
//   アドバイス:
//     半球ライトを実装する簡単な方法は、法線と空の方向との間の角度を基に、
//     空の色と地面の色を線形補間することです。その角度は
//     法線 (Normal) と空の方向 (DirToSky) との内積から簡単に計算できます。
//     この結果は -1 から 1 の範囲ですが、0 から 1 の範囲に
//     再マッピングすると、2つの色の線形補間として完全になります。
float LerpFactor = 0.5; // ここで線形補間の因子を求める


ゴール 1C 空の色と地面の色を変更する

Dd188551.WorkShop1_C(ja-jp,MSDN.10).jpg

最後の課題は、空の色と地面の色を変更して、結果を確認することです。ゴール 1C と書いてある部分ではなく、ファイルの先頭に近い部分で GrounfColor と SkyColor が定義してあるので、その数値を変更して結果を見てください。



float4 GroundColor              = { 0.1f, 0.0f, 0.0f, 1.0f };    // 地面
float4 SkyColor                 = { 0.9f, 0.9f, 1.0f, 1.0f };    // 空


まとめ

EffectEdit の Technique を変更すると、半球ライティング以外のアンビエント、スペキュラ、ディフューズを組み合わせたライティングを確認できます。操作して、それぞれ確認してみてください。そのライトの色も変更できますので、半球ライティングと比較してみてください。次回は、頂点シェーダを使ったジオメトリ変形アニメーションのチュートリアルを説明します。

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


表示:
© 2014 Microsoft