Untitled
unknown
plain_text
2 years ago
6.6 kB
10
Indexable
/* 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(20);
// 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 = 20;
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;
}
Editor is loading...