2018-02-05 22:28:51 +00:00
|
|
|
// Include standard headers
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
// Include GLEW
|
|
|
|
#include <GL/glew.h>
|
|
|
|
|
|
|
|
// Include GLFW
|
|
|
|
#include <GLFW/glfw3.h>
|
2018-02-07 00:24:12 +00:00
|
|
|
|
|
|
|
// Include shader
|
|
|
|
#include "shader.h"
|
|
|
|
|
2018-02-05 22:28:51 +00:00
|
|
|
GLFWwindow* window;
|
|
|
|
|
2018-02-06 23:02:56 +00:00
|
|
|
int main(void) {
|
|
|
|
|
2018-02-05 22:28:51 +00:00
|
|
|
// Initialise GLFW
|
2018-02-06 23:02:56 +00:00
|
|
|
if(!glfwInit()) {
|
|
|
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
2018-02-05 22:28:51 +00:00
|
|
|
getchar();
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
glfwWindowHint(GLFW_SAMPLES, 4);
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
|
|
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
|
|
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
|
|
|
|
|
|
// Open a window and create its OpenGL context
|
2018-02-06 23:02:56 +00:00
|
|
|
window = glfwCreateWindow(1024, 768, "OpenGL Clock", NULL, NULL);
|
|
|
|
if (window == NULL) {
|
|
|
|
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
|
2018-02-05 22:28:51 +00:00
|
|
|
getchar();
|
|
|
|
glfwTerminate();
|
|
|
|
return -1;
|
|
|
|
}
|
2018-02-06 23:02:56 +00:00
|
|
|
|
2018-02-05 22:28:51 +00:00
|
|
|
glfwMakeContextCurrent(window);
|
|
|
|
|
|
|
|
// Initialize GLEW
|
|
|
|
if (glewInit() != GLEW_OK) {
|
|
|
|
fprintf(stderr, "Failed to initialize GLEW\n");
|
|
|
|
getchar();
|
|
|
|
glfwTerminate();
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure we can capture the escape key being pressed below
|
|
|
|
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
|
|
|
|
|
|
|
|
// Dark grey background
|
|
|
|
glClearColor(0.15f, 0.15f, 0.15f, 0.0f);
|
|
|
|
|
2018-02-07 00:24:12 +00:00
|
|
|
GLuint VertexArrayID;
|
|
|
|
glGenVertexArrays(1, &VertexArrayID);
|
|
|
|
glBindVertexArray(VertexArrayID);
|
|
|
|
|
|
|
|
// Create and compile our GLSL program from the shaders
|
|
|
|
GLuint programID = LoadShaders("shaders/SimpleVertexShader.vertexshader", "shaders/SimpleFragmentShader.fragmentshader");
|
|
|
|
|
|
|
|
static const GLfloat g_vertex_buffer_data[] = {
|
|
|
|
-1.0f, -1.0f, 0.0f,
|
|
|
|
1.0f, -1.0f, 0.0f,
|
|
|
|
0.0f, 1.0f, 0.0f
|
|
|
|
};
|
|
|
|
|
|
|
|
GLuint vertexbuffer;
|
|
|
|
glGenBuffers(1, &vertexbuffer);
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
|
|
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
|
|
|
|
|
2018-02-06 23:02:56 +00:00
|
|
|
do {
|
|
|
|
// Clear the screen. It's not mentioned before Tutorial 02,
|
|
|
|
// but it can cause flickering, so it's there nonetheless.
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
2018-02-05 22:28:51 +00:00
|
|
|
|
2018-02-07 00:24:12 +00:00
|
|
|
// Use our shader
|
|
|
|
glUseProgram(programID);
|
|
|
|
|
|
|
|
// 1rst attribute buffer : vertices
|
|
|
|
glEnableVertexAttribArray(0);
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
|
|
|
|
glVertexAttribPointer(
|
|
|
|
0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
|
|
|
|
3, // size
|
|
|
|
GL_FLOAT, // type
|
|
|
|
GL_FALSE, // normalized?
|
|
|
|
0, // stride
|
|
|
|
NULL // array buffer offset
|
|
|
|
);
|
|
|
|
|
|
|
|
// Draw the triangle !
|
|
|
|
glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle
|
|
|
|
|
|
|
|
glDisableVertexAttribArray(0);
|
2018-02-05 22:28:51 +00:00
|
|
|
|
|
|
|
// Swap buffers
|
|
|
|
glfwSwapBuffers(window);
|
|
|
|
glfwPollEvents();
|
|
|
|
|
2018-02-06 23:02:56 +00:00
|
|
|
// Check if the ESC key was pressed or the window was closed
|
|
|
|
} while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
|
|
|
|
glfwWindowShouldClose(window) == 0);
|
2018-02-05 22:28:51 +00:00
|
|
|
|
|
|
|
// Close OpenGL window and terminate GLFW
|
|
|
|
glfwTerminate();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|