it-swarm.com.de

OpenGL 4.1 (?) Unter Mavericks

Ich habe gerade mein MacBook Pro auf Mavericks (MacOS 10.9) aktualisiert, einschließlich Xcode. Laut Apples "OpenGL Capabilities Table" unterstützt diese Version Für OpenGL 4.1, jedoch einen Aufruf von glGetString (GL_VERSION) gibt "1.2" zurück und mein GLSL 3.30-Shader, der mit "#version 330" beginnt, weigert sich zu laden. Die Version Wird nicht unterstützt.

Muss ich etwas mit Mavericks tun, um die Unterstützung für 4.1 zu aktivieren?

22
user2507282

Wenn Sie Ihr Pixelformat unter Verwendung einer der untergeordneten APIs unter OS X anfordern, müssen Sie der Attributliste Folgendes hinzufügen, um ein Kernprofil verwenden zu können:

CGL:

  kCGLPFAOpenGLProfile,     kCGLOGLPVersion_3_2_Core

NSOpenGL:

  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core

Nun, während die bestimmte Konstante ... 3_2Core heißt, fordert sie eigentlich einen Kontext an, der alle veralteten Features entfernt und mindestens OpenGL 3.2 unterstützt (ein Kernprofil , mit anderen Worten). Sie können einen 4.1- oder 3.3-Kontext erhalten, wenn Sie dieselbe Konstante verwenden. Ehrlich gesagt war die Angabe einer tatsächlichen Versionsnummer in der Konstanten wahrscheinlich eine schlechte Wahl.

Wenn Sie dies nicht angeben, wenn Sie Ihr Pixelformat anfordern, erhalten Sie von OS X jeweils kCGLOGLPVersion_Legacy oder NSOpenGLProfileVersionLegacy. Dies beschränkt Sie auf die OpenGL 2.1-Funktionalität.

Wenn Sie ein Framework auf höherer Ebene verwenden, müssen Sie Ihre API-Referenz konsultieren. Beachten Sie jedoch, dass Sie unter OS X über einen Core - Profilkontext verfügen müssen, um auf neuere als OpenGL 2.1 zugreifen zu können.

21

Verwenden Sie die OpenGL-Bibliothek GLFW. Die neueste Version ist 3.0.4 ... , Nachdem Sie glfw init initialisiert haben

if (!glfwInit())
{
    printf("glfwInit() fail to initualize. \n");
    glfwTerminate();
    exit(-1);
}

nachdem Sie glfwInit () initialisiert haben, fügen Sie diese 4 Codezeilen ein. Diese vier Codezeilen ermöglichen es Ihnen, die höchste von Ihrem Betriebssystem unterstützte Version zu verwenden. auf mac sein opengl 4.1

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);

dann erstelle dein Fenster.

_Window = glfwCreateWindow(width, height, title, 0, 0);

vergewissern Sie sich, dass es erstellt wurde.

if (!_Window) {
    printf("Display window fail to create. \n");
    glfwTerminate();
    exit(-1);
}

dann machen Sie es zu Ihrem aktuellen Fenster, indem Sie Folgendes verwenden.

glfwMakeContextCurrent(_Window);

nachdem Sie es zu Ihrem kurierenden Fenster gemacht haben, müssen Sie nur noch Ihre Hauptschleife erstellen.

while (!glfwWindowShouldClose(_Window))
{
    ........
    glfwSwapBuffers(_Window);
    glfwPollEvents();
}

stellen Sie sicher, dass Sie glfwPollEvents () angeben. In der Schleife ist dies möglich, um das Fenster zu schließen. Wenn Sie Probleme beim Kompilieren der Bibliothek in xcode haben, schreiben Sie mir einfach eine Nachricht und ich schicke Ihnen eine Kopie der Bibliothek.

11
kanthonye

Ich hatte lange Probleme damit und es gelang mir schließlich, jede von der Grafikkarte unterstützte Version von GLSL zu verwenden. 

Es gibt mehrere Hauptpunkte:

  1. Verwenden Sie CORE PROFILE
  2. Stellen Sie MAJOR.MINOR auf die Version von GL ein, die Sie verwenden möchten
  3. Wenn nicht die neueste Version von GL verwendet wird, müssen Sie FORWARD COMPATIBILITY aktivieren.

wenn Sie beispielsweise, wie von @kanthonye ausgeführt, glfw verwenden und gl Version 3.2 verwenden, werden folgende Zeilen benötigt:

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
2
squid

Wenn Sie LWJGL (ab Version 2.90) verwenden, befindet sich in dem Javadoc-Header von ContextAttribs eine leichte Änderung:

... Diese Erweiterung wird unter MacOS X nicht unterstützt. Um den Kontext GL 3.2 unter MacOS X 10.7 oder neuer zu aktivieren, muss eine Instanz dieser Klasse an LWJGL übergeben werden. Die einzig gültige Konfiguration ist ContextAttribs (3, 2, CONTEXT_CORE_PROFILE_BIT_ARB), alles andere wird ignoriert.

1
Philip

http://support.Apple.com/kb/HT5942

der Site-Titel lautet "Mac-Computer: OpenCL- und OpenGL-Unterstützung in OS X Mavericks - Erfahren Sie mehr über die OpenGL- und OpenCL-Versionen, die von Ihrem Computer in OS X Mavericks unterstützt werden."

1
klarheit

Wenn Sie SDL als API auf hoher Ebene verwenden, müssen Sie einige Schritte unternehmen, um die Unterstützung für 4.1 zu erhalten.

Stellen Sie zunächst sicher, dass Sie über SDL2 2.0.1 verfügen (oder später, denke ich). Zum Beispiel mit Brew:

brüh-Update Brüh-Upgrade sdl2

Zweitens müssen Sie SDL ausdrücklich anweisen, ein Kernprofil so anzufordern

SDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

Drittens müssen Sie bei einer Frage, wie ein Kernprofil auf dem Mac angefordert wird, 3.2 anfordern, um 4.1 (!) Zu erhalten. Ich denke, dass dies im SDL2-Repository behoben wurde, aber noch nicht veröffentlicht wurde.

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

0
Martin