summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-05-08 01:36:46 +0200
committerkdx <kikoodx@paranoici.org>2023-05-08 01:36:46 +0200
commitb4489a653179aee3e902dc4f0a9b087ceac8957b (patch)
treefb4fb9ef859fcb333b285887dca8fa916acb1a4b
parent6783df4a9c76d8be1fc090d94e23ec1a29c08a67 (diff)
downloadlearnopengl-b4489a653179aee3e902dc4f0a9b087ceac8957b.tar.gz
Hello Triangle
fuck you triangle i hate you
-rw-r--r--Tupfile4
-rw-r--r--src/fragment.glsl8
-rw-r--r--src/main.c85
-rw-r--r--src/vertex.glsl8
4 files changed, 104 insertions, 1 deletions
diff --git a/Tupfile b/Tupfile
index 1fa5aa1..3ade1a2 100644
--- a/Tupfile
+++ b/Tupfile
@@ -4,5 +4,7 @@ CFLAGS = -std=c99 -Wall -Wextra -Iglad
LDFLAGS = -lGL -lglfw
.gitignore
-: foreach src/*.c glad/*.c |> $(CC) $(CFLAGS) -c -o %o %f |> build/%B.o
+: foreach src/*.glsl |> cembed -z -s %f >%o |> build/src/embed_%B.c
+: foreach src/*.c |> cp %f %o |> build/%f
+: foreach build/src/*.c glad/*.c |> $(CC) $(CFLAGS) -c -o %o %f |> build/%B.o
: build/*.o |> $(LD) -o %o %f $(LDFLAGS) |> build/gl
diff --git a/src/fragment.glsl b/src/fragment.glsl
new file mode 100644
index 0000000..ca4fb1f
--- /dev/null
+++ b/src/fragment.glsl
@@ -0,0 +1,8 @@
+#version 330 core
+out vec4 FragColor;
+
+void
+main()
+{
+ FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
+}
diff --git a/src/main.c b/src/main.c
index bdb349c..4add491 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3,6 +3,9 @@
#include <stdio.h>
#include <stdlib.h>
+extern unsigned char src_vertex_glsl[];
+extern unsigned char src_fragment_glsl[];
+
static void framebuffer_size_callback(GLFWwindow *window, int w, int h);
int
@@ -36,7 +39,89 @@ main([[maybe_unused]] int argc, [[maybe_unused]] char **argv)
glViewport(0, 0, 800, 600);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
+ static const float verts[] = {
+ 0.5f, 0.5f, 0.0f, // top right
+ 0.5f, -0.5f, 0.0f, // bottom right
+ -0.5f, -0.5f, 0.0f, // bottom left
+ -0.5f, 0.5f, 0.0f // top left
+ };
+ static const GLuint indices[] = {
+ 0, 1, 3, // first triangle
+ 1, 2, 3 // second triangle
+ };
+ GLuint VBO;
+ glGenBuffers(1, &VBO);
+
+ const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
+ if (vertex_shader == 0) {
+ fprintf(stderr, "glCreateShader failed\n");
+ return 1;
+ }
+ const char *const vertex_source = (const char*)src_vertex_glsl;
+ glShaderSource(vertex_shader, 1, &vertex_source, NULL);
+ glCompileShader(vertex_shader);
+ int success;
+ glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
+ if (!success) {
+ char info_log[512];
+ glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
+ fprintf(stderr, "glCompileShader failed:\n%s\n", info_log);
+ return 1;
+ }
+
+ const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
+ if (fragment_shader == 0) {
+ fprintf(stderr, "glCreateShader failed\n");
+ return 1;
+ }
+ const char *const fragment_source = (const char*)src_fragment_glsl;
+ glShaderSource(fragment_shader, 1, &fragment_source, NULL);
+ glCompileShader(fragment_shader);
+ glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
+ if (!success) {
+ char info_log[512];
+ glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
+ fprintf(stderr, "glCompileShader failed:\n%s\n", info_log);
+ return 1;
+ }
+
+ const GLuint shader_program = glCreateProgram();
+ if (shader_program == 0) {
+ fprintf(stderr, "glCreateProgram failed\n");
+ return 1;
+ }
+ glAttachShader(shader_program, vertex_shader);
+ glAttachShader(shader_program, fragment_shader);
+ glLinkProgram(shader_program);
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+ glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
+ if (!success) {
+ char info_log[512];
+ glGetProgramInfoLog(shader_program, 512, NULL, info_log);
+ fprintf(stderr, "glLinkProgram failed:\n%s\n", info_log);
+ return 1;
+ }
+
+ GLuint EBO;
+ glGenBuffers(1, &EBO);
+
+ GLuint VAO;
+ glGenVertexArrays(1, &VAO);
+ glBindVertexArray(VAO);
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), NULL);
+ glEnableVertexAttribArray(0);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
while (!glfwWindowShouldClose(window)) {
+ glUseProgram(shader_program);
+ glBindVertexArray(VAO);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
+
glfwSwapBuffers(window);
glfwPollEvents();
}
diff --git a/src/vertex.glsl b/src/vertex.glsl
new file mode 100644
index 0000000..2ad10d2
--- /dev/null
+++ b/src/vertex.glsl
@@ -0,0 +1,8 @@
+#version 330 core
+layout (location = 0) in vec3 aPos;
+
+void
+main()
+{
+ gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
+}