計算シェーダー (DirectX 11) を使用してタイル内のライトをカリングするディファード シェーディング システムを実装しているため、安定したフレームレートで何千ものライトを取得できます。ライトがシーンによってブロックされているかどうかを判断する必要があるときに問題が発生します。ポイント ライトが壁と橋を通過することを意味します。メイン ライト (太陽) の視点にシャドウ マップがありますが、シーン上の各ポイント ライトのシャドウ マップを生成するには、1000 のキューブマップを生成する必要があり、それはDead Space 3 や Battlefield 3 などのゲームでは、シーンに多くのライトがありますが、固体オブジェクトを通り抜けることはありません。
1 に答える
単純な解決策の 1 つは、スクリーンスペース アンビエント オクルージョン アプローチを使用することです。そこで、近傍のサンプリングに基づいてオクルージョンを推定しようとします。私が知っているアプローチの 1 つはSSDOで、これは画面空間での影の作成を直接ターゲットにしています。おそらく、複雑なシーンでは多くのアーティファクトが発生することになります。SSDOの利点は、いくつかのグローバル イルミネーション効果も追加されることです。
ほとんどのゲーム/エンジンは、前処理ステップによってこのような問題を克服しようとしていると思います。
Static Lightening: 光源が動き回らない場合 (建物のライトなど)、ライトマップまたはライトを含む追加の頂点属性を計算します。
ライトを微調整する: にじみが目立たなくなるまで、減衰距離、強度、または位置を調整します。
独自のアイデア: ライトの表現 (球/ディスク?) に応じて、ライトの刈り込まれた形状を計算できます。壁の背後にあるピクセルは、新しいライト ボリューム内に存在せず、このように明るくなりません。ライト ボリュームを任意に形成できない場合は、ライトを定義する壁ごとに 1 つまたは 2 つの平面を追加できます。これらのプレーンは、ほとんどのライトで定義されていない可能性があり、壁の近くのライトの GPU にのみプッシュされます。各ライトのライトニング プロセス中にピクセルがどちらの側にあるかを確認できます。