Untitled
unknown
plain_text
a year ago
6.6 kB
1
Indexable
Never
/* Hello Triangle - código adaptado de https://learnopengl.com/#!Getting-started/Hello-Triangle * * Adaptado por Rossana Baptista Queiroz * para a disciplina de Processamento Gráfico - Unisinos * Versão inicial: 7/4/2017 * Última atualização em 14/08/2023 * */ #include <iostream> #include <string> #include <assert.h> using namespace std; // GLAD #include <glad/glad.h> // GLFW #include <GLFW/glfw3.h> #include "Shader.h" // Protótipo da função de callback de teclado void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); // Protótipos das funções int setupGeometry(); // Dimensões da janela (pode ser alterado em tempo de execução) const GLuint WIDTH = 800, HEIGHT = 600; // Função MAIN int main() { // Inicialização da GLFW glfwInit(); //Muita atenção aqui: alguns ambientes não aceitam essas configurações //Você deve adaptar para a versão do OpenGL suportada por sua placa //Sugestão: comente essas linhas de código para desobrir a versão e //depois atualize (por exemplo: 4.5 com 4 e 5) /*glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);*/ //Essencial para computadores da Apple //#ifdef __APPLE__ // glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //#endif // Criação da janela GLFW GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Ola Triangulo! -- Tiago Umberto Gazzola", nullptr, nullptr); glfwMakeContextCurrent(window); // Fazendo o registro da função de callback para a janela GLFW glfwSetKeyCallback(window, key_callback); // GLAD: carrega todos os ponteiros d funções da OpenGL if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; } // Obtendo as informações de versão const GLubyte* renderer = glGetString(GL_RENDERER); /* get renderer string */ const GLubyte* version = glGetString(GL_VERSION); /* version as a string */ cout << "Renderer: " << renderer << endl; cout << "OpenGL version supported " << version << endl; // Definindo as dimensões da viewport com as mesmas dimensões da janela da aplicação int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); // Compilando e buildando o programa de shader Shader shader("../shaders/HelloTriangle.vs", "../shaders/HelloTriangle.fs"); // Gerando um buffer simples, com a geometria de um triângulo GLuint VAO = setupGeometry(); shader.Use(); glLineWidth(5); glPointSize(10); // Loop da aplicação - "game loop" while (!glfwWindowShouldClose(window)) { // Checa se houveram eventos de input (key pressed, mouse moved etc.) e chama as funções de callback correspondentes glfwPollEvents(); // Limpa o buffer de cor glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //cor de fundo glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(VAO); //Conectando ao buffer de geometria // Chamada de desenho - drawcall // Poligono Preenchido - GL_TRIANGLES glDrawArrays(GL_TRIANGLES, 0, 6); //Contorno - GL_LINE_LOOP glDrawArrays(GL_LINE_LOOP, 0, 3); glDrawArrays(GL_LINE_LOOP, 3, 3); //Contorno - GL_LINE_POINTS glDrawArrays(GL_POINTS, 0, 6); glBindVertexArray(0); //Desconectando o buffer de geometria // Troca os buffers da tela glfwSwapBuffers(window); } // Pede pra OpenGL desalocar os buffers glDeleteVertexArrays(1, &VAO); // Finaliza a execução da GLFW, limpando os recursos alocados por ela glfwTerminate(); return 0; } // Função de callback de teclado - só pode ter uma instância (deve ser estática se // estiver dentro de uma classe) - É chamada sempre que uma tecla for pressionada // ou solta via GLFW void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); } // Esta função está bastante harcoded - objetivo é criar os buffers que armazenam a // geometria de um triângulo // Apenas atributo coordenada nos vértices // 1 VBO com as coordenadas, VAO com apenas 1 ponteiro para atributo // A função retorna o identificador do VAO int setupGeometry() { const int nPoints = 1000; float angle = 0.0; float slice = 2 * 3.1419 / nPoints; float radius = 0.5; GLfloat vertices[nPoints * 3]; for (int i = 0; i < nPoints; i++) { float x = radius * cos(angle); float y = radius * sin(angle); float z = 0.0; if (i == 0) { vertices[i] = radius * cos(angle); vertices[i + 1] = radius * sin(angle); vertices[i + 2] = 0.0; } else { vertices[i * 3] = x; vertices[(i * 3) + 1] = y; vertices[(i * 3) + 2] = 0.0; } } GLuint VBO, VAO; //Geração do identificador do VBO glGenBuffers(1, &VBO); //Faz a conexão (vincula) do buffer como um buffer de array glBindBuffer(GL_ARRAY_BUFFER, VBO); //Envia os dados do array de floats para o buffer da OpenGl glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //Geração do identificador do VAO (Vertex Array Object) glGenVertexArrays(1, &VAO); // Vincula (bind) o VAO primeiro, e em seguida conecta e seta o(s) buffer(s) de vértices // e os ponteiros para os atributos glBindVertexArray(VAO); //Para cada atributo do vertice, criamos um "AttribPointer" (ponteiro para o atributo), indicando: // Localização no shader * (a localização dos atributos devem ser correspondentes no layout especificado no vertex shader) // Numero de valores que o atributo tem (por ex, 3 coordenadas xyz) // Tipo do dado // Se está normalizado (entre zero e um) // Tamanho em bytes // Deslocamento a partir do byte zero // Atributo layout 0 - Posição glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); // Atributo layout 1 - Cor glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(1); // Observe que isso é permitido, a chamada para glVertexAttribPointer registrou o VBO como o objeto de buffer de vértice // atualmente vinculado - para que depois possamos desvincular com segurança glBindBuffer(GL_ARRAY_BUFFER, 0); // Desvincula o VAO (é uma boa prática desvincular qualquer buffer ou array para evitar bugs medonhos) glBindVertexArray(0); return VAO; }