問題タブ [qopenglfunctions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
128 参照

c++ - テクスチャは空白にレンダリングされますが、glGetTexImage は完全に機能します

既存の OpenGL アプリケーションに UI オーバーレイを追加するコードをいくつか書きました。
残念ながら、私は OpenGL に精通していませんが、一部のデバイスでは何らかの形で常に失敗することを知っています。
いくつかの裏話:

一般的なパイプラインは次のとおりです。
アプリケーション レンダリング -> UI が FBO にレンダリングされる -> FBO がブリットされて RGBA テクスチャが取得される -> テクスチャが UI シーンの上に描画されます。

ここまでは順調でしたが、Ubuntu 16.04 の Intel カードでコンテキスト スイッチ間でテクスチャが壊れる問題に遭遇しました (UI レンダリングは QOpenGLContext を使用して行われ、アプリケーションは OGRE によって管理される生の OpenGL コンテキストですが、QOpenGLContext はリソースを共有するように設定されています)。共有が機能するかどうかを確認することでその問題を解決し (1 つのコンテキストでテクスチャを作成し、別のコンテキストでコンテンツが正しいかどうかを確認します)、そうでない場合は、コンテキスト B にある間にコンテンツをロードし、コンテキスト A に再度アップロードします。ただし、何らかの理由で同じマシン上のUbuntu 18.04では、これは実際に機能します。でコンテンツを取得するとき、テクスチャは他のコンテキストでも正しいglGetTexImageです。

問題は次のとおりです。レンダリングされていません。上に何もないアプリケーション シーンだけを取得しますが、それをダウンロードして、アプリケーション コンテキストで作成されたテクスチャに再アップロードするという回避策を手動で有効にすると、機能します。
テクスチャのコンテンツは問題ないのに、 を使用して取得glGetTexImageし、別のコンテキストで作成されたテクスチャに再アップロードしない限り、表示されませglTexImage2Dん。
glTexImage2D を使用する場合、無効で正しく設定されている状態がいくつかあるはずです。

UI がレンダリングされた後のコードは次のとおりです。

頂点シェーダー

フラグメントシェーダー

TL;DR テクスチャはレンダリングされません (完全に透明) が、それを使用してメモリにコピーすると問題なく表示glGetTexImageされ、それをアプリケーション コンテキストで作成されたテクスチャにコピーして戻すと、問題なくレンダリングされます。

グラフィックス カードは、Mesa バージョン 18.2.8 を搭載した Intel UHD 620 です。

編集:明確でない場合は、テクスチャの元のコンテキストではなく、アプリケーションのコンテキストでテクスチャをコピーしています。これは、作業中のテクスチャが作成されるコンテキストと同じです。したがって、共有が機能しない場合は、コピーしないでください。その時点で正しいコンテンツを取得します。