2013-09-11 3 views
0

J'essaie d'exécuter un simple programme OpenGL en utilisant GLFW (version 3.0.2) et GLEW (version 1.10.0) en XCode (version 4.6.3) sur OS X 10.8.4. Le code entier est montré ci-dessous.Plantage de GLEW dans XCode

#include <GLFW/glfw3.h> 
#include <OpenGL/OpenGL.h> 
#include <iostream> 
using namespace std; 

void RenderScene() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
} 

void InitGL() 
{ 
    glClearColor(1, 0, 0, 1); 
} 

void ErrorFunc(int code, const char *msg) 
{ 
    cerr << "Error " << code << ": " << msg << endl; 
} 

int main(void) 
{ 
    GLFWwindow* window; 

    /* Report errors */ 
    glfwSetErrorCallback(ErrorFunc); 

    /* Initialize the library */ 
    if (!glfwInit()) 
     return -1; 

    /* Window hints */ 
    glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 2); 
    glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint (GLFW_OPENGL_PROFILE,  GLFW_OPENGL_CORE_PROFILE); 

    /* Create a windowed mode window and its OpenGL context */ 
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     return -1; 
    } 

    /* Make the window's context current */ 
    glfwMakeContextCurrent(window); 

    /* Initialize OpenGL */ 
    InitGL(); 

    /* Loop until the user closes the window */ 
    while (!glfwWindowShouldClose(window)) 
    { 
     /* Render here */ 
     RenderScene(); 

     /* Swap front and back buffers */ 
     glfwSwapBuffers(window); 

     /* Poll for and process events */ 
     glfwPollEvents(); 
    } 

    glfwTerminate(); 
    return 0; 
} 

La plupart de ces informations proviennent directement de la documentation de GLFW; Seules la fonction de rendu et l'initialisation GLEW sont à moi. J'ai ajouté des frameworks pour OpenGL, Cocoa et IOKit et je les ai liés à libGLEW.a et libglfw3.a. Le programme se compile avec succès mais semble se bloquer quand il tente d'exécuter des fonctions dont GLEW était censé s'occuper. Ici, le programme se bloque sur glClearBufferfv. Si je commente cela, je reçois une fenêtre avec un fond noir. Je suppose que GLEW ne fonctionne secrètement pas, car il ne signale aucune erreur, mais ne semble pas faire son travail du tout.

Le message d'erreur exact XCode me renvoie error: address doesn't contain a section that points to a section in a object file avec un code d'erreur de EXC_BAD_ACCESS. Si je remplace glClearBufferfv par glClearColor le programme ne plante pas, mais a toujours un arrière-plan noir alors qu'il devrait être rouge. Lors de la requête, OpenGL renvoie la chaîne de version 2.1 NVIDIA-8.12.47 310.40.00.05f01, ce qui explique pourquoi les appels aux fonctions les plus récentes ne fonctionnent pas, mais GLEW ne devrait pas avoir configuré le bon contexte OpenGL. De plus, la documentation de GLFW indique qu'ils créent des contextes OpenGL 3+ depuis GLFW 2.7.2. Je ne sais vraiment pas quoi faire.

+0

Sans GLEW, XCode se plaint que 'glClearBufferfv' n'est pas défini. Si j'utilise 'glClearColor' à la place, il s'exécute mais me donne toujours du noir quelle que soit la couleur que je spécifie. –

+0

La définition forcée de la version souhaitée d'OpenGL avec 'glfwWindowHint' ne semble pas fonctionner non plus. Il se bloque pour toute version au-dessus de 2.1 ... –

+0

GLEW ne crée pas de contexte OpenGL; il s'appuie sur l'application pour en avoir créé un avant de s'en aller chercher toutes ses fonctions. Dans votre cas, je pense que GLFW créera le contexte OpenGL. – radical7

Répondre

3

glClearBuffer (...) est une fonction OpenGL 3.0, elle n'est pas implémentée dans toutes les versions d'OS X (certaines implémentent uniquement OpenGL 2.1). Parce que OS X n'utilise pas les extensions runtime, GLEW ne va pas résoudre ce problème pour vous.

Vous devrez recourir à la méthode traditionnelle pour effacer les tampons dans les anciennes versions de OS X (10.6 ou plus). Cela signifie que vous devez définir la "couleur claire" et effacer le tampon de couleur en deux étapes. Au lieu d'un seul appel de fonction qui peut effacer un tampon spécifique à une valeur spécifique, utilisez ceci:

#define USE_GL3  // This code requires OpenGL 3.0, comment out if unavailable 

void RenderScene() 
{ 
    GLfloat color[] = {1.0f, 0.0f, 0.0f}; 

#ifdef USE_GL3  // Any system that implements OpenGL 3.0+ 
    glClearBufferfv (GL_COLOR, 0, color); 
#else    // Any other system 
    glClearColor (color [0], color [1], color [2]); 
    glClear   (GL_COLOR_BUFFER_BIT); 
#endif 
} 

Ceci est cependant pas idéale,. Il ne sert à rien de définir la couleur claire plusieurs fois. Vous devez définir la couleur claire une fois lors de l'initialisation de l'application et remplacer la branche ! USE_GL3 du code avec glClear (GL_COLOR_BUFFER_BIT);


maintenant, parce que vous avez mentionné que vous utilisez Mac OS X 10.8, vous pouvez ignorer beaucoup de ce que J'ai écrit ci-dessus. OS X 10.8 implémente OpenGL 3.2 si vous faites les choses correctement.

Vous avez besoin de deux choses pour glClearBuffer (...) travailler sur OS X:

  1. Mac OS X 10.7+ (que vous avez)
  2. Tell glfw pour créer un contexte de base OpenGL 3,2

Avant de créer votre fenêtre dans GLFW, ajoutez le code suivant:

glfwWindowHint (GLFW_OPENGL_VERSION_MAJOR, 3); 
glfwWindowHint (GLFW_OPENGL_VERSION_MINOR, 2); 
glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
glfwWindowHint (GLFW_OPENGL_PROFILE,  GLFW_OPENGL_CORE_PROFILE); 

Une fois que vous avez un contexte de base OpenGL 3.2, vous pouvez également éliminer toute la branche du pré-processeur ! USE_GL3 de votre code. Cette disposition permettait à votre code de fonctionner sur les implémentations OS X ne prenant pas en charge OpenGL 3.2.

+0

Lorsque je définis ces paramètres, la création de la fenêtre échoue avec l'erreur '65544: La récupération du point d'entrée est interrompue'. La seule chose que j'ai réussi à découvrir à propos de cette erreur, c'est que cela signifie que l'appel de 'glfwGetProcAddress (" glGetStringi ")' a échoué. –

+0

@JonathanPeck: Mise à jour de ma réponse pour inclure le bit de compatibilité directe. Essayez la nouvelle série d'astuces et voyez si elles corrigent votre problème. –

+0

Même erreur: 'la récupération du point d'entrée est cassée'. Sans ces conseils, j'ai un contexte 2.1 entièrement fonctionnel, mais mon système est supposé pouvoir aller jusqu'à 3.2. –

0

GLEW ne fonctionne pas vraiment sur mac sauf si vous activez l'option expérimentale. Activez-le après avoir réglé tous vos trucs dans GLFW.

glewExperimental = GL_TRUE; 

Edit:

Et vous définissez également utiliser OpenGL de base avec

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); 
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); 

légèrement différent du vôtre.

+0

Cela me permet d'appeler des fonctions comme 'glClearBuffer' sans que tout se bloque, mais il me reste un contexte OpenGL 2.1. –

+0

Je n'ai pas le temps maintenant, alors j'ai juste copié un simple exemple de code que j'avais auparavant. Je verrai si je peux faire quelque chose plus tard, mais voilà. http://pastebin.com/9JvCVbxH – TheAmateurProgrammer