2017-11-23 31 views
0

メインウィンドウにQOpenGLWidgetを使用するQtアプリケーションがあります。 QOpenGLFunctionsを使用してOpenGL関数を解決するOpenGL ES 2.0を使用して描画します。すべてがWindowsとLinux上で完全に(同じQtアプリケーションを使用して)動作します。私は3つのプラットフォームすべてでQt 5とQt Creatorを使用しています。OpenGL ES 2.0はWindowsとLinuxでは動作しますが、Macでは動作しません

ただし、Macではグラフィックスの描画が機能しません。最初にアプリケーションを実行しようとしたときに、シェーダプログラムをコンパイルできず、 'precision'キーワードが構文的に間違っていると不満を表明したため、クラッシュしました。これは、おそらく、シェーダコンパイラが異なるバージョンのシェーダ言語を期待していることを示しています。

シェーダープログラムの先頭に '#version 100'を挿入しようとしましたが、これは役に立たなかった:今回はバージョン100がサポートされていなかったというエラーメッセージでした。

シェイダーから 'precision'ステートメントを削除することで、ディスプレイにグラフィックスが表示されることがありました。しかし、表示が間違っていた - 一部のグラフィックが欠落していた。透過性のないピクセル(アルファ= 1)だけが描画されていることがわかりました。

OpenGL ES 2.0を正しく使用していることを確信しています.WindowsとLinuxのQtで動作するだけでなく、同じコードがAndroid(ネイティブコード)とiOSのQtの外でも完全に機能するためです。

Qtのドキュメントによると、QOpenGLFunctions 'は、OpenGL ES 2.0 APIへのクロスプラットフォームアクセスを提供します。それは真実ではないようです。

この問題を解決する方法はありますか?私は数時間を探して何も見つけなかった。

+0

QSurfaceFormat :: setProfile()を使用していますか? (Appleはwin/linuxのようなプロファイルを使用していない)。 'Qt 5.1'を使用していない場合は、このシナリオに関係なく' QOpenGLContext :: versionFunctions() 'が役立ちます。'Qt 5.1'を使用している場合は、' QAbstractOpenGLFunctions'が役立つ可能性があります。 http://qt.apidoc.info/5.1.1/qtgui/qabstractopenglfunctions.html#details –

+0

私はそれを試みました。それは助けになりませんでした。 OpenGL ES 2.0コンテキストを明示的に要求すると、黒い画面が表示され、「コンテキストを作成できませんでした」というエラーが発生しました。現時点では、シェーダで「精度」を取り除くことによって、上に述べたように、ピクセル透明度以外のすべてが機能しています。 –

+0

この時点で私の唯一の提案は、おそらくこの質問を見てみることです(著者は彼の問題の解決策を投稿します)。 https://stackoverflow.com/q/23779357/499581 –

答えて

0

私の修正です。それは動作しますが、私はまだ正確に何が起こっているのかについてのより良い修正と説明に興味があります。

シェーダコンパイラはOpenGL ESバージョンのGLSLシェーダ言語をサポートしておらず、OpenGL ES実装はすべてのブレンドモードをサポートしていません。特にglBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)です。ここで

は、あなたが何をすべきかです:

  1. シェーダプログラムからすべてのprecision修飾子または文を削除します。これは標準的な方法で、lowp,mediumphighpを定義し、シェイダープログラムの開始時に影響を受けるプラットフォーム(Macの場合はQt)でのみ行うことを定義するために#defineステートメントを追加することによって行うことができます。

  2. ブレンド機能glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);を使用してください。

  3. すべての透明色に事前乗算されたアルファを使用します。

  4. フラグメントシェーダで色を調整する場合は、色のすべての成分にgl_FragColor.w *= alpha;の代わりにgl_FragColor *= vec4(alpha);のアルファ値を掛けます。 R、G、またはBの成分がアルファ値よりも大きくならないようにする必要があります。これは、プリマルチプライドアルファを使用すると違法であり、おそらく透明な色が描画されない原因でした。

関連する問題