2013-08-05 30 views
7

私はこの質問に対する答えを見つけようと、OpenGL仕様を読んできました。私は、OpenGLがGLDrawElementsやGLDrawArraysなどの描画呼び出しでVBOに表示される順序で要素を描画するか、プリミティブの断片を任意の順序で処理できるかどうかを保証するかどうかを判断しようとしています。OpenGLは、頂点バッファ内のプリミティブが順番に描画されることを保証しますか?

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

答えて

12

この仕様は、すべてのレンダリングの順序を定義するのに非常に注意しています。頂点データの配列は順番に処理され、特定の順序でプリミティブが生成されます。各プリミティブは、順番にラスタライズされ、後のプリミティブは、以前のものが終了するまでラスタライズされていないと言われています。

もちろん、これはOpenGLの動作方法です。実装は、複数のプリミティブを一度にラスタライズして処理することで不正行為を行うことができます。 しかし、の場合、彼らは引き続き "as if"ルールに従います。だから彼らは内部的に不正行為をしますが、結果はと同じようにと同じように順番に実行されます。

はい、あなたが依存できる特定の順序があります。シェーダを使用していない限り、perform incoherent memory accesses;シェーダーの書き込みではすべてのベットがオフになります。

1

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

あなたは、たとえば、通勤しないブレンディング方程式を用いて、いくつかのオブジェクトをレンダリングすることによって、これを確認することができます。

glBlendFunc(GL_ONE, GL_DST_COLOR); 

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

フラグメントシェーダ(ピクセルシェーダとは対照的に)と呼ばれるのは、ピクセルではないからです。なぜなら、フラグメントステージの後ではまだフレームバッファに書き込まれていないからです。ラスタ操作ステージの後にのみ実行されます。

関連する問題