Tutorial: Como configurar Xcode para desarrollar con OpenGL utilizando GLFW y GLEW en Apple Silicon (M1)
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
-
Instalar Xcode
-
Correr
brew install glfw
ybrew install glew
. Importante: Ver la ruta en la quebrew
indica que se instalaron estas bibliotecas, en mi caso fue/opt/homebrew/Cellar
-
Crear una aplicación de consola con C++
-
En la configuración del proyecto entrar a General > Targets > Frameworks & Libraries y agregar
OpenGL.framework
(Buscarlo en las predeterminadas de Apple), y agregarlibGLEW.2.2.0.dylib
ylibglfw.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. -
Entrar a **Build Settings > All** y buscar la configuración
Header Search Paths
y colocar la siguiente ruta/usr/local/include
. -
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íasglew
yglfw
con homebrew (en el paso 1) y copiar las carpetas que se encuentran en **include** (GL y GLFW): -
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.
Otros errores
Nada podía salir perfecto verdad? jaja. Aquí pongo algunos otros errores que me surgieron y su solución:
-
Cycle inside XXX; building could produce unreliable results.
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:
-
GLFW Failed to create Window / El programa falla al crear la ventana pero si compila correctamente.
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);
-
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 claseShader
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 😁.
Did you enjoyed the post? LIKE IT!