[かみやんのたわごとへ戻る]


counter

水面のシミュレーション2

KWater2.jpg (7474 バイト)  先日のたわごとで、公開した水のシミュレーションだが全反射のため水銀ぽいという問題があったので、早速、屈折処理を入れてみた。最初、屈折も反射同様に環境球をつかって実装してみたが、反射と屈折の見分けがつかなかったので改めて、きちんと水底のテクスチャを使うように変更した。それと共に水槽も作った。屈折ベクトルの求め方は以下。

視線ベクトルの逆向きベクトル:V
法線ベクトル:N
屈折ベクトル:Vr
屈折率:η

Vr = (1-η) (V・N)N+V

 Vが視線ベクトルの逆向きベクトルになっているのは、先日もとめた反射ベクトルと同じパラメータを使うように調整したため。ちなみに、サンプルでは屈折率は0.6にしてある。

 テクスチャは、反射テクスチャ(空のテクスチャ)と屈折テクスチャをシングルパスマルチプルテクスチャで合成している。ちなみに、1段目で反射テクスチャを不透明でディフューズと乗算(MODULATE)してかいて、2段目で屈折テクスチャをアルファブレンディング(D3DTOP_BLENDFACTORALPHA)で0.7の不透明度で(つまり、反射が30%、屈折が70%で)描画している。全体としては、それにスペキュラがはいっている(反射テクスチャがあるのであまりスペキュラの効果はなかった)。

 その他、環境球のシーム(継ぎ目)が表示されるバグがあったが環境球を90度回転させ、シームを下側にもって行くことで解決した。反射ベクトルが下側へ向くことはあまりないので、これでいいだろう(低い角度から見て大きな波をたてるとある特定の向きに現れるがバレないだろう)。

 その他、メニューにOptionsをつけて、各描画の負荷を見れるようにした。

 その他、物理計算部分の高速化を行った。特に法線ベクトルを求めるルーチンを大幅に高速化した。法線ベクトルの誤差は人間の目には大して分からないので、周りの頂点の情報をはしょりながら計算し、単位ベクトル化も極力減らした。物理計算部分は全然負荷がかかっていないと思って間違えがない。

 その他、物理計算を1/30秒単位固定で行い、描画はマシンパワーに依存して描画するように変更した(前回のバージョンは、物理計算と描画は1:1の割合で行っていた。また、描画に1/30秒以上かかるマシンではスロー再生をしていた)。ただし、今回のバージョンでも描画に1秒以上かかるマシンではコマ飛ばしせずにスロー再生になる。

問題点

 先日よりは、大分水らしくなったが、まだ不自然なところがある。もっとも目立つのが屈折の描画で側壁が表示されていないことだ。それがないため水槽の深さが全く分からない。今回の水槽は側壁も底面も同じテクスチャなので、ちゃんと屈折ベクトルと5平面との交点を求めれば済むかと思ったが、側壁にはディフューズのせいで面によって明るさが違う。そのため、単純に1枚のテクスチャのテクスチャ座標を求めるだけでは解決できないことに気づいた。頂点カラーを用いて適当にごまかすか、2段レンダリング(一端テクスチャバッファへレンダリングし、それをテクスチャとしてもう一度レンダリングする)をするかのどちらかだろう。後者の方法なら、水中に魚を泳がせてその魚影が揺らぐというのも可能かもしれない。

 例によって、ソースが欲しい方はkamiyan2@gmail.comまで。

download.jpg (3993 バイト)

CEDEC・東京ゲームショウ

 CEDECと東京ゲームショウに行ってきました。が、レポートは、また後日。


[かみやんのたわごとへ戻る]