2012-08-14 7 views

Odpowiedz

27

Dla wszystkich, którzy nadal mają ten problem od 10 października, SDL2 pozwala utworzyć kontekst OpenGL 3.2 na komputerach Mac z systemem Mac OS X 10.7 (Lion) i wyższym. Wystarczy dodać ten kod:

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

Jeśli używasz OS X 10.10 lub rozwiązanie powyżej nadal nie rozwiązuje problemu, zmieniając drugą linię powyższym przykładzie z

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 

do

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); 

może pracować dla Ciebie.

+0

Dziękuję za tę magiczną inkantację! –

0

To should be 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 != '\0') 
    { 
     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

Należy zauważyć, że wymagałoby to specjalnej obsługi w SDL, ponieważ interfejs API tworzenia kontekstów MacOSX jest inny dla wersji 3.2 i 2.1. –

+0

Ach tak, widziałem również ten samouczek. Używanie tego dokładnego kodu nadal tworzy kontekst OpenGL 2.1 w powietrzu z OSX Mountain Lion.Na kilku komputerach Windows, które mam (z kartami Nvidia i ATI) tworzy to kontekst z najwyższą obsługiwaną wersją (na przykład 3.3). –

+0

@NicolBolas To jest to, o czym się zastanawiam w tej chwili .... To może być po prostu wada obecnej wersji SDL. –

1

EDIT: Zobacz https://stackoverflow.com/a/13095742/123387 - SDL2 powinny wspierać ten natywnie teraz. Poniższa uwaga dotyczy wersji przed najnowszą wersją SDL2.

Aktualna wersja (od Wed Aug 15 21:00:33 2012 -0400; 6398: c294faf5fce5) nie obsługuje serię 10.7. Istnieje jednak sposób na dodanie wsparcia, jeśli chcesz uruchomić niestabilną listę SDL dla kopnięć.

Daj ten strzał:

src/wideo/kakao/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;              
}  

Następnie w aplikacji, coś wzdłuż tych linii.

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

Używam 10.7.4 pod moim Mac Air z 2011 roku, a po uruchomieniu kilku GL diagnostykę z 3,2 SDL włączyć aplikację uzyskać:

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

nie testowałem wiele poza tym, ale miejmy nadzieję, że ktoś inny może go zaatakować i odnieść jeszcze większy sukces.

EDYCJA: Jeśli używasz GLEW, będziesz chciał włączyć glewExperimental. Należy zauważyć, że występuje błąd w profilu podstawowym w wersji 3.2, gdy zapytanie GL_EXTENSIONS. Będzie raportował 1280 (tak jakby nie był obsługiwany przez ) - nie powinno to jednak wpłynąć na użycie 1.50 shaderów i tak dalej.

+0

Powinno to być przyjemne, przynajmniej tymczasowo. –

+0

Patrz komentarz Davida Greinera. –

Powiązane problemy