10

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

#include <glew.h>
#include <SDL.h>    

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)実際には何もしません。その場合、適切なコンテキストを作成する方法やデフォルトのコンテキストを変更する方法がわかりません。)

EDIT: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 までの完全な互換性があると報告しています。

どんな助けでも大歓迎です。

更新: SDL が 3.x コンテキストをサポートしていないと怒鳴るのを止めることができました。問題は、SDL_GL_SetAttribute設定する必要があることBEFORE SDL_Initが呼び出されることでした:

//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 のみが true を返します)。glGetString(GL_VERSION)1.1.0 も報告します。私のプログラムは、あたかもそれらがまったくインストールされていないかのように、単に新しいバージョンを認識していないようです。

4

2 に答える 2

14

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

私は今日と昨日、このことでたくさん苦労しました。高度な 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 を初期化する前にバージョン属性を設定しないでください。設定属性はビデオ バックエンドを適切に初期化する必要があるためです!

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

于 2011-12-15T08:48:58.433 に答える
3

このチュートリアルに従いました。windowz と Linux ではすべて正常に動作します。 http://people.cs.uct.ac.za/~aflower/tutorials.html

于 2011-11-14T04:04:43.260 に答える