C ++ + SDL + OpenGL 3.3在Mac OS X上不起作用?

时间:2013-08-10 15:36:38

标签: c++ macos opengl sdl osx-mountain-lion

我开始开发OpenGL 3(我习惯于1,所以这是一个很大的变化),我正在使用SDL作为我的窗口/图像/声音/事件框架。我有以下代码(取自opengl.org并稍加修改):

#include <stdio.h>
#include <stdlib.h>
/* If using gl3.h */
/* Ensure we are using opengl's core profile only */
#define GL3_PROTOTYPES 1
#include <OpenGL/gl3.h>

#include <SDL2/SDL.h>
#define PROGRAM_NAME "Tutorial1"

/* A simple function that prints a message, the error code returned by SDL,
 * and quits the application */
void sdldie(const char *msg)
{
    printf("%s: %s\n", msg, SDL_GetError());
    SDL_Quit();
    exit(1);
}


void checkSDLError(int line = -1)
{
#ifndef NDEBUG
    const char *error = SDL_GetError();
    if (*error != '\0')
    {
        printf("SDL Error: %s\n", error);
        if (line != -1)
            printf(" + line: %i\n", line);
        SDL_ClearError();
    }
#endif
}

void render(SDL_Window* win){
    glClearColor(1.0,0.0,0.0,1.0);
    glClear ( GL_COLOR_BUFFER_BIT );
    SDL_GL_SwapWindow(win);
}


/* Our program's entry point */
int main(int argc, char *argv[])
{
    SDL_Window *mainwindow; /* Our window handle */
    SDL_GLContext maincontext; /* Our opengl context handle */

    if (SDL_Init(SDL_INIT_VIDEO) < 0) /* Initialize SDL's Video subsystem */
    sdldie("Unable to initialize SDL"); /* Or die on error */

    /* Request opengl 3.2 context.
     * SDL doesn't have the ability to choose which profile at this time of writing,
     * but it should default to the core profile */
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    /* Turn on double buffering with a 24bit Z buffer.
     * 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 our window centered at 512x512 resolution */
    mainwindow = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                              512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
    if (!mainwindow) /* Die if creation failed */
        sdldie("Unable to create window");

    checkSDLError(__LINE__);

    /* Create our opengl context and attach it to our window */
    maincontext = SDL_GL_CreateContext(mainwindow);
    checkSDLError(__LINE__);


    /* This makes our buffer swap syncronized with the monitor's vertical refresh */
    SDL_GL_SetSwapInterval(1);

    render(mainwindow);
    SDL_Delay(2000);

    /* Delete our opengl context, destroy our window, and shutdown SDL */
    SDL_GL_DeleteContext(maincontext);
    SDL_DestroyWindow(mainwindow);
    SDL_Quit();

    return 0;
}

这很有效。但如果我改变这一行:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

对此:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);

因此它使用OpenGL 3.3而不是3.2,我在每个OpenGL调用上都会出现EXC_BAD_ACCES错误。我确实想使用OpenGL 3.3。我的电脑: MacBook Pro视网膜2012年末 Mac OS X Mountain Lion 英特尔i7 2.7 GHz 英特尔HD 4000 NVidia GeForce G

任何人都知道这是OS X错误,SDL错误或我的代码有问题吗? (我知道SDL代码可能不是最好的,但最初是SDL 1.2代码)

2 个答案:

答案 0 :(得分:9)

因为OSX只有opengl capabilities最多3.2。

如果你SDL_GetError,它会告诉你出了什么问题。

编辑:OSX Mavericks(10.9)现在支持4.1。

答案 1 :(得分:1)

OpenGL 3.3和+目前在OSX上不可用。

然而OpenGL 4.1将在最新的OSX 10.9 Mavericks上提供......敬请关注:)