Создание контекста OpenGL 3.x с использованием SDL2 на OSX (Macbook Air 2012)

Насколько мне известно, Macbook Air 2012 поддерживает OpenGL 3.2. Однако при использовании SDL 2.0 для создания контекста OpenGL контекст является только версией версии 2.1.

Возможно ли, чтобы SDL 2.0 создал контекст GL 3.2?

Ответ 1

Для всех, кто до сих пор сталкивается с этой проблемой по состоянию на среду, 10 октября, SDL2 позволяет создавать контекст OpenGL 3.2 на компьютерах Mac OS X 10.7 (Lion) и выше. Вам просто нужно добавить этот код:

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

Если вы используете OS X 10.10, или решение выше все еще не решает проблему, изменив вторую строку вышеприведенного примера с

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

к

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);

может работать для вас.

Ответ 2

EDIT: см. fooobar.com/questions/482011/... - SDL2 теперь должен поддерживать это. Примечание ниже для версий до последней версии SDL2.

Текущая версия (с понедельника 15 августа 21:00:33 2012 -0400; 6398: c294faf5fce5) не поддерживает серии 10.7. Однако существует способ добавить поддержку, если вы готовы запустить нестабильный SDL для ударов.

Сделайте снимок:

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;                                                      
}     

Затем в вашем приложении что-то вроде этих строк.

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

Я запускаю 10.7.4 под моим Mac Air с 2011 года, и когда я запускаю несколько GL диагностика из приложения 3.2 SDL enable я получаю:

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

Я не много тестировал за пределами этого, но, надеюсь, кто-то еще может дать ему удар и иметь немного больше успеха.

EDIT: если вы используете GLEW, вам нужно включить glewExperimental. Обратите внимание, что при запросе запроса есть ошибка в 3.2-жильном профиле GL_EXTENSIONS. Он сообщит 1280 (как будто это не было поддерживается) - однако это не должно влиять на использование 1.50 шейдеров и т.д.

Ответ 3

Чтобы было возможно:

#include <stdio.h>
#include <stdlib.h>
/* If using gl3.h */
/* Ensure we are using opengl 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: %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
}


/* Our program 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 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 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;
}