4

iOS デバイスは、PowerVR グラフィックス アーキテクチャを使用します。PowerVR アーキテクチャは、タイル ベースの遅延レンダリングモデルです。このモデルの主な利点は、深度バッファーを使用しないことです。

ただし、iOS デバイスの深度バッファにはアクセスできます。具体的には、オフスクリーン フレーム バッファー オブジェクトを使用して、深度バッファーをカラー テクスチャに変換し、レンダリングすることができます。

PowerVR アーキテクチャが深度バッファーを使用しない場合、どのようにして深度バッファーをレンダリングできますか?

4

3 に答える 3

2

タイルベースのレンダラーが動作するために従来の深度バッファーを必要としないのは事実です。

TBR は画面をタイルに分割し、高速なオンチップ メモリを使用してこのタイルのコンテンツを完全にレンダリングし、一時的な色と深度を保存します。次に、タイルが終了すると、最終的な値が実際のフレーム バッファーに移動されます。ただし、深度バッファ内の深度値は伝統的に一時的なものであり、隠面アルゴリズムとして使用されるだけです。この場合の深度値は、タイルのレンダリング後に完全に破棄できます。

つまり、実質的にタイルベースのレンダラーは、低速のビデオ メモリに全画面深度バッファを実際に必要とせず、帯域幅とメモリの両方を節約できます。

Metal API はこの機能を簡単に公開し、深度バッファの storeAction を「don't care」値に設定できるようにします。つまり、結果の深度値をメイン メモリにバックアップしません。

この場合の例外は、レンダリング後に深度バッファーの内容が必要になる場合があることです (つまり、遅延レンダラーの場合、または深度値で動作するアルゴリズムのソースとして)。その場合、ハードウェアは、ユーザーが使用できるように深度値がフレーム バッファに格納されていることを確認する必要があります。

于 2016-10-12T08:26:25.053 に答える
2

タイルベースの遅延レンダリングは、名前が明確に示すように、タイルごとに機能します。画面の各部分が内部キャッシュにロードされ、処理されて再度書き出されます。ハードウェアは、現在のタイルと現在の深さの値に重なっている三角形のリストを取得し、それらから新しい色と深さのセットを考え出し、それらをすべて再度書き出します。したがって、完全に馬鹿げた GPU は、三角形ごとに関連するすべての深度バッファー値に対して 1 回の読み取りと 1 回の書き込みを行う可能性がありますが、PowerVR はジオメトリのバッチごとに 1 回の読み取りと 1 回の書き込みを行い、その間にレイ キャスティング スタイルのアルゴリズムが残りを行います。

深度バッファが読み取り可能である必要があるため、「純粋な」タイルベースの遅延レンダラーに OpenGL を実装することは実際には不可能です。glReadPixelsまた、カラー バッファはいつでも ( OS のメカニズムに従ってフレーム バッファを提示するたびに明示的にまたは暗黙的に) 読み取り可能であるため、デプス バッファのみを書き込むことは一般的に効率的ではありません。シーンを描き、その上にさらに描きます。

于 2012-04-09T16:15:27.097 に答える