私の知る限り、Macbook Air 2012 は OpenGL 3.2 をサポートしています。ただし、SDL 2.0 を使用して OpenGL コンテキストを作成する場合、コンテキストは OpenGL バージョン 2.1 のみです。
SDL 2.0 で GL 3.2 コンテキストを作成することはできますか?
10 月 10 日水曜日の時点でまだこの問題を抱えている方のために、SDL2 を使用すると、Mac OS X 10.7 (Lion) 以降を実行している Mac で OpenGL 3.2 コンテキストを作成できます。次のコードを追加するだけです。
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 を実行している場合、または上記の解決策でも問題が解決しない場合は、上記の例の 2 行目を次のように変更します。
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
に
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
あなたのために働くかもしれません。
編集: https : //stackoverflow.com/a/13095742/123387を参照してください-SDL2はこれをネイティブにサポートする必要があります。以下の注記は、最新の SDL2 リリースより前のバージョンに関するものです。
現在のバージョン (Wed Aug 15 21:00:33 2012 -0400; 6398:c294faf5fce5 の時点) は 10.7 シリーズをサポートしていません。ただし、キックのために不安定な SDL を実行したい場合は、サポートを追加する方法があります。
これを試してみてください:
src/video/cocoa/SDL_cocoaopengl.m +90 (ココア_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);
2011 年から Mac Air で 10.7.4 を実行しています。3.2 SDL 対応アプリケーションからいくつかの GL 診断を実行すると、次のようになります。
Driver : cocoa Renderer : Intel HD Graphics 3000 OpenGL Engine Vendor : Intel Inc. Version : 3.2 INTEL-7.18.18 GLSL : 1.50
これ以外はあまりテストしていませんが、他の誰かが試して、もう少し成功することを願っています.
編集: GLEW を使用している場合は、glewExperimental を有効にする必要があります。GL_EXTENSIONS を照会すると、3.2 コア プロファイルにバグがあることに注意してください。1280 と報告されますが (サポートされていないかのように)、1.50 シェーダーなどを使用しても影響はありません。
それは可能であるはずです:
#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;
}