HEXA BLOG

研究・開発

HEXA BLOGその他研究・開発2008.6.20

点光源を別の方法で描画

こんにちは!イワサキです。
梅雨雨の真っ只中という感じがしますね。沖縄ではもう梅雨が明けた晴れとか。
前回は流体シミュレーションを紹介してみましたが、
今回もデモを公開してみたいと思いますexclamation×2
今日のお題は「大量点光源ライティング」です。
エフェクト関連を担当しているデザイナから以前に
「この火花に全部点光源がついたら派手にできそう」
という話を聞いたことがあったのがきっかけです。
一見、無理無理無理!がく〜(落胆した顔)と首を横に振りそうな要望ですが、
こういう時が実はプログラマーの腕の見せ所なのです。
普通の正攻法で点光源を計算するには、光源位置や影響範囲を
設定してピクセルシェーダー内でライティングします。
しかし欠点はレジスタ数に限りがあるということと内部で動的な
forループが発生するという問題があります。
ですので、ゲームではパフォーマンスの関係上、大抵は4個程度
多くても軽量な距離減衰の光源を8個~16個くらいに抑えて
描画するのが常套手段とされてきました。
今回は一気に2048個の光源ひらめきを置いてみました。
置き過ぎ?かな?あせあせ(飛び散る汗)
GeForce8800などのハイエンド環境であれば2万個の光源でも60fps出ていました。
20080620_01.jpg
派手派手ぴかぴかぴかぴか(新しい)ぴかぴか(新しい)ぴかぴか(新しい)になっています。
この粒子一個一個に光源が付いています。
20080620_02.jpg
アルゴリズム的には
影響範囲にだけレイトレースを実行するようにしています。
厳密には一次拡散反射(Diffuse)しか行なっていませんので
レイキャストというほうが自然でしょうか。
球体も滑らかにツルツルぴかぴか(新しい)しているのはそのためです。
今回もShaderModel3.0上でシェーダーを記述していますので
GeForce / Radeonなどの環境で実行してください。
一部3.0対応環境で動作しないご報告が来ていますので、
その場合はドライバを最新のものにしてご確認くださいネ目
ダウンロードはこちら!
↓↓↓

20080620_03.jpg
【実行ファイル】
HexaPointLight.zip (1.67MB)
────────────────────

この方式のメリットは影響範囲にのみライティングをすることができて、
何度も重ね掛けが可能(個数無制限)ということです。
もちろん個数に比例して負荷も高くなりますが、距離減衰を入れることで
負荷を軽減しています。影響範囲・距離が広くなると
負荷が高くなります。このあたりはパラメータ調整できるように
しておけば実用できそうですよね。
デメリットは頂点シェーダーよりもピクセルシェーダーの負荷が
高めになるということです。最近のUnifiedShader搭載の環境であれば
このバランシングがより適切に分散しますので
今後は使いやすくなるのではないかと思います。
リアルタイムレイトレースやGPGPUはこれからのトレンドに
なってくるかもしれない技法ですよねひらめき
デザイナーの感性を活かせるようにサポートできる土台を作成
するのもプログラマの大切な役目のひとつです。
皆が最大限の力を発揮できればきっと良い作品になっていくに
違いありません。ゲームプログラマーは一般的な情報処理や
設計能力のほかに感性を活かす職業です。
ただのプログラマではなくて、それをつかって何か面白いことを
してみたいと思う方!是非、共に作品を作っていきましょうexclamation
ヘキサドライブはいつでもご応募お待ちしています!手(パー)

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE