Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
[go: Go Back, main page]

Beautiful Nature!
5/17 大地のめぐみと空気遠近法





フォグ?それともスペキュラー?


 プログレッシブ・ランドスケープのプログラムを作ってからしばらくたちました。その間、ほんの少しだけの実験的な試み(フィードバックによる残像効果など)を少ししただけで、このプログラム自体はプロトタイプとしてほおってありました。

 3D野郎大会にいらした方にはおわかりの通り、最新のプログレッシブ・ランドスケープ・プログラムはリアルな表現の雲と、暫定的ながら湖面の表現、そして樹木が追加されましたが、そのぶん静止画的なリアリティは向上したものの、節々で不自然に見えてしまうことがありました。

 最たるものは森の表現で、LODを実現するために極めて簡易な方法で描画したため、森へ近づくと突然木がボコボコと現れるという大変みっともない実装になってしまっていました。

 あまりにもみっともないので、これだけはなんとかしたいと、実際の森を見に行ったりしていろいろと研究してみたのですが、有効な回避策は見当たりませんでした。

 これはやはり正攻法で行くしかないと思ったのですが、それならばいつでもできるわいとタカをくくって、もうひとつ、平行して進めている3Dシステムの開発に注力していました。

 ところで昨今の海外ゲームの画質や技術は極めてレベルが高くなってきています。ちょっと見回しただけでも、日本のパソコンゲームと比べると、ベーマガのゲームとコンシューママシンのゲームくらいのレベル差があります。

 この絶対的な実力の差は、ひとえに各ゲーム会社の開発力のなさに起因しています。

 さらに、パソコンゲームは日本では儲からないので、それほど金と人をかけられないお家事情もあります。

 僕が派遣会社を辞めて独立しようと思ったのはそんな現状に気づいたからなのですが、そのためにはまずこの落差を埋めるほどのものを作っていかなくてはなりません。

 それには、とりあえず敵情を知らなければ話にならないので、あるとき、片っ端から海外の3Dゲームまたは3Dデモを試していました。

 そのとき、Twilight3Dで遠くの山が青く霞んでいるスクリーンショットを見つけました。

 AGPを使った暴力的な(笑)までに奇麗なテクスチャで作られたそれは素晴らしいリアリティを醸し出していました。

 それを見て、ProjectKのフィードバックページで、ITLのtakamiが「山は青く霞むんだぞ」と言っていたことを思い出したのです。

 たしかに、プログレッシブ・ランドスケープは地平線を白くして、山は白く霞むようになっています。このような効果をFOGといい、僕もいろいろと青くできないか試してみたのですが、できなかったのでFOG効果を使うことを諦め、苦肉の策でスペキュラーを一様に強くすることで白く霞ませるようにしたのです。

 というのも、Direct3D IMモードでTLVERTEXを使ったFOGの使い方に関するサンプルが一切なかったのです。

 マニュアルを読みながら殆ど完璧に値を設定したにも関わらず、無情なるDirect3Dはまったくフォグをかけてはくれません。

 しばらく忘れていたのですが、現実にやっている人がいるんだから、やっぱりできないわけはない、と思い、色付きのフォグ(つまりは本当のFOG機能を使ったフォグ)を出せないか、試行錯誤をはじめたわけです。

 




空気遠近法


 結局のところ、できるようになりました。これはもう試行錯誤の賜物で、なんでこういうサンプルが世界のどこにも存在しないのだろうと首をひねることしきりでした。

 解ってみれば実に簡単なことで、結局 レンダリング・ステートのFOGTABLEMODEの部分、普通に考えれば誰だってLINEARモードやEXP2モードを選択しないとFOGTABLEが有効にならないと思いますよね?

 で、実際にはどうだったかというと、正解はFOG_NONEでした。FOGTABLEMODEでFOG_NONEを選択し、FOGENABLEはもちろんTRUE、そしてTLVERTEXのspacularメンバのα要素にフォグ係数を設定することで、きちんとした手動FOGがかけられるというわけです。

 というわけで一件落着。これによって森ももうすこし自然にみえるようになりました。
 DirectX6では、さらに range fogという機能も加わります。これは従来のフォグのように単純なz値でフォグ係数を決めるのではなく、視点からの距離で決定するものです(なぜこんな機能が必要なのかというと、z値でフォグ係数を決めた場合、回転すればおかしなことになるからです)。


 このプログラムのソースと実行形式は以下のリンクでダウンロードできます。ダウンロードした方は動作報告と、できればスクリーンキャプチャをお送りください。現在のところVoodoo2とRiva128で動作確認しています(ただし、Riva128は木の縁が妙になります)。

 atom0517.zip