glSwapBuffers()を呼び出した後のバッファの内容は何ですか?


8

SDL_GL_SwapBuffers()特に)

シーンを描画し、swap-buffersを呼び出すと、glClear()何かを描画する前にシーンを処理するのが一般的です。クリアしない場合、バッファの内容は何ですか?これは仕様によって定義されていますか、それともドライバーによって異なりますか?


これは非常に興味深い質問です。
Notabene、2011年

回答:


13

フロントバッファーとバックバッファーをスワップする方法の詳細はプラットフォームごとに異なるため、答えはプラットフォームに依存します。

GLX glXSwapBuffersリファレンスドキュメントによると:

スワップ後、バックバッファの内容は未定義になります。これはウィンドウだけでなくピクセルバッファーにも適用されることに注意してください。

ただし、GLX_EXT_buffer_age拡張機能が存在します

この拡張機能の目的は、ドライバーが特定のサーフェスに関連付けられたフロントバッファーとバックバッファーのセットをどのように管理して、アプリケーションが古いフレームのコンテンツを再利用し、次のフレーム。

しかし、Win32 SwapBuffersは次のように述べています。

このデバイスコンテキストが参照するウィンドウの現在のピクセル形式にバックバッファーが含まれている場合、関数はフロントバッファーとバックバッファーを交換します...デバイスコンテキストが参照するウィンドウの現在のピクセル形式にバックバッファーが含まれていない場合、これは呼び出しは効果がなく、関数が戻ったときのバックバッファの内容は未定義です。

そして、CGLFlushDrawableは、OS X Core Graphicsで次のように述べています。

バッキングストア属性がfalseに設定されている場合、バッファーはコピーではなく交換できます。これは、フルスクリーンモードの場合によく見られます。レシーバーがダブルバッファーのコンテキストでない場合、この呼び出しは何もしません。

最後に、OpenGL ES標準のバッファスワップ関数eglSwapBuffersで

eglSwapBuffersを呼び出した後、サーフェスのカラーバッファーは未定義のままになります。

では、これはどういう意味ですか?

  • 本当にクロスプラットフォームであるためには、スワップ後のバックバッファーについて何も想定できません。その内容は定義されていないので、使用する前にglClearまたは修正する必要があります。
  • Linuxを使用している場合は、バッファ経過時間拡張を確認できます。システムはトリプルバッファリングされる可能性があるため、複数のフレームに相当する損傷を追跡して対処する必要がある場合があります。
  • OS Xを使用している場合は、コピーされたり、交換されたりする可能性があります。そのため、バックバッファーの内容はガベージではないと想定できますが、送信したフレームか、それより前のフレームかを制御できません。
  • Win32のみを対象とていて、バックバッファーがあること確認している場合は、その内容がフロントバッファーにあったものであると想定できます。(これは明示的に述べられているのではなく、省略からの仮定ですが、多くの構成で機能しない場合でも、私は驚かないでしょう。)

GLXとCGLの制約、およびOpenGLとOpenGL ESの間の変更を最小限に抑えたいという要望を踏まえると、コンテンツがごみであると想定することもできます。


1

私が読んだことから、唯一の動作は未定義です。だから私はバッファの内容が何になるかについての保証はないと仮定します。言うまでもなく、一部のライブラリは、クリアコールをスワップバッファコールにラップしています。


-1調達不足の場合。OpenGLのドキュメントは豊富で、簡単にリンクできます。

+1、まあ、彼は実際に答えて、答えは正しかったから。ソースは間違いなく役立ちますが、必ずしも必要ではありません!
o0 '。

@ Lo'oris:まあ、彼は正しくない。私の回答で説明されているように、彼は一部のプラットフォームでは正しいが、すべてではない。

@ジョー:あなたの答えが説明するように、「環境」に関係なく正しい唯一の答えはこれです。これが「どこか」で壊れることを知っているコーディングは、そもそも間違っているでしょう。
o0 '。

1
@ Lo'oris:すべてのコード、特にレンダリングコードはどこかで壊れる可能性があります。良い答えはそれを言うだけでなく、どこかにあることを説明します。

0

動作は定義されていないため、とにかく画面全体を埋める場合は、クリアを削除することを検討してください。ただし、一部の環境(少なくともタイリングアーキテクチャ)では、実際にパフォーマンスが低下します。レンダリング開始時のフルスクリーンクリアは一般的な操作であるため、すべてのターゲットプラットフォームで適切に最適化されていなかったとしたら驚きます。

それが未定義である理由は、多くのアーキテクチャーで、コンテンツの状態を定義することは、標準をどのように定義するかに関係なく、追加のオーバーヘッドになるということです。

そこに何が見つかるかについては、経験に基づいて推測できます。

ほとんどのデスクトップPCビデオハードウェアのようなダブル(またはマルチ)バッファーアーキテクチャでは、「その他の」バッファーデータが見つかる可能性があります。ただし、これは保証されていません。仕様に含まれていないため、奇妙な最適化の恩恵を受けると、データが文字化けします。

タイルアーキテクチャでは、最後のフレームと同じデータ、タイルサイズに基づいて奇妙に文字化けされたデータなど、ほとんどすべてが見つかります。

次に、バッファの定義が期待どおりではないため、奇妙なアーキテクチャ(NDSなど)がいくつかあります。


うわー、反対票。私は私が書いたことについて真剣です-特にモバイルハードウェア向けに書いている場合は、そこに明確な内容を必ず含めてください。
Jari Komppa、2011年

あなたの回答はDavidの回答とほぼ同じであり、まだ参考文献がなく、Davidのように正確でも全体の話でもないため、私は反対票を投じました。

OK。しかし、私が与えることができる唯一の参照は私自身の経験です。もっと注意しましょう。
Jari Komppa、2011年

この回答は他の2つ(私は両方とも賛成)よりも最悪だったので、私は反対票を投じました。それは何も追加せず、あまり明確ではありませんでした。
o0 '。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.