8

状況

Qt 4 を使用する 32 ビット アプリケーションを開発しており、Windows 7 64 ビットで作業しています。

私のプログラムには、メインの非 OpenGL ウィジェットと、オプションでユーザーが開く QGLWidget があります。

問題:

それを作成するとQGLWidgetglGetVersion「1.1.0」と報告されます (私のハードウェアは OpenGL 4.3.0 をサポートしています)。その結果、必要な多くの機能がまったく機能しません (明らかに、OpenGL 1 では使用できないためです)。この問題は「時々」発生します。

追加情報

gDebugger を使用してプログラムを起動すると、すべて正常に動作し、glGetVersion は期待どおり「4.3.0」を返します。次の行を追加します。

QGLFormat::OpenGLVersionFlags flags = QGLFormat::openGLVersionFlags();

main() 関数の先頭でも問題を修正します。

アプリケーションは WinXP 32bit で正常に動作します。

私は 2..3 年前にこのアプリの OpenGL サブシステムを書きました。それを使用した人は、仮想マシン (Win7 または Vista ゲスト) で同様の問題があると言いましたが、当時この問題にどのように対処したか覚えていません。

OpenGL の初期化

OpenGL の初期化は、QGLWidget を使用して、glew や追加のライブラリなしで Qt 4 によって実行されます。

プログラムには QGLWidget が 1 つしかありません。正確には、QGLWidget から派生したクラスがあり、その初期化は次のようになります。

DisplayWidget::DisplayWidget(QWidget* parent)
    : QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer), parent)

システム構成
OS:Windows7 64bit。
コンパイラ: MSVC2008 Express SP1。
Qt: Qt 4.8.1 (MSVC2008 を使用して OpenSSL をサポートするソースからコンパイル)。Windows SDK: Windows Server 2008 および .NET 3.5。GPU: GeForce 460 GTX

質問:

この問題の原因は何ですか?

- アップデート -

"magical fix" (OpenGLVersionFlags) は、完全な再構築後に動作を停止し、gDebugger を使用して起動された場合でも、アプリケーションが常にソフトウェア レンダラーを初期化するようになりました。

私のマシン上の他のすべての OpenGL アプリケーションは正常に動作し、シェーダーを使用できます。

最新のドライバーを使用しています。

何か案は?

- アップデート -

いくつかのテストの後、Google Chrome と Steam クライアントが、OpenGL を使用するすべての Qt アプリケーションに何らかの影響を与えることがわかりました。

Google Chrome と Steam を開いていると、最終的にすべてのプログラムが正常に動作しなくなり、ハードウェア アクセラレーション OpenGL を取得できなくなります。

Google Chrome を閉じて Steam を開いたままにすると、ハードウェア アクセラレーション プログラムを 2 回起動しようとすると失敗します。

Steam と Chrome の両方を閉じると、すべてのプログラムの起動が成功します。

なぜこれが起こっているのでしょうか?

- アップデート -

デバッガーの出力を読んだところ、非常に興味深いことがわかりました。

'vdclient.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll'
First-chance exception at 0x777f47a5 (ntdll.dll) in vdclient.exe: 0xC0000005: Access violation reading location 0x05aa9000.
'vdclient.exe': Unloaded 'C:\Windows\SysWOW64\nvoglv32.dll'

基本的に、nvoglv32.dll をロードすると、「何か」がどこかでクラッシュし (ちなみに、デバッガーはこのイベントに反応しません)、システムは nvoglv32.dll をアンロードすることを決定します。その名前から判断すると、これは nvidia システム/ドライバー コンポーネントであり、このコンポーネントがなければハードウェア アクセラレーションはあり得ません。

opengl が正常に動作している場合、ログのこの部分は次のようになります。

'vdclient.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll'
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\ntmarta.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\Wldap32.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\powrprof.dll', Symbols loaded (source information stripped).
The thread 'Win32 Thread' (0x1744) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x1740) has exited with code 0 (0x0).
'vdclient.exe': Unloaded 'C:\Windows\SysWOW64\powrprof.dll'
The thread 'Win32 Thread' (0x1748) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x174c) has exited with code 0 (0x0).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\uxtheme.dll', Symbols loaded (source information stripped).

アイデア?

4

3 に答える 3

0

さて、私はあきらめます。

ドライバーのバグまたは Google Chrome の非互換性としてマークします。

この問題をプロジェクトの readme に追加し、OpenGL がエミュレートされている場合でもアプリが正常に動作する (つまり、アーティファクトが表示されない) ことを確認します。

于 2013-06-22T04:03:07.130 に答える
-1

OpenGL 3.0 以降には、レガシー機能の非推奨モデルがあります。古い OpenGL バージョンでは、新しいバージョンは古いバージョンのスーパーセットでした。つまり、OpenGL 1.5 コンテキストが必要で、OpenGL 2.0 コンテキストを取得した場合、それで問題ありません。古い機能を削除する可能性が出てくると、それは実行できなくなります。拡張WGL_ARB_create_contextが行われました: を置き換える新しい関数を公開しwglCreateContextます。と同様wglChoosePixelFormatARBに、システムに拡張メカニズムを追加して、コンテキスト作成のオプションを拡張できるようにします。この関数を使用せずに OpenGL 3.2+ Core Profile コンテキストを作成することはできません。

OpenGL コンテキストの作成方法に関する公式の最新ドキュメントは次のとおりです: http://www.opengl.org/wiki/Creating_an_OpenGL_Context_(WGL)

于 2013-06-17T10:51:25.927 に答える