![]() |
||
![]() |
8/24 VS/PSを使ってみる さて、前回まででDelphiでのPS/VSプログラミングの方法については分かりました。 ここからが、ここからが問題なのだよ。 Hello, Worldだけ出すんだったら幼稚園児にも出来るわけでして、ここからどう発展させていくかがキモ。 そんなわけで、今回はVS/PSで色々楽しいことをやっていきましょうか。今回はちゃんとサンプルもこしらえておきました。添付のソースはそのままだとビルド出来ないんですが(^^;) 僕の手元でDirectXヘッダの定義されてないマクロを追加で定義し、DGCarad側でVS/PSの自動復元をするためのコードを追加したもので。とりあえず後日ULしますのでお待ちください。
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も書き換わっていくヨカン…
|
|
![]() |