aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjvech <jmvalenciae@unal.edu.co>2022-08-17 07:11:39 -0500
committerjvech <jmvalenciae@unal.edu.co>2022-08-17 07:11:39 -0500
commitebb66ddbb17a3b82f7632a07fa4db60223b9e55a (patch)
treeb36aa617c284e5bac857183a7f0d5f695a782696
parent5d2c6f0a266d1ba8761240a044d35079dcadf736 (diff)
feat: Hello Triangle Done
-rw-r--r--.gitignore1
-rw-r--r--TODO3
-rw-r--r--src/main.c105
-rw-r--r--src/main.h1
4 files changed, 97 insertions, 13 deletions
diff --git a/.gitignore b/.gitignore
index 873c851..5b43945 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
objs/
mverse
+tags
diff --git a/TODO b/TODO
index 7a7e741..6419f4d 100644
--- a/TODO
+++ b/TODO
@@ -1,3 +1,4 @@
Learning
* Make a Hello Window
-- Make a Hello Triangle
+* Make a Hello Triangle
+- Make a Shader Loader Library
diff --git a/src/main.c b/src/main.c
index 948932e..2d296a8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -8,22 +8,38 @@
#include "main.h"
-static void sysError(const char *msg);
+const char *vertexShaderSource = \
+"#version 330 core\n"
+"layout (location = 0) in vec3 aPos;\n"
+"void main()\n"
+"{\n"
+" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
+"}\0";
+
+const char *fragmentShaderSource = \
+"#version 330 core\n"
+"out vec4 FragColor;\n"
+"void main()\n"
+"{\n"
+" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
+"}\0";
+
+float vertices[] = {
+ -0.5f, -0.5f, 0.0f,
+ 0.5f, -0.5f, 0.0f,
+ 0.0f, 0.5f, 0.0f
+};
+
+//static void sysError(const char *msg);
static void userError(const char *msg, const char *detail);
static void glfw_size_callback(GLFWwindow *window, int width, int height);
static void processInput(GLFWwindow *window, struct Background *c);
-
-void
-sysError(const char *msg)
-{
- perror(msg);
- exit(1);
-}
+static void checkGLSuccess(unsigned int compiledShader, unsigned int shaderStep);
void
userError(const char *msg, const char *detail)
{
- fprintf(stderr, "%s : %s\n", msg, detail);
+ fprintf(stderr, "%s: %s\n", msg, detail);
exit(1);
}
@@ -48,6 +64,34 @@ processInput(GLFWwindow *window, struct Background *c)
}
}
+void
+checkGLSuccess(unsigned int shaderBinary, unsigned int shaderStep)
+{
+ int success;
+ char infoLog[512];
+ switch (shaderStep) {
+ case 0:
+ glGetShaderiv(shaderBinary, GL_COMPILE_STATUS, &success);
+ if (!success) {
+ glGetShaderInfoLog(shaderBinary, 512, NULL, infoLog);
+ userError("glCompileShader() ERROR", infoLog);
+ }
+ break;
+
+ case 1:
+ glGetProgramiv(shaderBinary, GL_LINK_STATUS, &success);
+
+ if (!success) {
+ glGetProgramInfoLog(shaderBinary, 512, NULL, infoLog);
+ userError("glLinkProgram() ERROR", infoLog);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
int main()
{
GLFWwindow *window;
@@ -76,15 +120,52 @@ int main()
struct Background colors = {.R = 0.0, .G = 0.0, .B = 0.0, .A = 0.0};
+ unsigned int VBO, VAO;
+ glGenVertexArrays(1, &VAO);
+ glBindVertexArray(VAO);
+
+ glGenBuffers(1, &VBO);
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
+ glEnableVertexAttribArray(0);
+
+ unsigned int vertexShader, fragmentShader, shaderProgram;
+ vertexShader = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
+ glCompileShader(vertexShader);
+ checkGLSuccess(vertexShader, 0);
+ printf("Vertex Compiled\n");
+
+ fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
+ glCompileShader(fragmentShader);
+ checkGLSuccess(fragmentShader, 0);
+ printf("Fragment Compiled\n");
+
+ shaderProgram = glCreateProgram();
+ glAttachShader(shaderProgram, vertexShader);
+ glAttachShader(shaderProgram, fragmentShader);
+ glLinkProgram(shaderProgram);
+ checkGLSuccess(shaderProgram, 1);
+
+ glDeleteShader(vertexShader);
+ glDeleteShader(fragmentShader);
+
while (!glfwWindowShouldClose(window)) {
- glClear(GL_COLOR_BUFFER_BIT);
+ processInput(window, &colors);
+
glClearColor(colors.R, colors.G, colors.B, colors.A);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glUseProgram(shaderProgram);
+ glBindVertexArray(VAO);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glDrawArrays(GL_TRIANGLES, 0, 3);
- processInput(window, &colors);
glfwSwapBuffers(window);
glfwPollEvents();
}
-
glfwTerminate();
return 0;
}
diff --git a/src/main.h b/src/main.h
index 02bef65..e4fc1ee 100644
--- a/src/main.h
+++ b/src/main.h
@@ -1,3 +1,4 @@
struct Background {
float R, G, B, A;
};
+
Feel free to download, copy and edit any repo