13

頂点を OpenGL に送信するときに、頂点をカメラに最も近いものから最も遠いものへと並べることを提案する記事を時折見てきました (OpenGL バリアントの場合)。これが示唆する理由は、既にレンダリングされた別の頂点の背後にある場合、OpenGL が頂点を完全に処理/レンダリングしないことです。

通常、この順序は頻繁に変更されるため、深さによる頂点の順序付けはどのプロジェクトでもコストのかかるコンポーネントであるため、そのような設計はどの程度一般的または必要ですか?

OpenGL は送信されたすべての頂点を「見て」、順序に関係なく、バッチ全体をレンダリングする前に独自の深度バッファリングを処理すると以前は考えていました。しかし、実際に頂点が別の頂点より先に画面にレンダリングされる場合、順序付けがパフォーマンスにどのように役立つかがわかります。

レンダリングを最適化するには、前後に描画する必要がありますか?

4

2 に答える 2

10

プリミティブがラスタライズされると、その z 値を使用して、フラグメント シェーダーの実行をスキップする「早期 z キル」を実行できます。これが、前後にレンダリングする主な理由です。ヒント: 透明な (アルファ テクスチャの) ポリゴンがある場合は、後ろから前にレンダリングする必要があります。

OpenGL 仕様ではステート マシンが定義されており、レンダリングが実際に行われる順序は指定されておらず、結果が (特定の許容範囲内で) 正しくなければならないことのみが指定されています。

明確にするために編集:上記で言いたいのは、プリミティブが順番に処理されているように見える限り、ハードウェアは何でもできるということです

ただし、ほとんどの GPU はストリーミング プロセッサであり、おそらくパフォーマンス上の理由 (最小 DMA サイズなど) を除いて、それらの OpenGL ドライバーはジオメトリを「バッチ処理」しません。ポリゴン A に続いてポリゴン B をフィードすると、それらは次々にパイプラインにフィードされ、(ほとんどの場合) 互いに独立して処理されます。A と B の間に十分な数のポリゴンがある場合、A が B より前に完了する可能性が高く、B が A の後ろにある場合、そのフラグメントは「初期 z キル」によって破棄されます。

わかりやすくするために編集: 上記で言いたいのは、 hw はジオメトリを「バッチ処理」しないため、前後の順序付けを自動的に行うことができないということです。

于 2013-03-28T03:34:55.097 に答える
3

ここでいくつかの概念を混乱させています。頂点を並べ替える必要はありません (*)。ただし、前後に不透明なオブジェクトを描画する必要があります。これにより、GPU で「早期 z リジェクション」と呼ばれるものが有効になります。z テストによってピクセルがシェーディングされないことを GPU が認識している場合、GPU はシェーダーを実行したり、テクスチャ フェッチなどを行ったりする必要はありません。これは、個々のオブジェクトではなく、描画呼び出しのオブジェクトに適用されます。

簡単な例: プレイヤー キャラクターと空の背景があります。最初にプレイヤーを描画すると、GPU はプレイヤーが存在するピクセルのテクスチャ ルックアップを実行する必要がなくなります。逆の場合は、最初に空をすべて描いてから、それを覆います。

もちろん、透明なジオメトリは前面に引き戻す必要があります。

( * )=パフォーマンスを向上させるために、頂点の順序を変更できます。しかし、早期に z を実行することははるかに重要であり、オブジェクトごとに実行されます。

于 2013-03-28T06:53:12.327 に答える