3

テクスチャが OpenGL にアップロードされた後にレンダリングしたいのですが、完了についての通知を受け取ることができません。

アニメーションや繰り返しレンダリングの使用は避けたいと思います。

glTexImage2D はまったく非同期ですか? 私の知る限り、ほとんどすべての OpenGL 呼び出しは非同期です。


とにかく、glDrawArrays の完了についてもお知らせいただければ幸いです。

4

2 に答える 2

6

答えは、への呼び出しがglTexImage2D返された後に続行することです。あなたの観点からは、返された後にすべてが適切に設定されているという意味で、同期呼び出しです。PBO を中間ストレージとして使用することで、テクスチャのアップロードを非同期にすることができますが、その場合でも、すべてがドライバーによって管理され、glTexImage2D返されたときにテクスチャ データが適切にアップロードされ、レンダリングを開始できると想定できることだけを知っておく必要があります。テクスチャ データがまだ内部的にアップロードされていない場合、オブジェクトはとにかくレンダリングされず、テクスチャがセットアップされるのを待ちます。

ほとんどの OpenGL 呼び出しは、グラフィックス カードに送信されるコマンドのみをスケジュールし、ドライバーが最終的にそれらをハードウェアに送信するタイミングを決定し、ハードウェアがいつそれらを処理するかを自由に決定できるという意味で、非同期と見なすことができます。 、実際にいつ完成するかは誰にもわからないという事実は言うまでもありません。しかし、あなたは何を知っていますか、通常は気にしません。前の操作が完了するのを待つために何かをブロックする必要がある場合 (非同期テクスチャ アップロードなど)、自動的に管理され、OpenGL 関数が返されると、その時点から作業が完了したことを確認できます。見る。

免責事項: 実際の操作がデバイスでの作業を最終的にいつ終了したかを本当に知る必要がある状況が実際にあります。あなたのシナリオはそれらの1つではありませんが。操作を本当に同期したい数少ない状況の 1 つは、デバッグまたはプロファイリングの理由で何かのタイミングを計っている場合です。OpenGL ES にはおそらくARB_timer_queryがないため、( BlueVoodooglFinishの回答で提案されているように) を発行することは、この場合のオプションである可能性があります。

編集:で描画されたものが最終的に画面にレンダリングされたときに通知されないのと同じようにglDrawArrays、それを気にする必要はありません。

于 2012-10-24T11:30:44.443 に答える
0

私はそれが非同期呼び出しであることを意味したと思いますか? そうでなければ、なぜ通知を受け取る必要があるのでしょうか? 同期する必要がある場合は、glFinish()をご覧ください。openGL メソッドの通知については知りません。

于 2012-10-23T18:37:43.413 に答える