aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2024-05-16 17:03:33 +0200
committerlonkaars <loek@pipeframe.xyz>2024-05-16 17:03:33 +0200
commitc0a4cd2aa8dce443a7d54232cada0ee57cdec463 (patch)
treee559b7e0ef46627957426a685dcd376cc96c8d94 /main.c
parent548fcede95d44a3486e43f24302809792754861a (diff)
WIP fragment shader demo
Diffstat (limited to 'main.c')
-rw-r--r--main.c69
1 files changed, 53 insertions, 16 deletions
diff --git a/main.c b/main.c
index ab5f97b..8ac0ca2 100644
--- a/main.c
+++ b/main.c
@@ -1,40 +1,77 @@
#include <stdlib.h>
+#include <GL/glew.h>
#include <GLFW/glfw3.h>
-#include "draw.h"
+#include "shader.h"
#include "die.h"
-void resize_handler(GLFWwindow* window, int width, int height) {
- glViewport(0, 0, width, height);
+#include "hello_vert.h"
+#include "hello_frag.h"
+
+void prepare_tri(GLuint* VBO, GLuint* VAO) {
+ const float vertices[] = {
+ -0.5f, -0.5f, 0.0f,
+ 0.5f, -0.5f, 0.0f,
+ 0.0f, 0.5f, 0.0f,
+ };
+
+ // initialize vertex {buffer,attribute} object buffers
+ glGenBuffers(1, VBO);
+ glBindBuffer(GL_ARRAY_BUFFER, *VBO);
+ glGenBuffers(1, VAO);
+ glBindVertexArray(*VAO);
+
+ // copy vertex data into VBO
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+
+ // set VAO pointers
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
+ glEnableVertexAttribArray(0);
}
int main(int argc, char** argv) {
glfwInit();
-
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
-
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- int width = 800, height = 600;
- GLFWwindow* window = glfwCreateWindow(width, height, "vis", NULL, NULL);
+ // force floating window w/ i3
+ glfwWindowHint(GLFW_FLOATING, GL_TRUE);
+ glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
- if (window == NULL) {
- glfwTerminate();
+ // initialize window
+ GLFWwindow* window = glfwCreateWindow(800, 600, "vis", NULL, NULL);
+ if (window == NULL)
die("error: could not create window\n");
- }
-
glfwMakeContextCurrent(window);
- glfwSetFramebufferSizeCallback(window, resize_handler);
- resize_handler(window, width, height);
+ // initialize GLEW
+ glewInit();
+
+ // create single triangle
+ GLuint VBO, VAO;
+ prepare_tri(&VBO, &VAO);
+
+ // prepare shaders
+ GLuint shader = link_shaders(
+ vert_shader(hello_vert, hello_vert_size),
+ frag_shader(hello_frag, hello_frag_size)
+ );
+
+ // main draw loop
while (!glfwWindowShouldClose(window)) {
- draw(window);
- glfwSwapBuffers(window);
glfwPollEvents();
+
+ glClearColor(1.f, 0.f, 1.f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glUseProgram(shader);
+ glBindVertexArray(VAO);
+ glDrawArrays(GL_TRIANGLES, 0, 3);
+
+ glfwSwapBuffers(window);
}
- glfwTerminate();
return EXIT_SUCCESS;
}