Logo
OpenGL / MacOS / Xcode / Tutorial / Español

Tutorial: Como configurar Xcode para desarrollar con OpenGL utilizando GLFW y GLEW en Apple Silicon (M1)

February 25, 20236 min read
OpenGL Logo
Imagen obtenida del canal de YouTube The Cherno

Hola! Si estas aquí es porque necesitas instalar OpenGL con las librerías glew y glfw en una Mac con procesador Apple Silicon (ARM).

Cabe aclarar que este tutorial como lo indica el titulo, va a estar enfocado en configurarlo en el IDE Xcode aunque también es posible configurar este espacio en otros IDEs o editores de codigo como Visual Studio Code, pero este tutorial será configurandolo en Xcode porque al final es mas facil de configurar y desarrollar en el compilando solo con un botón.

Notas importantes

Antes de comenzar quiero aclarar algunos aspectos:

  • Estoy utilizando MacOS Ventura 13.1
  • Apple dejo de darle soporte a OpenGL desde el 2018, por lo tanto las nuevas versiones (>4.1) no son soportadas.
  • Estoy utilizando una Macbook Air 2020, con el chip M1 (Apple Silicon ARM).

Pasos de configuración

  1. Instalar Xcode

  2. Correr brew install glfw y brew install glew. Importante: Ver la ruta en la que brew indica que se instalaron estas bibliotecas, en mi caso fue /opt/homebrew/Cellar

  3. Crear una aplicación de consola con C++

  4. En la configuración del proyecto entrar a General > Targets > Frameworks & Libraries y agregar OpenGL.framework (Buscarlo en las predeterminadas de Apple), y agregar libGLEW.2.2.0.dylib y libglfw.3.3.dylib que en mi caso se encuentran en /opt/homebrew/Cellar que es donde instalo las librerías homebrew (Recuerda hacer un de ambas antes de comenzar.

    Ventana de seleccion de frameworks
    Ventana de seleccion de frameworks en Xcode

    Ubicacion de libreria glfw
    Ubicacion de libreria glfw

    Librerias seleccionadas en Frameworks and Libraries
    Librerias seleccionadas en Frameworks and Libraries

  5. Entrar a **Build Settings > All** y buscar la configuración Header Search Paths y colocar la siguiente ruta /usr/local/include.

    Configuracion de Header Search Paths
    Configuracion de Header Search Paths

  6. Ahora, puedes probar compilar la aplicación con ⌘+B , si funciona ya la armaste jaja. Pero en mi caso no funcionaba, y es por que en /usr/local/include no tenía las librerías que estaba buscando la aplicación. Por lo que hay que ponerlas (Nota: Esto solo se debe hacer la primera vez, en los demás proyectos no será necesario).

    El primer paso es entrar con Finder a la ruta /usr/local/include después (de preferencia en otra pestaña o ventana de finder) se debe entrar a la ruta donde se instalaron las librerías glew y glfw con homebrew (en el paso 1) y copiar las carpetas que se encuentran en **include** (GL y GLFW):

    Carpeta GL dentro de directorio de brew
    Carpeta GL dentro de directorio de brew

    Carpeta GLFW dentro de directorio de brew
    Carpeta GLFW dentro de directorio de brew

    Carpetas GL y GLFW copiadas a la ruta /usr/local/include
    Carpetas GL y GLFW copiadas a la ruta /usr/local/include

  7. Finalmente, con estos pasos no deben de existir problemas al compilar la aplicación en Xcode. Para probar su correcto funcionamiento puedes probar con el siguiente código:

    #include <iostream>
    #include <GL/glew.h>
    #include <GLFW/glfw3.h>
    #define GL_SILENCE_DEPRECATION
    
    int main(void)
    {
        //Init GLFW
        glfwInit();
    
        //Setup glfw window settings
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
        
        GLFWwindow* Window = glfwCreateWindow(800, 600, "macOS OpenGL engine", nullptr, nullptr);
    
        glfwMakeContextCurrent(Window);
        
        //init GLEW
        glewInit();
        
        glViewport(0, 0, 800, 600);
        
        std::cout << "GL version: " << glGetString(GL_VERSION) << std::endl;
        std::cout << "GL vendor: " << glGetString(GL_VENDOR) << std::endl;
        std::cout << "GL renderer: " << glGetString(GL_RENDERER) << std::endl;
        
        //Game loop
        while(!glfwWindowShouldClose(Window))
        {
            glClearColor(0.2f, 0.65f, 0.154f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
            
            glfwSwapBuffers(Window);
            
            glfwPollEvents();
        }
        
        glfwTerminate();
        return 0;
    }

    Y al correrlo debe generarte una ventana verde y en consola indicar la información del dispositivo, así como la versión máxima de OpenGL soportada.

    OpenGL funcionando correctamente con especificaciones del dispositivo
    OpenGL funcionando correctamente con especificaciones del dispositivo

Otros errores

Nada podía salir perfecto verdad? jaja. Aquí pongo algunos otros errores que me surgieron y su solución:

  1. Cycle inside XXX; building could produce unreliable results.

    Build Phases en orden equivocado
    Build Phases en orden equivocado

    No te voy a mentir, no se porque sucede este error, pero si se su solución. Simplemente tienes que entrar a Build Phases y mover la opción Compile Sources al final de la lista, como lo indica la imagen:

    Build Phases en orden correcto (Compile Sources al fondo)
    Build Phases en orden correcto (Compile Sources al fondo)

  2. GLFW Failed to create Window / El programa falla al crear la ventana pero si compila correctamente.

    Error al crear ventana con GLFW
    Error al crear ventana con GLFW

    Este error me saco canas la verdad, y la solución es super simple.

    En mi caso particular, necesitaba correr el codigo que mi profesor me proporciono, y fracasaba al crear la ventana. Después de un rato, notamos que el error era muy simple: El programa estaba intentando utilizar una versión de OpenGL no soportada. 🤦🏽‍♂️

    Como recordaras, al probar el programa con el código de la pantalla verde en consola indico que mi dispositivo (Macbook Air M1) podía utilizar hasta la versión 4.1 de OpenGL (Principalmente porque  dejo de darle soporte hace unos años, como mencione anteriormente), por lo que simplemente, si este es tu caso, hay que bajar la versión que se quiere utilizar con las siguientes lineas:

    // Asignando variables de GLFW y propiedades de ventana
    // Colocando la versión 4.1 de OpenGL para dispositivos MacOS
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
    // para solo usar el core profile de OpenGL y no tener retrocompatibilidad
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    
    // CREAR VENTANA
    GLFWwindow *mainWindow = glfwCreateWindow(WIDTH, HEIGHT, "Primer ventana", NULL, NULL);
  3. El programa inicia pero se muestra una pantalla negra Este error me dio muchos dolores de cabeza porque no aparecía ningún mensaje de error en la consola y seguía sin funcionar el programa. Sin embargo, en una de las ocasiones que corrí el programa me aparecio un warning sobre la validación de los shaders. Por lo que (en mi caso) entre a la clase Shader y busque donde se tuviera la validación del programa. En mi caso, tenía el siguiente código:

    glValidateProgram(shaderID);
    glGetProgramiv(shaderID, GL_VALIDATE_STATUS, &result);
    if (!result)
    {
    	glGetProgramInfoLog(shaderID, sizeof(eLog), NULL, eLog);
    	printf("Error validating program: '%s'\n", eLog);
    	return;
    }

    Simplemente lo que hice fue comentar esta parte del código y el programa funciono sin problemas :).

    Nota: Esta no es la mejor solución para resolver este problema, ya que según lo que investigue en distintos foros, la validación se estaba haciendo en un lugar incorrecto (en mi caso), por lo que se debería cambiar la ubicación en la que se realiza esta validación. En mis pruebas eliminar esta validación no afecta en lo más minimo el rendimiento de los programas, pero dejo la aclaración. 🤓

Bien, con esto debes tener OpenGL configurado perfectamente en MacOS. Si tienes alguna duda, no dudes en contactarme por Instagram @el.chrisley con gusto te ayudare 😁.

OpenGLMacOSVenturaM1AppleGLFWGLEW20232022Xcode

Did you enjoyed the post? LIKE IT!