私は SDL2 と C++11 を使用してゲーム エンジンを構築しています (個人的なプロジェクトとして、楽しみと練習のために)。私がやりたいことの 1 つは、サポートされている最新バージョンをグラフィックス ドライバーで使用することです。バージョンに基づいて、エンジンのグラフィックス部分のレンダリング方法が異なります。このようにして、関連性があり便利な OpenGL の最新機能を使用できるだけでなく、古いハードウェアもサポートできます。私が考えることができる2つの方法があります:
サポートされている最新バージョンの OpenGL を検出して使用していますが、それを行う方法が思いつきません。はい、Google を試しました。
試行錯誤を使用して、最新バージョン (4.3、ただし、ドライバーを更新したにもかかわらず、私の GTX 460 は 4.2 までしかサポートしていません) から開始し、それが失敗した場合 (SDL をチェックして NULL コンテキストを返すことで検出します) )、バージョン番号を下げて再試行します。
私が使用する方法 (#2) は、4.3 コンテキストの作成直後に失敗します。現在、グラフィックス ドライバーが 4.2 しかサポートしていないことはわかっていますが、GLX はエラーをスローし、NULL コンテキストを与え、プログラムを続行させるように設計されていると思っていましたが、代わりにコンテキストの作成の失敗を乗り越えることはできません。 . GLX がどのように動作するかについての私の仮定は間違っていますか? コンテキストを作成せずに、サポートされている最新のバージョンを検出する方法はありますか?
一部の人々がエラーを示す完全で最小限のソースを見たいと思っていることを知っているので、ここに示します:
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
int main() {
if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 ) {
return -1;
}
SDL_Window* window = SDL_CreateWindow( "SDL Window", 0, 0, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );
if( window == nullptr ) {
return -1;
}
unsigned int major = 4;
unsigned int minor = 3;
SDL_GLContext context = nullptr;
while( context == nullptr ) {
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, major );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, minor );
context = SDL_GL_CreateContext( window );
if( context == nullptr ) {
if( minor == 0 && major > 1 ) {
--major;
minor = 9;
}
else if( minor > 0 ) {
--minor;
}
else {
SDL_DestroyWindow( window );
return -1;
}
}
}
SDL_Delay( 5000 );
SDL_GL_DeleteContext( context );
SDL_DestroyWindow( window );
return 0;
}
また、そのコードを 4.3 ではなく 4.2 コンテキストで開始するように変更すると、問題なく動作します。したがって、具体的には 4.3 コンテキストを作成する際にエラーが発生します。