7

新しいSDL2ベータ版とOpenGL3コンテキストを試していますが、奇妙な問題が発生しています。

main()関数でSDL初期化コードを実行すると、正常に機能しますが、このコードを別のinit_sdl()関数に入れたいと思います。

初期化コードを別のinit_sdl()関数に入れ、この関数をmain()から呼び出すと、背景色が描画されず、プログラムがシステムのすべてのリソースを大量に消費し始めます。

SDLが別の関数で初期化される実際の例を誰かに教えてもらえますか?見つからないようです...たぶんこれは不可能ですか?SDL 1.2でも同様の問題があったことをぼんやりと覚えていると思いますが、それを使ってから数年が経ち、解決策が見つからなかったと思います。実際、これが私が代わりにSFMLの使用に切り替えることを選択した理由かもしれません。

より多くのプラットフォームで実行されるため、SFMLの代わりにSDL2を使用したいのですが、物事を小さな関数に分離できないことは、私にとって大きな問題です。これは簡単なはずです、私は何か明白なものを見逃していますか?

編集:

これは機能します:

#include <iostream>
#include <GL/glew.h>
#include <SDL.h>
#define PROGRAM_NAME "SDL2 OpenGL3 Example"

int main(int argc, char** argv)
{
    SDL_Window* sdl2_window = 0;
    SDL_GLContext opengl3_context;

    SDL_Init(SDL_INIT_VIDEO);

    // set the opengl context version
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    // turn on double buffering set the depth buffer to 24 bits
    // you may need to change this to 16 or 32 for your system
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    // create the sdl2 window
    sdl2_window = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED,
            SDL_WINDOWPOS_CENTERED, 512, 512,
            SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);

    // create the opengl3 context
    opengl3_context = SDL_GL_CreateContext(sdl2_window);

    GLenum status = glewInit();
    if (status != GLEW_OK)
    {
        std::cerr << "GLEW Error: " << glewGetErrorString(status) << "\n";
        exit(1);
    }

    // sync buffer swap with monitor's vertical refresh rate
    SDL_GL_SetSwapInterval(1);

    // set background color
    glClearColor( 1.0, 0.0, 0.0, 1.0 );

    while (true)
    {
        int status = 0;

        glClear( GL_COLOR_BUFFER_BIT );

        SDL_GL_SwapWindow(sdl2_window);

        SDL_Event event;

        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_KEYDOWN:
                break;
            case SDL_KEYUP:
                // if escape is pressed, quit
                if (event.key.keysym.sym == SDLK_ESCAPE)
                    status = 1; // set status to 1 to exit main loop
                break;
            case SDL_QUIT:
                status = 1;
                break;
            }
        }

        if (status == 1) // if received instruction to quit
            break;
    }

    // delete opengl3 context, destroy sdl2 window, and shut down sdl subsystems
    SDL_GL_DeleteContext(opengl3_context);
    SDL_DestroyWindow(sdl2_window);
    SDL_Quit();

    return 0;
}

これは機能しません:

#include <iostream>
#include <GL/glew.h>
#include <SDL.h>
#define PROGRAM_NAME "SDL2 OpenGL3 Example"

void init_sdl(SDL_Window* sdl2_window, SDL_GLContext& opengl3_context)
{
    SDL_Init(SDL_INIT_VIDEO);

    // set the opengl context version
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    // turn on double buffering set the depth buffer to 24 bits
    // you may need to change this to 16 or 32 for your system
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    // create the sdl2 window
    sdl2_window = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED,
            SDL_WINDOWPOS_CENTERED, 512, 512,
            SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);

    // create the opengl3 context
    opengl3_context = SDL_GL_CreateContext(sdl2_window);
}

int main(int argc, char** argv)
{
    SDL_Window* sdl2_window = 0;
    SDL_GLContext opengl3_context;

    init_sdl(sdl2_window, opengl3_context);

    GLenum status = glewInit();
    if (status != GLEW_OK)
    {
        std::cerr << "GLEW Error: " << glewGetErrorString(status) << "\n";
        exit(1);
    }

    // sync buffer swap with monitor's vertical refresh rate
    SDL_GL_SetSwapInterval(1);

    // set background color
    glClearColor( 1.0, 0.0, 0.0, 1.0 );

    while (true)
    {
        int status = 0;

        glClear( GL_COLOR_BUFFER_BIT );

        SDL_GL_SwapWindow(sdl2_window);

        SDL_Event event;

        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_KEYDOWN:
                break;
            case SDL_KEYUP:
                // if escape is pressed, quit
                if (event.key.keysym.sym == SDLK_ESCAPE)
                    status = 1; // set status to 1 to exit main loop
                break;
            case SDL_QUIT:
                status = 1;
                break;
            }
        }

        if (status == 1) // if received instruction to quit
            break;
    }

    // delete opengl3 context, destroy sdl2 window, and shut down sdl subsystems
    SDL_GL_DeleteContext(opengl3_context);
    SDL_DestroyWindow(sdl2_window);
    SDL_Quit();

    return 0;
}
4

2 に答える 2

3
void init_sdl(SDL_Window* sdl2_window, SDL_GLContext& opengl3_context)

最初の引数も参照にする必要があります。そうでなければ、あなたが戻ったときmain() sdl2_windowはまだゼロです。

于 2012-12-11T18:50:22.987 に答える
0

コンテキストに問題がないことを確認しますか?

int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_SHOWN;
win = SDL_CreateWindow("3Doodle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1024, 768, flags);
SDL_assert(win != NULL);

context = SDL_GL_CreateContext(win);
SDL_assert(context != NULL);
于 2014-01-11T00:44:52.290 に答える