2

私はディファード レンダラーを構築しています。シーンで大量のライトをサポートしたいので、タイル張りのディファード シェーディングを調べました。

問題は、OpenGL 3.3 ハードウェアをターゲットにする必要があり、GLSL 計算シェーダーをサポートしていないことです。

通常のシェーダーでタイル遅延シェーディングを実装する可能性はありますか?

4

1 に答える 1

2

タイル遅延レンダリングでは、コンピューティング シェーダーは厳密には必要ありません。必要なのは、タイルごとに、処理する一連のライトがあることです。計算シェーダーは、それを実現するための 1 つの方法にすぎません。

別の方法として、CPU で各フラスタムのライト リストを作成し、そのデータを GPU にアップロードして最終的に使用する方法があります。明らかに、CS バージョンよりもはるかに多くのメモリ作業が必要です。しかし、おそらくそれほど高価ではなくタイル サイズを簡単に変更して最適なものを見つけることができます。タイルが増えると、CPU の作業が増え、アップロードされるデータが増えますが、(一般的に言えば) タイルごとのライトが少なくなり、処理がより効率的になります。

GL 3.3 クラスのハードウェアでこれを行う 1 つの方法は、各タイルを個別のクワッドにすることです。クワッドには、頂点ごとのパラメーターの一部として、合計ライト リストのその部分の開始インデックスと、そのタイルが処理するライトの合計数が与えられます。グローバルにアクセス可能な配列があり、各タイルには、処理するこの配列の連続した領域があるという考えです。

この配列は、実際のライト自体である場合もあれば、ライトの 2 番目の (はるかに小さい) 配列へのインデックスである場合もあります。アクセスに追加の間接化を含める価値があるかどうかを判断するには、違いを測定する必要があります。

ライトとタイルの数によってはかなり大きくなる可能性があるため、プライマリ配列はおそらくバッファ テクスチャにする必要があります。間接的なルートを使用する場合、実際のライト データの配列は均一なブロックに収まる可能性があります。ただし、どちらの場合も、アップロード時にバッファ ストリーミング技術を採用する必要があります。

于 2016-07-16T14:21:37.047 に答える