Trabalhando com opengl

Agora vamos rodar um projeto opengl com foxmake no windows

Vamos criar um projeto que utiliza opengl. Faça o seguinte: Baixe o glfw, depois o glew e, se quiser, pode baixar também o glm para cálculos matemáticos e com vetores e matrizes. Logo, as versões atuais "18/06/2026", são as seguintes:

  • glfw-3.4.bin.WIN64.zip
  • glew-2.3.1-win32.zip
  • glm-1.0.3.zip
Atenção

Esse tutorial ensina a utilizar o opengl para windows, arquitetura x86_64. Para outras arquiteturas ou sistema linux, são necessárias adaptações!


Crie uma pasta para o projeto com o nome que desejar. Mas, para esse tutorial, vamos assumir que o nome é "ProjGL".

No seu projeto criado, crie dentro da pasta raiz do projeto as pastas: "include" e "lib".

Instalando o glfw

Agora, descompacte o "glfw-3.4.bin.WIN64.zip" e procure pelas pastas "include" e "lib-mingw-w64. Agora, copie o conteúdo da pasta "include" para a pasta "include" que você criou na raiz do seu projeto. Copie também o conteúdo da pasta "lib-mingw-w64" para pasta "lib" que você criou na raiz do projeto. Caso queira, pode copiar o arquivo glfw3.dll para a raiz do seu projeto, ao invés da pasta "lib".

Instalando o glew

Descompacte o arquivo "glew-2.3.1-win32.zip" e procure pelas pastas "include", "bin", "lib". Agora, copie o conteúdo da pasta "include" para a pasta "include" da raiz do seu projeto. Copie os arquivos ".lib" da pasta "lib", conforme a arquitetura (no caso "x64"), para a pasta "lib" na raiz do projeto. Agora, na pasta "bin", procure pelo arquivo "glew32.dll" conforme a arquitetura (no caso "x64"). Copie o arquivo "glew32.dll" para a raiz do seu projeto ou para a pasta "lib".

Instalando o glm

Para instalar o glm é mais simples. Extraia o conteúdo do arquivo "glm-1.0.3.zip" e copie o conteúdo da subpasta "glm" que está dentro da pasta "glm", para a pasta "include" do seu projeto.

Atenção

Não copie a pasta "glm" raiz do arquivo extraído, copie a pasta "glm" que está dentro dela, junta de outras pastas!


Feito isto tudo, a pasta "include deve estar mais ou menos assim:

ProjGL
└── include
    ├── GL
    ├── GLFW
    └── glm

A árvore de diretórios acima, ignora o conteúdo das subpastas de "include"!

E a pasta lib, deve ter o seguinte conteúdo e a pasta raiz deve ter o arquivo "glew32.dll" e, caso tenha optado por deixar na raiz também o arquivo "glfw3.dll", este estará na raiz também.

ProjGL
├── lib
│   ├── glew32.lib
│   ├── glew32s.lib
│   ├── libglfw3.a
│   └── libglfw3dll.a
├── glew32.dll
└── glfw3.dll
Atenção

Atenção: se fizer uma linkagem estática, não necessita do arquivo glfw3.dll. Se fizer uma linkagem dinâmica, o arquivo glfw3.dll é necessário! Nesse projeto, vamos utilizar a lib "libglfw3.a", linkando esta lib estaticamente.


Agora que está tudo configurado, vamos ao arquivo "main.cpp" onde estará o código opengl/c++ da aplicação:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    // Initialize GLFW
    if (!glfwInit()) {
        std::cerr << "Falha ao iniciar o GLFW\n";
        return -1;
    }

    // Cria no modo janela o contexto OpenGL
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL com MinGW e Foxmake", nullptr, nullptr);
    if (!window) {
        std::cerr << "Falha ao criar janela GLFW\n";
        glfwTerminate();
        return -1;
    }

    // Faz a janela como contexto corrente
    glfwMakeContextCurrent(window);

    // Inicializa o GLEW
    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
        std::cerr << "Falha ao inicializar o GLEW\n";
        return -1;
    }

    // Loop principal
    while (!glfwWindowShouldClose(window)) {
        // Cor da janela
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // Operação de Swap para bufferes
        glfwSwapBuffers(window);

        // Poll para processar eventos
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;
}

Atenção

O exemplo acima não utiliza glm, por ser um exemplo minimalista!


Agora crie o arquivo FoxMakefile com o seguinte conteúdo:

output.file.name=projgl.exe

src.dir=src
bin.dir=bin
obj.dir=obj
build.dir=build

build.files=glew32.dll glfw3.dll

compiler.params=-Wall -g
linker.params=-s

include.dirs=include
lib.dirs=lib
libs=glfw3 glew32 opengl32 gdi32

Agora, pode executar o build com o foxmake com o seguinte comando (na raiz do projeto):

foxmake buildall

Se tudo correr bem, o seu projeto terá a seguinte estrutura de arquivos e pastas:

ProjGL
├── __lwtimes.txt
├── FoxMakefile    
├── glew32.dll
├── glfw3.dll
├── bin
│   └── projgl.exe
├── build
│   ├── glew32.dll
│   ├── glfw3.dll
│   └── projgl.exe
├── include
│   ├── GL
│   ├── GLFW
│   └── glm
├── lib
│   ├── glew32.lib
│   ├── glew32s.lib
│   ├── libglfw3.a
│   └── libglfw3dll.a
├── obj
│   └── src
│       └── main.o
└── src
    └── main.cpp

Agora rode o projeto com o seguinte comando:

.\build\projgl.exe

Com isso verá uma janela de cor cinza, é o resultado do programa rodado.

Download: projgl-windows.zip.

Finalizando

Esta é a última aula sobre o foxmake. Espero que tenha gostado do conteúdo e, divirta-se, automatizando o build de seus projetos em C/C++ com o foxmake.