SDL 1.3でのOpenGL 3.2/3.xコンテキストの作成

私はSDLがOpenGL
3.xのコンテキストをサポートしていないと言う問題に直面しています。私はこのチュートリアルに従っています:クロスプラットフォームOpenGL
3.2コンテキストの作成SDL(C/SDL)
で表示されます。私はこの場合GLEWを使用していますが、gl3.hにはこれを使用することができませんでした。これは私が結んだコードです:

#include 
#include     

int Testing::init()
        {
            if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
            {
                DEBUGLINE("Error initializing SDL.");
                printSDLError();
                system("pause");
                return 1;//Error
            }

            //Request OpenGL 3.2 context.
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

            //set double buffer
            SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

            //Create window
            window = SDL_CreateWindow("OpenGL 3.2 test",
                SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
            if(window == NULL) return 3;//Error

            //Print errors to console if there are any
            printSDLError(__LINE__);

            //Set up OpenGL context.
            glContext = SDL_GL_CreateContext(window);
            printSDLError(__LINE__);
            if(glContext == NULL)
            {
                DEBUGLINE("OpenGL context could not be created.");
                system("pause");
                return 4;
            }

            //Initialize glew
            GLenum err = glewInit();
            if(err != GLEW_OK)
            {
                DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
                system("pause");
                return 2;
            }

            return 0;//OK code, no error.
        }

報告される唯一の問題は、
SDL_GL_CreateContext(window)を呼び出そうとした後で、SDLが「GL
3.xはサポートされていません」と報告しています。しかし、チュートリアルとこのサンプルパック(私がテストするのに気にしていないSDL 1.3とOpenGL
3.2を組み合わせて成功したと報告しています。私はSDL
1.3が開発の途中にあることを認識していますが、意図しないサポートが削除されることは多少疑わしいです。

コンテキストはまだ作成されており、GLEWはうまく初期化することができます。
(私の人生の中で、作成されたコンテキストのバージョンを見る方法はわかりません。なぜなら、これはコアプロファイルであるはずですから、それを見つける方法もわからないからです。チュートリアルによれば、
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION、3)は実際に何もしません。この場合、適切なコンテキストを作成する方法やデフォルトのコンテキストを変更する方法がわかりません。

編集:Nicolが助けてくれたおかげで、いくつかのテストの結果、私は
SDL_GL_SetAttribute
に渡すパラメータにかかわらず、コンテキストは常にバージョン1.1であることが判明しました。しかし、3.0より下のバージョンを置いても、それがサポートされていないというエラーを吐き出すことはありません。したがって、問題は、SDLが見ている「コア」バージョンがわずか1.1であることです。

記録としては、Visual C ++ 2010 Express、GLEW 1.7.0、最新のSDL
1.3リビジョンを使用しています。私はこれらの3つをすべて使用することにかなり慣れています.32ビット版と64ビット版のSDLライブラリを手動でビルドしなければならなかったので、間違ってしまう可能性があります。これまでのところ、32ビット版と64ビット版はまったく同じことを行っています。

編集:最新のドライバでnVidia 360M GPUを使用していますが、これはOpenGL Extension Viewer
4.04がOpenGL 3.3まで完全な互換性を持つと報告しています。

どんな助けもありがとうございます。

UPDATE: I have managed to get SDL to stop
yelling at me that it doesn’t support 3.x contexts. The problem was
that the SDL_GL_SetAttribute must be set BEFORE
SDL_Init
is called:

//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

//Initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
    DEBUGLINE("Error initializing SDL.");
    return 1;//Error
}

残念ながら、GLEWはまだOpenGL
1.1以上のものを認めることを拒否しています(GLEW_VERSION_1_1のみが真実を返します)。
glGetString(GL_VERSION)も1.1.0を報告します。私のプログラムでは、あたかもそれらがインストールされていないかのように、上位バージョンが分からないようです。

ベストアンサー

あなたがすでに解決策を見つけたかどうかわからないので、私はここにいます:

私は今日、このようなもので昨日たくさんの周りに苦労した。高度なGL関数を使用することができなかったので、opengl32.dllにデバッグして実際に動作し、ハードウェア固有のOpenGL
DLL(nvoglnt.dll)に呼び出しをラップします。だから別の原因があったに違いない。
ChoosePixelFormatと他の関数が互いに上書きされるので、インターネットには、他のすべてのライブラリの前にopengl32.libにリンクするヒントもありました。

しかしそれも原因ではありませんでした。私のソリューションは、ここで加速されたビジュアルを有効にすることでした。

// init SDL
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_TIMER) < 0) {       
    fprintf(stderr, "Could not init SDL");
    return 1;
}

// we must wish our OpenGL Version!!
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

現在のSDLリビジョン(2011年12月15日)では、SDL_windowsopengl.cでチェックします

if (_this->gl_config.accelerated >= 0) {
       *iAttr++ = WGL_ACCELERATION_ARB;
        *iAttr++ = (_this->gl_config.accelerated ? WGL_FULL_ACCELERATION_ARB :
                                                   WGL_NO_ACCELERATION_ARB);
   }

この属性は、独自に定義していない場合は-1に初期化されます。

また、SDLを初期化する前にバージョン属性を決して設定しないでください。設定属性では、動画のバックエンドを正しく初期化する必要があります。

私はこれが役立つことを願っています

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です