私は、物理ベースの遅延レンダラーに必要なすべての情報を、わいせつなものを使用せずにG-Bufferにパックする方法を検討中です。レンダーターゲットの量。
これまでのところ、4つの3つの部分からなるベクトルがあります。
- アルベド/拡散
- 通常
- 接線
- 位置
および4つの単一コンポーネント
- メタリック
- 粗さ
- 高さ
- アンビエントオクルージョン
単純なアプローチは、単一のコンポーネントの1つを3つの部分からなるベクトルの1つを使用してアルファ(4番目)チャネルにバンドルすることです。これが私の現在の調査ラインです。ただし、4つの4チャネルの全精度フローティングポイントレンダーターゲットが「小さくない」ことを考えると、メモリをより意識するために、半分の精度とさらに小さい表現を使用するのが一般的です。
私が求めているのは、品質を損なうことなく安全に精度を下げることができるコンポーネントとその量です。
回答
まず第一に、Gバッファ内の位置はまったく必要ありません。ピクセルの位置は、カメラの設定とピクセルの画面スペースのxy位置がわかっているので、深度バッファーから再構築できます。これにより、ピクセルの位置を取り除くことができます。そのバッファ全体。
また、通常、Gバッファにも接線ベクトルは必要ありません。これらは、「接線空間からの法線マップの変換と視差マッピングにのみ必要です。これらは、レンダリングするメッシュからの接線がある場合)Gバッファーの塗りつぶしパス中に実行され、Gバッファーのみが実行されます。法線をワールドまたはビュースペースに保存します。
色、粗さ、メタリックなどのマテリアルプロパティは、8ビットテクスチャから供給されるため、通常はGバッファの8ビット値にすぎません。 AO。
Gバッファに依存する何らかのマルチパスブレンディングを行う場合を除いて、Gバッファの高さも必要ありませんが、必要な場合は8ビットが必要です。
法線は、8ビットではなく16ビット値として保存することでメリットが得られます。半精度は問題ありませんが、16ビットの固定小数点は、すべての方向でより均一な精度が得られるため、さらに優れています(半精度は軸の近くでより正確になり、軸から離れるとある程度の精度が失われます)。さらに、八面体マッピングを使用して3つのコンポーネントから2つにカットできます。
つまり、1日の終わりに、最小限のGバッファは次のようになります。
- マテリアルの色+メタリック:RGBA8
- 八面体の世界空間の法線+粗さ+ AO:RGBA16
これですべてです!ピクセルあたりわずか12バイトです。
または、法線にRG16バッファーを使用し、粗さ+ AOを別の8ビットバッファーに移動することもできます。最終的に8ビットまたは16ビットサイズのGバッファコンポーネントがさらに必要になった場合に備えて、ある程度の余地があります。
コメント
- また、金属性多くの場合、はバイナリ値であり、粗さ勾配を使用しないと仮定すると(精度の低下の影響を確認するため)、単一の8ビットチャネル(金属性の場合は1ビット、粗さの場合は7)に金属性と粗さを格納できます。