3

数日前、ハードウェアが変更されたため、コンピューターをセットアップし、Windows 8 の新しいコピーをインストールしました。とりわけ、ビデオ カードを Radeon HD 7870 から Nvidia GTX 660 に変更しました。

Visual Studio 11 を再度セットアップした後、最後の OpenGL プロジェクトを Github からダウンロードし、プロジェクト全体を再構築しました。Visual Studio からアプリケーションを実行したところ、 が原因でクラッシュしましたnvoglv32.dll

Application.exe の 0x5D9F74E3 (nvoglv32.dll) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000000。

古い環境では、アプリケーションは期待どおりに機能しました。プロジェクトやソース コードは何も変更していません。唯一の違いは、Visual Studio のインストールの言語が英語で、以前はドイツ語だったことです。そのため、新しいプロジェクトを作成し、すべての設定を採用しましたが、エラーが残ります。

クラッシュの場所を特定するために、すべての初期化 (ウィンドウ、シェーダーなど) が成功しglDrawElements()、遅延レンダラーのジオメトリ パスを参照するドロー コールでエラーが発生していることに気付きました。

nvoglv32.dllいくつかの調査の後、それはNvidiaからのものであり、というサービスに関するものであることがわかりましたCompatible OpenGL ICD。これは、私のアプリケーションが互換モードで実行されていることを意味しますか? それは古いアプリケーションをサポートするためのモードのように聞こえますが、私は通常モードで実行したいと思っています! ちなみに、ビデオカードには最新の安定したドライバーをインストールしました。

正直なところ、このクラッシュを修正する方法がわかりません。何が原因で、どのように修正するのですか?

更新: Geforce フォーラムで、私の問題に関する投稿を見つけました。応答はありませんでしたが、作成者は 2 つの OpenGL 呼び出しの順序を変更することで問題を解決できました。

こんにちは、みんな、

アプリケーションのソース コードを数時間調べた後、関数を呼び出していることがわかりました...

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #)
glBindVertexArray(#)

...この順序で、nvoglv64.dll でクラッシュが発生します。これらの呼び出しの順序を逆にしています...

glBindVertexArray(#)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, #)

...クラッシュを防ぎ、行儀が良いようです。

乾杯、ロバート・グラフ

私は頂点配列を使用していないため、この修正を簡単に行うことはできませんが、同様の問題が発生する可能性があります。進捗状況を報告します。

更新: 問題を解決する方法がまったくわかりません。さまざまなビデオ ドライバーのバージョンを試しましたが、違いはありません。最小限のシェーダーと単純なフォワード レンダリングを使用して、レンダラーを完全に書き直しました。しかし、クラッシュシルは最初のドローコールで発生します。

4

2 に答える 2

1

最後に、クラッシュを修正する解決策を思いつきました。

ウィンドウなどを作成するために使用する SFML フレームワークは、コンテキストの OpenGL 状態をリセットする機能を提供します。ウィンドウ作成直後に呼び出しました。

理由は説明できませんが、その関数呼び出しを削除するとクラッシュが解決しました。おそらく、その時点で GLEW などがまだ初期化されていないためです。

sf::RenderWindow window;
window.create(VideoMode(1024, 768), "Window Title");
window.resetGLStates(); // removing this line fixed the crash
window.setVerticalSyncEnabled(true);
于 2013-02-25T14:21:49.053 に答える