問題の説明
以来の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.ChoosePixelFormat
がwglChoosePixelFormatARB
のラッパーです)、新しいドライバのバージョン用に0有効な形式を返します。ここから、おそらく、指定されたフラグが正しくないか、またはwglChoosePixelFormatARB
関数にバグがある可能性が最も高いと思います。
1.0を要求したときに最新のバージョンが返され、そのバグが修正され、修正された場合は、アプリケーションが対象とする正しいメジャー/マイナーバージョンを要求する必要があります。 – Gusman
前述のように、OpenGL 4.5のコンテキストを取得するために、メジャーとマイナーをそれぞれ4と5に設定しようとしましたが、結果はありませんでした。 – Wasabi
コンテキストを作成したり要求したりするコードを追加すると、問題があると分かりやすくなります。また、OpenTK.Graphics.OpenGL4の機能を使用していますか? – Gusman