11

私はこの質問に対する答えを見つけようとして、openGL 仕様を読んでいますが、運が悪いです。GLDrawElements や GLDrawArrays などの描画呼び出しが VBO に表示される順序で正確に要素を描画することを OpenGL が保証するかどうか、またはこれらのプリミティブのフラグメントを任意の順序で自由に処理できるかどうかを把握しようとしています。

たとえば、それぞれが同じ座標を持つ 10 個の三角形を表す 30 個の頂点を持つ頂点バッファーがあるとします。頂点 0、1、および 2 に対応する三角形が最初に (したがって、下部に) レンダリングされるというのは常に当てはまりますか? 頂点 28、29、30 に対応する三角形は常に最後に (したがって上に) レンダリングされますか?

4

2 に答える 2

14

仕様では、すべてのレンダリングの順序を慎重に定義しています。頂点データの配列は順番に処理され、特定の順序でプリミティブが生成されます。各プリミティブは順番にラスタライズされると言われ、後のプリミティブは前のプリミティブが完了するまでラスタライズできません。

もちろん、これは OpenGL が動作すべきと言っている方法のすべてです。実装は、一度に複数のプリミティブをラスタライズして処理することにより、ごまかすことができます (実際にそうします)。ただし、「あたかも」ルールに従います。したがって、彼らは内部的にチートを行いますが、すべてが順次実行されたかのように結果を書き込みます。

はい、信頼できる特定の順序があります。一貫性のないメモリ アクセスを実行するシェーダーを使用している場合を除きます。その後、シェーダー書き込みに対するすべての賭けはオフになります。

于 2013-08-05T18:34:11.183 に答える
2

それらは実際には異なる順序で描画され、異なる時点で終了する可能性がありますが、最後のラスター操作パイプライン段階で、三角形が発行された順序でブレンド (または深さ/ステンシル/アルファ テスト) が実行されます。 .

これは、通勤しないブレンド方程式を使用してオブジェクトをレンダリングすることで確認できます。次に例を示します。

glBlendFunc(GL_ONE, GL_DST_COLOR);

最終的なフレームバッファの内容が、プリミティブが描画されるのと同じ任意の順序で書き込まれた場合、そのような例では、Z ファイティングに似た効果が見られます。

これが、(ピクセル シェーダーではなく) フラグメント シェーダーと呼ばれる理由です。これは、フラグメント ステージの後、まだフレーム バッファーに書き込まれていないため、まだピクセルではないためです。ラスター操作段階の後のみ。

于 2013-08-06T15:57:09.983 に答える