web-dev-qa-db-fra.com

OpenGL 4.1 (?) Sous Mavericks

Je viens de mettre à niveau mon MacBook Pro vers Mavericks (MacOS 10.9), y compris Xcode…. Selon le «Tableau des capacités OpenGL» d’Apple, cette version prend en charge. "1.2" et mon shader GLSL 3.30, qui commence par "#version 330", refuse de charger, indiquant que la version N'est pas prise en charge.

Dois-je faire quelque chose à Mavericks pour activer le support 4.1?

22
user2507282

Lorsque vous demandez votre format de pixel à l'aide de l'une des API de niveau inférieur sous OS X, vous devez ajouter les éléments suivants à votre liste d'attributs pour pouvoir utiliser un profil principal:

CGL:

  kCGLPFAOpenGLProfile,     kCGLOGLPVersion_3_2_Core

NSOpenGL:

  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core

Désormais, alors que la constante particulière est nommée...3_2Core, il s'agit en fait de demander à un contexte qui supprime toutes les fonctionnalités obsolètes et prend en charge au moins OpenGL 3.2 (a core profile , in autres mots). Vous pouvez obtenir un contexte 4.1 ou 3.3 en utilisant cette même constante; En toute honnêteté, inclure un numéro de version réel dans la constante était probablement un mauvais choix.

Si vous ne spécifiez pas cela lorsque vous demandez votre format de pixel, OS X vous donnera respectivement kCGLOGLPVersion_Legacy et NSOpenGLProfileVersionLegacy. Et cela vous limitera à la fonctionnalité OpenGL 2.1.

Si vous utilisez une infrastructure de niveau supérieur, vous devez consulter la référence de votre API. Cependant, sachez que sous OS X, vous devez disposer d'un contexte core profile pour accéder aux éléments plus récents qu'OpenGL 2.1.

21
Andon M. Coleman

Utilisez la bibliothèque OpenGL GLFW la version la plus récente est la version 3.0.4 ... Juste après l’initialisation de glfw init

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

après avoir initialisé glfwInit () , incluez ces 4 lignes de code. ces quatre lignes de code vous permettront d'utiliser la version la plus récente prise en charge par votre système d'exploitation. sur mac son 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);

puis créez votre fenêtre.

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

vérifiez pour vous assurer qu'il a été créé.

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

puis faites-vous la fenêtre actuelle en utilisant ce qui suit.

glfwMakeContextCurrent(_Window);

après que vous en ayez fait votre fenêtre, il ne reste plus qu’à créer votre boucle principale.

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

assurez-vous d'inclure glfwPollEvents (); dans la boucle, cela permet d’utiliser le bouton de fermeture pour quitter la fenêtre. si vous avez des difficultés à compiler la bibliothèque en xcode, envoyez-moi un message et je vous enverrai une copie de la bibliothèque.

11
kanthonye

J'ai longtemps lutté pour cela et j'ai finalement réussi à utiliser n'importe quelle version de glsl supportée par la carte graphique. 

Il y a plusieurs points principaux:

  1. Utiliser CORE PROFILE
  2. Définissez MAJOR.MINOR sur la version de GL que vous souhaitez utiliser.
  3. Si ce n'est pas la dernière version de GL utilisée, vous devez activer FORAW COMPATIBILITY.

par exemple, comme l'a souligné @kanthonye, ​​si vous utilisez glfw et utilisez la version 3.2 de gl, ces lignes sont nécessaires:

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

Si vous utilisez LWJGL (à partir de la version 2.90), il y a un léger problème dans l'en-tête javadoc de ContextAttribs :

... Cette extension n'est pas prise en charge sous MacOS X. Toutefois, pour activer le contexte GL 3.2 sous MacOS X 10.7 ou plus récent, une instance de cette classe doit être transmise à LWJGL. La seule configuration valide est ContextAttribs (3, 2, CONTEXT_CORE_PROFILE_BIT_ARB), tout le reste sera ignoré.

1
Philip

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

le titre du site est "Ordinateurs Mac: Prise en charge d'OpenCL et OpenGL sous OS X Mavericks - Découvrez les versions d'OpenGL et OpenCL prises en charge par votre ordinateur sous OS X Mavericks."

1
klarheit

Si vous utilisez SDL en tant qu'API de haut niveau, vous devez effectuer un certain nombre de choses pour obtenir la prise en charge de la version 4.1.

Tout d’abord, assurez-vous d’avoir SDL2 2.0.1 (ou plus tard, je suppose). Par exemple en utilisant de la bière:

mise à jour de la bière mise à niveau de brassage sdl2

Deuxièmement, vous devez spécifiquement indiquer à SDL de demander un profil de base tel que

SDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

Troisièmement, la façon dont un profil de base est demandé sur le Mac nécessite que vous demandiez à 3.2 d'obtenir 4.1 (!). Je pense que cela a été corrigé dans le référentiel SDL2 mais pas encore publié.

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

0
Martin