0

のテクスチャ アタッチメントで使用されているターゲットに関する情報を収集してFBO、別の にコピーする必要がありますFBO

に関する限り、 andのみをサポートしているため、 andOpenGL ES 2.0を使用できます。返された情報は、使用されたテクスチャ ターゲットを決定するのに十分です (それがキューブ マップ フェースでない場合は、それ以外のものではないため、 です)。 .glGetFramebufferAttachmentParameter[if]v()OpenGL ES 2.0GL_TEXTURE_2DGL_TEXTURE_CUBE_MAPGL_TEXTURE_2D

ただし、デスクトップでは状況が変わります。

、、、、、および 6 つのキューブ マップ面がテクスチャ アタッチメントの有効なターゲットとしてあり、6GL_TEXTURE_1Dつのキューブ マップ面とターゲットは簡単に判別できるためです (キューブ マップ面とレイヤード テクスチャには特定のクエリがあるため)。 、少なくともマニュアルページに関する限り、残りのターゲットには同じことが当てはまりません: 、、、および。したがって、これら 4 つのターゲットのどれがテクスチャ アタッチメントで使用されたかをどのように判断できますか?GL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_RECTANGLEGL_TEXTURE_3DFBO'sGL_TEXTURE_3DGL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_RECTANGLE

コピーする必要があるのは、コンテキスト間で共有されていないFBOという事実、実装によってメイン スレッドで画面が作成されること、およびレンダリング ループでメイン スレッドを失速させないように、各画面専用の子スレッドでそれらを使用することです。したがって、UI イベントに対するアプリケーションの応答性を維持します。この場合、キャッシュ状態は望ましくなく実行不可能です。クライアント ライブラリ (アプリケーションとサーバー間の通信 API として機能することのみが懸念事項) が状態自体をキャッシュするのにはるかに適した位置にある場合、それ以外の場合はアプリケーションの明確な懸念事項をカットするため、望ましくなく、この場合は実行不可能です。前述のように、アプリケーションの懸念事項の一部を制御することさえできません。FBOsFBOsOpenGL

私が取り組んでいる実装は OpenGL ES 2.0 のみをサポートしているため、現時点ではこれは理論的な問題ですが、動作するコードよりも、FBO アタッチメントとして使用される正確なテクスチャ ターゲットについて確実な将来性のあるコードを書きたいと考えています。利用可能なオプションの数が、選択されていないオプションを除外することでどのオプションが選択されたかを把握できるように制限されているため、上記で示したように、機能豊富なデスクトップ バージョンでは機能せず、将来の OpenGL ES バージョンでは動作しません。

4

1 に答える 1

2

OpenGL には、あなたが抱えている問題に対する解決策がありません。テクスチャ オブジェクトを見て、それがどのターゲットであるかを知る方法はありません。またtextarget、FBO にアタッチされたテクスチャのパラメータが何であったかを知る方法もありません。一般的に言えば、テクスチャ オブジェクトの名前(GLuintから返される)を追跡することが期待されるのと同様に、テクスチャ オブジェクトのターゲットを追跡することが期待されますglGenTextures

これを処理する最善の方法は、クライアント ライブラリに、どのテクスチャとテクスチャ ターゲットを FBO に追加するかを単純に尋ねることです。このクライアント ライブラリからこの情報を取得できない場合は、必要なことを実行できません。

于 2013-05-29T21:03:18.657 に答える