web-dev-qa-db-fra.com

Mac Mojave + opengl

Mac OS 10.14 Mojave vient de sortir et, depuis juin, nous savions qu'OpenGL était obsolète dans le système d'exploitation. "Les applications OpenGL continueront de fonctionner, mais vous devriez passer à Metal", pour paraphraser . Cependant, il ne semble pas exister de documentation indiquant si vous pouvez toujours compiler avec OpenGL ou si Apple empêche cela ou omet les bibliothèques de développement appropriées. Je développe actuellement un programme graphique basé sur OpenGL et je ne peux pas risquer une mise à jour si la compilation ne fonctionne plus. Quelqu'un at-il testé cela?

EDIT: Quelqu'un d'autre partage-t-il l'expérience d'Esenthel?

10
synchronizer

Je peux compiler, mais après la mise à jour vers les dernières versions de Mojave et Xcode, mes applications OpenGL ne fonctionnent tout simplement pas.

Dans un cas, je reçois un blocage lors d’un appel système GL, dans un autre cas, un écran noir . Quelques erreurs dans la sortie sont identiques à celles d’ici: https://stackoverflow.com/questions/52507950/Impossible de charger info-pliste-erreur-xcode-10-sous-macos-10-14-mojave # =

Je vous recommande de ne pas mettre à jour.

Je pense qu'il y a quelque chose de cassé dans les bibliothèques Xcode 10 OpenGL.

Edit: Il semble que les mises à jour ultérieures de Mac OS et Xcode aient résolu les problèmes.

7
Esenthel

GLFW contourner. Semblable à d'autres réponses, mais vous n'avez pas besoin de redimensionner votre fenêtre dans la boucle de dessin, appelez d'abord glfwPollEvents().

window = glfwCreateWindow(width-1, height, "Hello World", NULL, NULL);
glfwPollEvents();
glfwSetWindowSize(window, width, height);

De plus, glfwHideWindow() alors glfwShowWindow() semble fonctionner. De même, glfwSetWindowPos() est une alternative. Bien que définir la taille de la fenêtre semble plus rapide que masquer/afficher la fenêtre, je ne souhaite pas déplacer la position de la fenêtre.

3
Daniel Schwartz

Le code à

http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp

fonctionne bien dans Mojave avec Xcode 10.0. La fenêtre est redimensionnée automatiquement pour se débarrasser du noir. Les frameworks OpenGL et GLUT sont ajoutés au projet à l’endroit habituel,/System/Library/Frameworks

Chris

2

OpenGL dans Mojave à compter d’aujourd’hui (21 octobre 2018) est en panne. Vous devez déplacer la position de la fenêtre glfw afin de voir le rendu.

Ce code de contournement à l’intérieur de la boucle de rendu a fonctionné pour moi: if(!init) { int x,y; glfwGetWindowPos(window,&x, &y); glfwSetWindowPos(window,x+1,y);
init = true; }

1
Raydelto Hernandez

J'utilise GLUT et OpenGL . Le problème est présent à la fois sur Xcode 10.0 et 10.1 beta3.

Si vous redimensionnez la fenêtre, les graphiques apparaissent la plupart du temps.

J'ai donc conçu une solution de contournement utilisant la fonction de rappel de remodelage. Disons que je voulais activer une fenêtre 1000x1000. Je l’active avec 999x999, puis sur Reshape, je le tourne en 1000x1000 selon les besoins:

void reshape (int width, int height){
    glutReshapeWindow (1000, 1000);
}

Et sur le principal:

int main (int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize( 999,999 );
    glutInitWindowPosition (0.0f, 0.0f);
    glutCreateWindow("example");

    glutReshapeFunc (reshape);
    glutDisplayFunc(draw);
    glutKeyboardFunc(keyboard);
    glutIdleFunc(idle);

    glutMainLoop();
    return 0;
}

Comme le rappel de remodelage est déclenché avant l’affichage, il fonctionne pour le moment.

1
PNeves

J'utilise GLEW, GLUT, OpenGL 2.0 et SDL 2. Je peux compiler et exécuter mon application OpenGL. Cependant, j'ai dû modifier mes chemins de recherche dans Framework afin d'inclure:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks

où les en-têtes OpenGL et GLUT framework + sont maintenant placés, je ne pouvais trouver aucun en-tête OpenGL/GLUT dans l'ancien chemin de recherche System/Library/Frameworks (bien que le framework fût toujours là, aucun en-tête n'était inclus). Je devais aussi m'assurer que mes inclus étaient GLUT/glut.h au lieu de simplement glut.h.

Cela me donne de nouveaux messages d'avertissement sous la forme de:

[défaut] Impossible de charger les exceptions Info.plist (eGPUOverrides) "et" le paramètre d'annulation d'activation du bruit enregistré est identique au paramètre par défaut (= 1)

Je ne les ai pas encore vérifiées et quelles sont leurs implications. 

Ce qui me dérange vraiment, c'est ce que dit Esenthel, à savoir qu'il n'y a qu'un écran noir après la compilation et l'exécution de l'application. J'ai trouvé que si vous faites glisser la fenêtre de l'application (je n'utilise pas le plein écran), l'animation commence à s'afficher. Apparemment, l'animation est à l'arrière-plan et tout le code est en cours d'évaluation, mais il n'y a qu'un écran noir jusqu'à ce que je fasse glisser la fenêtre.

EDIT: J'utilise Mojave et Xcode 10 (pas beta).

1
Marcus Åkerman

Je suis également tombé sur cela après la mise à jour. J'utilise glfw. En fait, la fenêtre créée peut afficher le contenu souhaité après le redimensionner ou le déplacer. J'ai ajouté glfwSetWindowPos(window, 100, 100); dans la boucle principale pour le déplacer pour une solution temporaire.

0
Qian_Lin

"Corrigé" ceci en téléchargeant Xcode 9.4.1

Compilé dedans, mon application avec vue OpenGL a fonctionné comme il se doit.

Je pense que c'est quelque chose avec Layer-Backed Views . Parce que lorsque je fais défiler ma vue OpenGL, elle est devenue visible sous certaines vues .. Et je vois que c'est correctement tiré derrière. Mais quand j'arrête de faire défiler - il disparaît. 

0
KAMIKAZE

Ma solution de contournement dans GLFW consiste à appeler la fenêtre d’affichage dans la boucle principale.

 bool needDraw = true;
    if (needDraw) {
        glfwShowWindow(window);
        glfwHideWindow(window);
        glfwShowWindow(window);
        needDraw = false;
    }
0
Nientai Ho

Certains codes OpenGL ont échoué car, dans Mojave, votre vue est automatiquement sauvegardée sur plusieurs couches. Si votre code teste cette condition:

[NSGraphicsContext currentContextDrawingToScreen]

Il retournera NON et le code dans cette condition ne fonctionnera pas (c'est-à-dire: rien dessiné à l'écran).

Malheureusement, vous ne pouvez pas non plus définir WantsLayer sur NO dans Mojave, cela ne fonctionnera pas.

0
Kuro

Dans certains cas, déplacer la coordonnée de la fenêtre de +1 ne fonctionne pas . Dans ce cas, nous continuons de faire glisser la fenêtre par programmation jusqu'à ce qu'elle soit rendue, puis nous arrêtons l'écran en appuyant sur le clavier. Ajoutez-le dans la boucle du jeu après avoir échangé des tampons.

    if (glfwGetKey( window, GLFW_KEY_Q ) == GLFW_RELEASE && !mac_moved){
        int x, y;
        glfwGetWindowPos(window, &x, &y);
        glfwSetWindowPos(window, ++x, y);
    } else {
        mac_moved = true;
    }

Définissez mac_moved en tant que variable statique quelque part sur le dessus.

static bool mac_moved = false;
0
Argha Chakraborty