数日前、ハードウェアが変更されたため、コンピューターをセットアップし、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, #)
...クラッシュを防ぎ、行儀が良いようです。
乾杯、ロバート・グラフ
私は頂点配列を使用していないため、この修正を簡単に行うことはできませんが、同様の問題が発生する可能性があります。進捗状況を報告します。
更新: 問題を解決する方法がまったくわかりません。さまざまなビデオ ドライバーのバージョンを試しましたが、違いはありません。最小限のシェーダーと単純なフォワード レンダリングを使用して、レンダラーを完全に書き直しました。しかし、クラッシュシルは最初のドローコールで発生します。