2013-03-29 5 views
11

OpenGLはポインタを直接とるa number of functionsです。それらのうちのいくつかはread data from those pointers、他はwrite data to those pointersです。OpenGLはいつ関数でポインタで終了しますか?

しかし、OpenGL関数はしばしばすぐに実行されません。通常、何かを描画すると、描画が終了するまでに時間がかかります。

OpenGLのポインタが終わったら、どのようにしたらわかりますか?

+2

+1純粋に教育目的で質問/回答のペアを投稿するイニシアティブ。私は自分自身について興味があり、リフレッシャーが必要な場合に備えて具体的な参照をすることはいいことです。良い仕事を続けるニコル! –

答えて

11

下記の例外を除いて、すべてのOpenGL関数は、その関数の復帰時に与えるすべてのポインタで終了します。従って、glReadPixelsはすべてのピクセルの読み込みとフォーマット変換を終了します。このため、asynchronous pixel transferは読み取り操作にとって非常に重要です。 OpenGLをにしないでください。 GPUと同期しないようにしてください。

このルールの唯一の例外は、「Pointer」という単語で終わるすべての機能です。 glVertexAttribPointer,glTexCoordPointerなどのようなもの。これらの関数でクライアント側メモリを使用すると(コアプロファイルOpenGL 3.2以降では有効ではありません)、これらの関数はそのメモリへのポインタを格納します。したがって、これらの頂点属性を使用してレンダリングする場合は、このポインタが有効であることを確認する必要があります。

クライアントメモリを使用して各レンダリングコールを実行した後、OpenGLでは、レンダリング関数が返されるまでに実装がクライアントメモリからの読み込みを完了する必要があります。したがって、glDrawArraysに電話して、問題のポインタを削除することができます。そして、あなたがそれらのポインタを変更するまで別のドローコールをしない限り、あなたは大丈夫です。これは、レンダリング呼び出しが戻るまでに、関連するすべての頂点データをOpenGLがコピーアウトする必要があることを意味します(バッファオブジェクトを使用する方が速い理由の1つ)。

関連する問題