7

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() など) も見つけましたが、見つけた変更をリセットしても違いはありませんでした。何を探すべきかを知っていれば、とても役に立ちます。誰かが気が狂っている場合は、スタック トレースもあります。

編集 2: 役立つ可能性のある差分を次に示します。関連する行が明らかになる前に、下にスクロールする必要があります。 http://www.mergely.com/nUEePufa/

編集 3: うわー! さて、その違いは私をかなり助けてくれました。OSG は VertexAttribArray 3 を有効にしますが、無効にはしません。OSG がフレームをレンダリングした後に glDisableVertexAttribArray(3) を呼び出すと、問題が部分的に解決されるようです。QML の長方形を引き伸ばす必要はもうありません。ただし、OSG アイテムの後に描画された四角形はまだ表示されません

4

2 に答える 2

2

トレース ログに執着した後、上記の問題を解消するために制御を Qt に戻す前に、リセットする必要がある 2 つの OpenGL のものを見つけたと思います。編集で1つ言及しました...この回答で両方を要約します。

長方形/QML アイテムの歪み

QPainter は、頂点属性 3、4、および 5 を、それらの長方形のジオメトリに関連しているように見えるものに直接使用します。これはトレースで見ることができます:

[INFO] trace.call: glVertexAttrib3fv(3, 0x2d94a14 -> { 0.00195312, 0, 0 })
[INFO] trace.call: glVertexAttrib3fv(4, 0x2d94a20 -> { 0, -0.00333333, 0 })
[INFO] trace.call: glVertexAttrib3fv(5, 0x2d94a2c -> { 0.2, 0.4, 1 })

対応する頂点属性配列を無効にすると、伸縮する四角形の問題が修正されます。

 glDisableVertexAttribArray(3);
 glDisableVertexAttribArray(4);
 glDisableVertexAttribArray(5);

OSG アイテムの後に描画されたアイテムがレンダリングされない

振り返ってみると、これは簡単で、テクスチャリングとは何の関係もありませんでした。シーンにテクスチャを追加しようとする前は、これに気づいていなかったので、2 つの問題を混ぜ合わせたのは私のせいでした。また、投稿したトレースと差分を台無しにしました。注文の問題を発見した後、それを説明するためにそれらを更新したことはありません(申し訳ありません!)

とにかく、QPainter は深度テストがオフになっていることを期待しています。Qt は、beginNativePainting() を呼び出したとき、およびアイテムの描画を開始したときに深度テストをオフにしますが、制御を戻すたびにオフに戻す必要があります。

  1. QPainter ペイント (DEPTH_TEST = オフ)
  2. OSG が描画します (DEPTH_TEST = on)
  3. QPainter はより多くのものを描画します [DEPTH_TEST = off を期待]

正しいトレースログは、私がこれを行っていないことを示していました...したがって、修正は

glDisable(GL_DEPTH_TEST)
于 2012-07-09T06:35:34.933 に答える
1

GL_TEXTURE_2D を再度有効にする必要があるのでしょうか? あなたの例では、OSG が有効にし、その後 GL_TEXTURE_2D を無効にするテクスチャを使用していることに気付きました。したがって、2 つのケース (テクスチャを使用する場合と使用しない場合) の違いは、テクスチャを使用するケースはテクスチャリングを無効にして終了するのに対し、テクスチャリングを使用しないケースは GL_TEXTURE_2D を初期状態のままにすることです。

Qt がクワッドを描画するために有効なテクスチャリングを必要とする/期待する場合、何も表示されない可能性があります。

于 2012-07-09T05:40:56.597 に答える