Qt と OpenSceneGraph という OpenGL を使用する 2 つのライブラリを混在させています。私は OpenGL ES 2 をターゲットにしているので、シェーダーと ES 2 互換の呼び出しですべてが行われます。
OSGをQDeclarativeItemにペイントしようとすることで、QtDeclarativeでOSGを具体的に使用しています。私はこれを Qt ドキュメントで提案されている方法で行います: beginNativePainting()/endNativePainting() の間ですべての OpenGL 呼び出しをラップします。
これは、OpenSceneGraph シーンでテクスチャを使用するまで問題なく機能します。これを行うと、より良い言葉がないためにQMLウィンドウが「めちゃくちゃ」になります。できるだけシンプルにするために、OSG シーンはテクスチャが適用された平面で構成されています。基本的な OpenGL 呼び出しを使用してシーンを再作成したところ、問題は発生しなくなりました。一連の写真として要約された問題は次のとおりです。
- QtDeclarative エンジンは、OpenGL を使用して描画します。簡単な QML ページをセットアップしました。
- OpenGL を直接使用して簡単なシーンを作成します。テクスチャが描かれた飛行機です。
- 今、私は OSG で同じシーンをセットアップしようとしています... 同一のシェーダーなど.
最後のスクリーンショットで奇妙なことが起こっていることがわかります。元の OpenGL シーンが透明だった黒い背景について心配する必要はありません。これは、OSG が黒のクリア カラーを使用しているだけです。問題は、QML で設定された他のアイテム (四角形) が台無しになることです。
編集:何が起こるかを明確にするために:QMLで描いた長方形はすべて画面の右端に引き伸ばされます。また、QML で OpenSceneGraph アイテムの後に四角形を描画すると、それらが表示されないことに気付きました (以前は気付きませんでした)。次のスクリーンショットでは、OSG アイテムの後に紫がかった黒い四角形を描画していますが、消えていることに注意してください。もっと奇妙なことが起こっているかもしれませんが、四角形で遊んでいるのを観察したのはこれだけです。
前
後
私は OpenGL にかなり慣れていないので、どのような呼び出し/状態設定がこのようなことを引き起こすのかわかりません。OpenSceneGraph は、Qt のペイント エンジンを台無しにする OpenGL の状態変更を行っていると思います。また、これは OSG がテクスチャを使用する場合にのみ発生することも知っています... OSG シーンにテクスチャを適用しない場合、これは発生しません。これは私が立ち往生しているところです。
また、BuGLe を使用して、OSG でテクスチャを有効にした場合と無効にした場合の OpenGL コール トレースを取得して、問題のある状態の変化を特定できるかどうかを確認しました。私はいくつかの違いを見つけ、OSG が 2 つの間で変更したいくつかのグローバル状態 (glPixelStorei() など) も見つけましたが、見つけた変更をリセットしても違いはありませんでした。何を探すべきかを知っていれば、とても役に立ちます。誰かが気が狂っている場合は、スタック トレースもあります。
- OSG with texturering : http://pastie.org/4223182 (OSG テクスチャは 637~650 行目)
- テクスチャリングなしの OSG: http://pastie.org/4223197
編集 2: 役立つ可能性のある差分を次に示します。関連する行が明らかになる前に、下にスクロールする必要があります。 http://www.mergely.com/nUEePufa/
編集 3: うわー! さて、その違いは私をかなり助けてくれました。OSG は VertexAttribArray 3 を有効にしますが、無効にはしません。OSG がフレームをレンダリングした後に glDisableVertexAttribArray(3) を呼び出すと、問題が部分的に解決されるようです。QML の長方形を引き伸ばす必要はもうありません。ただし、OSG アイテムの後に描画された四角形はまだ表示されません。