2017-01-25 12 views
2

問題の説明

以来の1.1 OpenGLコンテキストを返します。私は(さまざまなWindowsの構成(7、8、8.1、10)と、ハードウェア上のOpenGLコンテキストを作成するために、OpenTKを使用していますさまざまなAMD、NVIDIA GPU、Intelのグラフィックスチップセット)を2年以上問題なく使用できます。OpenTKを使用してグラフィックスコンテキストを作成するNVIDIAの375.63ドライバ更新

しかし、OpenTKを使用してOpenGLコンテキストを作成しようとすると、nvidiaの375.63ドライバアップデートとその後のすべてのドライバアップデート(最新の378.49が昨日リリースされた)でも、OpenGL 1.1.0コンテキスト(ベンダー:Microsoft Corporation 、レンダラー:GDIジェネリック)。それはもちろん、私が必要とするほとんどのOpenGL関数が欠けている "フォールバック" OpenGLコンテキストのように見えます。

373.06またはそれ以前にロールバックすると問題は解決しますが、長期的に実行可能な解決策ではありません。

観察

  • 私は慎重にnvidia's released notesを読みましたが、その問題に関連するすべての問題や発言を見つけることができませんでした。
  • OpenTKで作成されたハンドルで初期化されたピクセルフォーマットが、nvidiaのドライバによって突然サポートされなくなったのではないかと疑います。 (私は必要に応じて詳細を提供することができます)
  • glfwを使ってサンプルC + +コードをいくつか試しましたが、正しいOpenGLコンテキスト(バージョン:4.5.0、ベンダー:nvidia)を得ることができます。むしろ何らかの形で壊れているコンテキストが作成される方法です。

問題を絞り込むためにOpenTKコードを掘り始めました。 コンテキストはこのデリゲートは、GetProcAddress関数を使用してロードされ

Delegates.wglCreateContextAttribsARB((IntPtr)hDC, (IntPtr)hShareContext, (int*)attribList_ptr); 

の周りにラッパーを使用して作成されます。Wgl.Libraryは "OPENGL32.DLL" である

[System.Runtime.InteropServices.DllImport(Wgl.Library, EntryPoint = "wglGetProcAddress", ExactSpelling = true, SetLastError = true)] 
internal extern static IntPtr GetProcAddress(String lpszProc); 

。関数が正しくロードされています。

渡される属性は、GL_MAJOR = 1 GL_MINOR = 0であり、サポートされている最新のOpenGLコンテキストを返す必要があります。私はまた、これらの値をそれぞれ成功させることなく4と5に強制しようとしました。

specs of wglCreateContextAttribsARBには、「フォールバック」コンテキストはありません。 (注:wglCreateContextAttribsARBは私のグラフィックスカードでサポートされています)

質問

  • OpenGLコンテキストを作成しながら、誰でも同様の問題が発生しました、そしてあなたがそれをどのように対処したのか?
  • これを破る2つのドライバのバージョンの間で何が変更されている可能性がありますか?

助けや手がかりを歓迎します。私は必要に応じていくつかの具体的な点について詳述することができます。

アップデート(2017年1月26日)

ピクセルモードを取得する方法が問題の原因であると思われます。初期化のステップでは、wglChoosePixelFormatARB関数を使用するARBモードを取得しようとし、新しいドライバで有効なモードを0にします。

ここにコードチャンクの関連部分があります。あなたがnum_formats[0]を見ることができるように

... 
int[] attribs = new int[] 
{ 
    (int)WGL_ARB_pixel_format.AccelerationArb, 

    (int)WGL_ARB_pixel_format.RedBitsArb, 
    (int)WGL_ARB_pixel_format.GreenBitsArb, 
    (int)WGL_ARB_pixel_format.BlueBitsArb, 
    (int)WGL_ARB_pixel_format.AlphaBitsArb, 
    (int)WGL_ARB_pixel_format.ColorBitsArb, 

    (int)WGL_ARB_pixel_format.DepthBitsArb, 
    (int)WGL_ARB_pixel_format.StencilBitsArb, 

    (int)WGL_ARB_multisample.SampleBuffersArb, 
    (int)WGL_ARB_multisample.SamplesArb, 

    (int)WGL_ARB_pixel_format.AccumRedBitsArb, 
    (int)WGL_ARB_pixel_format.AccumGreenBitsArb, 
    (int)WGL_ARB_pixel_format.AccumBlueBitsArb, 
    (int)WGL_ARB_pixel_format.AccumAlphaBitsArb, 
    (int)WGL_ARB_pixel_format.AccumBitsArb, 

    (int)WGL_ARB_pixel_format.DoubleBufferArb, 
    (int)WGL_ARB_pixel_format.StereoArb, 
    0 
}; 

int[] values = new int[attribs.Length]; 

int[] attribs_values = new int[] 
{ 
    (int)WGL_ARB_pixel_format.AccelerationArb, 
    (int)WGL_ARB_pixel_format.FullAccelerationArb, 
    (int)WGL_ARB_pixel_format.SupportOpenglArb, 1, 
    (int)WGL_ARB_pixel_format.DrawToWindowArb, 1, 
    0, 0 
}; 

int[] num_formats = new int[1]; 
// Get the number of available formats 
if (Wgl.Arb.ChoosePixelFormat(window.DeviceContext, attribs_values, null, 0, null, num_formats)) 
{ 
    // Create an array big enough to hold all available formats and get those formats 
    int[] pixel = new int[num_formats[0]]; 
    //result differ here from one driver to the other : 
    //373.06 => num_formats[0] is 66 
    //378.49 => num_formats[0] is 0 

    if (Wgl.Arb.ChoosePixelFormat(window.DeviceContext, attribs_values, null, pixel.Length, pixel, num_formats)) 
    { 
     //for loop to fetch all the modes 
    } 
} 
... 

Wgl.Arb.ChoosePixelFormatwglChoosePixelFormatARBのラッパーです)、新しいドライバのバージョン用に0有効な形式を返します。ここから、おそらく、指定されたフラグが正しくないか、またはwglChoosePixelFormatARB関数にバグがある可能性が最も高いと思います。

+0

1.0を要求したときに最新のバージョンが返され、そのバグが修正され、修正された場合は、アプリケーションが対象とする正しいメジャー/マイナーバージョンを要求する必要があります。 – Gusman

+0

前述のように、OpenGL 4.5のコンテキストを取得するために、メジャーとマイナーをそれぞれ4と5に設定しようとしましたが、結果はありませんでした。 – Wasabi

+0

コンテキストを作成したり要求したりするコードを追加すると、問題があると分かりやすくなります。また、OpenTK.Graphics.OpenGL4の機能を使用していますか? – Gusman

答えて

1

私が作業しているコードベースのOpenTKコードは最新ではないことが判明しました。上記のコードチャンクは古くなっています。実際にコードはmono/opentkレポから来ているようです(正確なコードチャンクはhereです)。私は、version 2.0-0(タグ)の機能をロードするARB拡張を調べましたが、それらは多く変更されます(code here)。

ボトムラインは、私はversion 2.0-0でテストし、それが問題を修正します。

これは古い問題であることを指摘してくれたRobert Rouhaniに感謝します。

2

NVIDIA OpenGLのコンテキストが見つからず、Windowsに付属している古くなったものに戻って10年以上経っていないようです。

私が見つけたのはthis old issue on the OpenTK repoでした。最近のOpenTKのバージョンで修正されるはずですが、問題が再び浮上する可能性があります。

問題を特定して再現性を高めるために多くのことをしたようです。 OpenTKを使ってプルリクエストを開くのは問題ではありません。 OpenTKがGLFWとは異なる方法でwglCreateContextAttribsARBをスキャンして呼び出している可能性があります。

GLFWとOpenTKコンテキストの初期化を比較して比較すると、そこに問題が発生することがあります。

+1

更新:LWJGLの最新のドライバにも問題があるようです –

関連する問題