MENU閉じる

LAB

デモプログラム

研究室デモプログラム2013.10.29

【大量点光源ライティング】 -Massive point light-

普通の正攻法で点光源を計算するには、光源位置や影響範囲を設定してピクセルシェーダー内でライティングします。
しかし欠点はレジスタ数に限りがあるということと内部で動的なforループが発生するという問題があります。
ですので、ゲームではパフォーマンスの関係上、大抵は4個程度多くても軽量な距離減衰の光源を8個〜16個くらいに抑えて描画するのが常套手段とされてきました。
今回は2048個の光源を置いています。
GeForce8800などのハイエンド環境であれば2万個の光源でも60fps出ていました。
20080620_01-1
この粒子一個一個に光源が付いています。
20080620_02

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

 

ShaderModel3.0上でシェーダーを記述していますのでGeForce / Radeonなどの環境で実行してください。
一部3.0対応環境で動作しないご報告が来ていますので、その場合はドライバを最新のものにしてご確認ください。
20080620_03
【実行ファイル】
HexaPointLight.zip (1.67MB)
この方式のメリットは影響範囲にのみライティングをすることができて、何度も重ね掛けが可能(個数無制限)ということです。
もちろん個数に比例して負荷も高くなりますが、距離減衰を入れることで負荷を軽減しています。影響範囲・距離が広くなると負荷が高くなります。このあたりはパラメータ調整できるようにしておけば実用できそうですよね。
デメリットは頂点シェーダーよりもピクセルシェーダーの負荷が高めになるということです。最近のUnifiedShader搭載の環境であればこのバランシングがより適切に分散しますので今後は使いやすくなるのではないかと思います。

RECRUIT

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

RECRUIT SITE