過去の独りごち/独りごとはこちら
過去のJavaアプレットは
こちら

 

8/24 VS/PSを使ってみる

 さて、前回まででDelphiでのPS/VSプログラミングの方法については分かりました。

 ここからが、ここからが問題なのだよ。

 Hello, Worldだけ出すんだったら幼稚園児にも出来るわけでして、ここからどう発展させていくかがキモ。

 そんなわけで、今回はVS/PSで色々楽しいことをやっていきましょうか。今回はちゃんとサンプルもこしらえておきました。添付のソースはそのままだとビルド出来ないんですが(^^;) 僕の手元でDirectXヘッダの定義されてないマクロを追加で定義し、DGCarad側でVS/PSの自動復元をするためのコードを追加したもので。とりあえず後日ULしますのでお待ちください。


shader.zip

(ソース+バイナリ 439KB)

 

まずは、環境マップ。ほぼお約束?しかもキューブとかじゃなくて単なる球面環境マップです。やり方自体はここで説明するまでもないと思うんですが、VSでは

oT0…地のテクスチャ座標:頂点データに入ってるのそのまんま

oT1…環境マップ用、カメラ空間での頂点データの法線のX,Y座標から生成

 それぞれを生成させ、PSでは

mad r0,  v0, t0, t1

 の一行でディフューズ色と環境マップの色を加算したものを計算しています。固定機能シェーダでも充分できる範囲です。サンプル内ではenvmap.vsh, envmap.pshとして収録されています。

 実際のところ、このエフェクトは固定機能シェーダしか使えなかった頃でも充分可能だったわけですが、レンダリングステートの設定がゴチャゴチャして面倒だった気がします。むしろこうやってVS/PS書いたほうがラクチンでした。

 ちなみに、モデルのモチーフについては…特に言及しないでおきます(^^;)

 六角大王なりメタセコイアなり、ともかく自分でモデリングの多少は出来たほうがいいかなと思い、練習してみました。使用ツールはメタセコイアという事に落ち着いたのですが、なかなか面白いですね〜。

 

 お次は、メンブレンエフェクト。膜ですな。

 VSに、モデル空間に変換した視点の位置ベクトルを渡しておき、頂点から視点へのベクトルを正規化したものと、頂点の法線ベクトルとの内積を計算して、透明度にします。すると、視線に垂直な面は透明に、平行に近い面は不透明になるわけですね。

 PSでは普通にテクスチャ張ってるだけです。わざわざ自前のシェーダ書く必要も無いんですが。

 背景と加算合成で表示するとキレイかもしれません。ちなみに、PSでは背景とこれから書く内容の合成については何も出来ないので、レンダリングステートだけで設定する必要があります。以前は僕もPSでそういう設定も出来るものと思っていたんですけど、ちょっと残念ですね。今後に期待、かな?

 

 最後に、ちょっとだけ凝ってみました。というより、上の二つだけではいくら急作りでもショボいだろ、という突込みが容赦なく入りそうだったのでー。

 Cook-Torranceモデルに基づいて鏡面反射率を求め、それをもとに環境マップを施しています。つまり、Cook-Torranceモデルで計算して出来たハイライトの部分が、単なるスペキュラ色の代わりに、環境マップをルックアップした結果に置き換わっている、と。

 VSには視線ベクトル(V)、光源ベクトル(L)をモデルの座標系に変換したものを渡し、それらと頂点の法線ベクトル(N)から、Cook-Torranceシェーディングに必要なテーブル(V,N,Lから導出される鏡面反射率)を参照するための情報を、テクスチャ座標の形でPSに渡します。

 PSではテーブルをルックアップして、鏡面反射率がどれだけになるか決定します。鏡面反射100%の部分には環境マップの色が100%加算され、しなかった成分は、ディフューズ色だけ現れます。鏡面反射率が50%なら、環境マップの色のうち50%加算されるわけです。

 全身テカテカになる普通の環境マップに比べて、そつの無い反射が表現出来ます。左のスナップショットだとまだまだ派手っぽいですが、反射してる事が分かりやすい程度にしています。環境マップの濃度=Phongのモデルで算出された鏡面反射率にすると、また違った感じになるかもしれませんね。

 以上…やっぱりショボいかも。

 次回はマルチパスレンダリングをやってみようと思います。グレアとか影の処理ですね。SXLibも書き換わっていくヨカン…

 

Taku Hayase(SANDMAN)

戻る