OpenGL には、ポインターを直接受け取る関数が多数あります。ポインタからデータを読み取るものもあれば、ポインタにデータを書き込むものもあります。
ただし、OpenGL 関数はすぐには実行されないことがよくあります。通常、何かを描画すると、描画が完了するまでに時間がかかります。
では、私が与えたポインターで OpenGL がいつ終了したかを知るにはどうすればよいでしょうか?
OpenGL には、ポインターを直接受け取る関数が多数あります。ポインタからデータを読み取るものもあれば、ポインタにデータを書き込むものもあります。
ただし、OpenGL 関数はすぐには実行されないことがよくあります。通常、何かを描画すると、描画が完了するまでに時間がかかります。
では、私が与えたポインターで OpenGL がいつ終了したかを知るにはどうすればよいでしょうか?
以下に示す例外を除いて、すべての OpenGL 関数は、その関数の戻り時に指定したポインターで終了します。そのglReadPixels
ため、返された時点ですべてのピクセルの読み取りとフォーマット変換が完了しています。これが、非同期ピクセル転送が読み取り操作にとって非常に重要である理由です。これにより、OpenGL はそれを行わず、GPU と同期できなくなります。
この規則の唯一の例外は、"Pointer" という単語で終わるすべての関数です。glVertexAttribPointer
、 、などglTexCoordPointer
。これらの関数でクライアント側メモリを使用する場合 (コア プロファイル OpenGL 3.2+ では使用できなくなりました)、これらの関数はそのメモリへのポインタを格納します。したがって、これらの頂点属性でレンダリングするつもりである限り、このポインターが有効であることを確認する必要があります。
クライアント メモリを使用した各レンダリング呼び出しの後、OpenGL では、レンダリング関数が戻るまでに実装がクライアント メモリからの読み取りを完了する必要があります。したがって、 を呼び出しglDrawArrays
てから、問題のポインタを削除できます。これらのポインターを変更するまで別の描画呼び出しを行わない限り、問題はありません。つまり、OpenGL は、レンダリング呼び出しが戻るまでに、関連するすべての頂点データをコピーしておく必要があります (バッファー オブジェクトを使用した方が高速である理由の 1 つです)。