OpenGL 3.x context creation using SDL2 on OSX (Macbook Air 2012)

As far as I'm aware, the Macbook Air 2012 supports OpenGL 3.2. When using SDL 2.0 to create the OpenGL context, however, the context is only opengl version 2.1.

Is it possible for SDL 2.0 to create a GL 3.2 context?


For everyone who still has this problem as of Wednesday, Oct 10th, SDL2 allows you to create an OpenGL 3.2 context on Macs running Mac OS X 10.7 (Lion) and up. You just need to add this code:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

If you're running OS X 10.10, or the solution above still does not resolve the problem, changing the second line of the above example from

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

to

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);

may work for you.


EDIT: See https://stackoverflow.com/a/13095742/123387 -- SDL2 should support this natively now. The note below is for versions before the latest SDL2 release.

The current version (as of Wed Aug 15 21:00:33 2012 -0400; 6398:c294faf5fce5) does not support 10.7 series. However, there is a way to add support if you're willing to run an unstable SDL for kicks.

Give this a shot:

src/video/cocoa/SDL_cocoaopengl.m +90 (Cocoa_GL_CreateContext)

if(_this->gl_config.major_version == 3 &&                                                           
   _this->gl_config.minor_version == 2)                                                             
{                                                                                                   
    attr[i++] = NSOpenGLPFAOpenGLProfile;                                                           
    attr[i++] = NSOpenGLProfileVersion3_2Core;                                                      
}     

Then in your application, something along these lines.

SDL_Init(SDL_INIT_EVERYTHING);                                                                                                                                    

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);                                               
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);                                               

window = SDL_CreateWindow("3.2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,                
                640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);                                                                                               

context = SDL_GL_CreateContext(window);    

I am running 10.7.4 under my Mac Air from 2011 and when I run a few GL diagnostics from a 3.2 SDL enable application I get:

Driver     : cocoa
Renderer   : Intel HD Graphics 3000 OpenGL Engine
Vendor     : Intel Inc.
Version    : 3.2 INTEL-7.18.18
GLSL       : 1.50

I haven't tested much outside of this, but hopefully someone else can give it a stab and have a bit more success.

EDIT: If you're using GLEW you will want to enable glewExperimental. Note that there is a bug in the 3.2 core profile when you query GL_EXTENSIONS. It will report 1280 (as if it wasn't supported)--however that shouldn't impact you from using 1.50 shaders and so on.


这应该是可能的:

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

#include <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: %sn", msg, SDL_GetError());
    SDL_Quit();
    exit(1);
}


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


/* 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);

    /* Clear our buffer with a red background */
    glClearColor ( 1.0, 0.0, 0.0, 1.0 );
    glClear ( GL_COLOR_BUFFER_BIT );
    /* Swap our back buffer to the front */
    SDL_GL_SwapWindow(mainwindow);
    /* Wait 2 seconds */
    SDL_Delay(2000);

    /* Same as above, but green */
    glClearColor ( 0.0, 1.0, 0.0, 1.0 );
    glClear ( GL_COLOR_BUFFER_BIT );
    SDL_GL_SwapWindow(mainwindow);
    SDL_Delay(2000);

    /* Same as above, but blue */
    glClearColor ( 0.0, 0.0, 1.0, 1.0 );
    glClear ( GL_COLOR_BUFFER_BIT );
    SDL_GL_SwapWindow(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;
}
链接地址: http://www.djcxy.com/p/38450.html

上一篇: 白色纹理与SDL 1.3和OpenGL ES 1.1

下一篇: 在OSX上使用SDL2创建OpenGL 3.x上下文(Macbook Air 2012)