1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "shader.h"
void on_resize(GLFWwindow *win, int width, int height) {
glViewport(0, 0, width, height);
}
void get_max_attrib_count(int *attrib_count) {
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, attrib_count);
printf("Max vertex attribs %d\n", *attrib_count);
}
int main() {
// Initialize GLFW
if (!glfwInit()) {
return -1;
}
// Set the required options for GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow *window = glfwCreateWindow(320, 240, "Blue screen", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwSetFramebufferSizeCallback(window, (void *)on_resize);
glfwMakeContextCurrent(window);
// Initialize GLEW
GLenum glewStatus = glewInit();
if (glewStatus != GLEW_OK) {
printf("Failed to initialize GLEW: %s\n", glewGetErrorString(glewStatus));
return -1;
}
int attrib_count;
get_max_attrib_count(&attrib_count);
float vertices[] = {
// positions // colors
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom left
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // top
};
unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Create and compile shaders using our new shader implementation
Shader* shader = shader_create("src/shaders/triangle.vert.glsl", "src/shaders/triangle.frag.glsl");
if (!shader) {
glfwTerminate();
return -1;
}
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void *)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),
(void *)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
shader_use(shader);
while (!glfwWindowShouldClose(window)) {
glClearColor(0.1f, 0.1f, 0.25f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
shader_delete(shader);
glfwTerminate();
return 0;
}
|