OpenGL 3.x création de contexte à L'aide de SDL2 sur OSX (Macbook Air 2012)

autant que je sache, le Macbook Air 2012 supporte OpenGL 3.2. Cependant, lorsque SDL 2.0 est utilisé pour créer le contexte OpenGL, le contexte n'est que la version 2.1 d'opengl.

est-il possible pour SDL 2.0 de créer un contexte GL 3.2?

12
demandé sur Captain Head 2012-08-15 01:35:45

3 réponses

pour tous ceux qui ont encore ce problème à partir du mercredi 10 octobre, SDL2 vous permet de créer un contexte OpenGL 3.2 sur Macs exécutant Mac OS X 10.7 (Lion) et plus. Vous avez juste besoin d'ajouter ce 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);

si vous utilisez OS X 10.10, ou que la solution ci-dessus ne résout pas le problème, changez la deuxième ligne de l'exemple ci-dessus de

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);

peut travailler pour vous.

28
répondu David Greiner 2016-01-03 07:11:01

EDIT:https://stackoverflow.com/a/13095742/123387 -- SDL2 devrait soutenir ce mode natif maintenant. La note ci-dessous concerne les versions antérieures à la dernière version SDL2.

La version actuelle (à compter de Mercredi le 15 Août 21:00:33 2012 -0400; 6398: c294faf5fce5) ne supporte pas la série 10.7. Cependant, il y a un façon d'ajouter le support si vous êtes prêt à exécuter un SDL instable pour des coups de pied.

Donner un coup de cette:

src/vidéo/cacao/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;                                                      
}     

puis dans votre application, quelque chose dans ce sens.

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

Je cours 10.7.4 sous mon Mac Air de 2011 et quand je cours quelques GL diagnostics à partir d'une application SDL 3.2 enable I get:

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

je n'ai pas testé beaucoup en dehors de cela, mais j'espère que quelqu'un d'autre peut tentez le coup et ayez un peu plus de succès.

EDIT: si vous utilisez GLEW, vous voulez activer glewExperimental. Notez qu'il y a un bug dans le profil 3.2 core lorsque vous interrogez GL_EXTENSIONS. Il rapportera 1280 (comme si ce n'était pas soutenu) -- cependant cela ne devrait pas vous affecter de l'utilisation de 1.50 shaders et ainsi de suite.

1
répondu Justin Van Horne 2017-05-23 12:13:56

devrait être possible:

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


void checkSDLError(int line = -1)
{
#ifndef NDEBUG
    const char *error = SDL_GetError();
    if (*error != '')
    {
        printf("SDL Error: %s\n", error);
        if (line != -1)
            printf(" + line: %i\n", 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;
}
0
répondu genpfault 2012-08-14 21:44:06