梅雨


前回は流体シミュレーションを紹介してみましたが、
今回もデモを公開してみたいと思います

今日のお題は「大量点光源ライティング」です。
エフェクト関連を担当しているデザイナから以前に
「この火花に全部点光源がついたら派手にできそう」
という話を聞いたことがあったのがきっかけです。
一見、無理無理無理!

こういう時が実はプログラマーの腕の見せ所なのです。
普通の正攻法で点光源を計算するには、光源位置や影響範囲を
設定してピクセルシェーダー内でライティングします。
しかし欠点はレジスタ数に限りがあるということと内部で動的な
forループが発生するという問題があります。
ですので、ゲームではパフォーマンスの関係上、大抵は4個程度
多くても軽量な距離減衰の光源を8個〜16個くらいに抑えて
描画するのが常套手段とされてきました。
今回は一気に2048個の光源

置き過ぎ?かな?

GeForce8800などのハイエンド環境であれば2万個の光源でも60fps出ていました。

派手派手ぴかぴか



この粒子一個一個に光源が付いています。

アルゴリズム的には
影響範囲にだけレイトレースを実行するようにしています。
厳密には一次拡散反射(Diffuse)しか行なっていませんので
レイキャストというほうが自然でしょうか。
球体も滑らかにツルツル

今回もShaderModel3.0上でシェーダーを記述していますので
GeForce / Radeonなどの環境で実行してください。
一部3.0対応環境で動作しないご報告が来ていますので、
その場合はドライバを最新のものにしてご確認くださいネ

ダウンロードはこちら!
↓↓↓

────────────────────
この方式のメリットは影響範囲にのみライティングをすることができて、
何度も重ね掛けが可能(個数無制限)ということです。
もちろん個数に比例して負荷も高くなりますが、距離減衰を入れることで
負荷を軽減しています。影響範囲・距離が広くなると
負荷が高くなります。このあたりはパラメータ調整できるように
しておけば実用できそうですよね。
デメリットは頂点シェーダーよりもピクセルシェーダーの負荷が
高めになるということです。最近のUnifiedShader搭載の環境であれば
このバランシングがより適切に分散しますので
今後は使いやすくなるのではないかと思います。
リアルタイムレイトレースやGPGPUはこれからのトレンドに
なってくるかもしれない技法ですよね

デザイナーの感性を活かせるようにサポートできる土台を作成
するのもプログラマの大切な役目のひとつです。
皆が最大限の力を発揮できればきっと良い作品になっていくに
違いありません。ゲームプログラマーは一般的な情報処理や
設計能力のほかに感性を活かす職業です。
ただのプログラマではなくて、それをつかって何か面白いことを
してみたいと思う方!是非、共に作品を作っていきましょう

ヘキサドライブはいつでもご応募お待ちしています!
