summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authoriurii plugatarov <[email protected]>2024-08-11 00:17:42 +0200
committeriurii plugatarov <[email protected]>2024-08-11 00:17:42 +0200
commitee735611611bf7b27bccbca808e5d72da45b9937 (patch)
treecc42e64bb2e0814db9056d9147e388fe2d3bded0 /src
parent90e85b2fe655a2643535b0f49d99836ac72e724c (diff)
downloadogl-ee735611611bf7b27bccbca808e5d72da45b9937.tar.gz
textures
Diffstat (limited to '')
-rw-r--r--src/main.c105
-rw-r--r--src/shader.h2
-rw-r--r--src/shaders/triangle.frag.glsl10
-rw-r--r--src/shaders/triangle.vert.glsl9
-rw-r--r--src/stb_image.c2
5 files changed, 106 insertions, 22 deletions
diff --git a/src/main.c b/src/main.c
index 96882b6..acd89c8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,9 +1,11 @@
+#include "shader.h"
+#include "vendor/stb_image.h"
 #include <GL/glew.h>
 #include <GLFW/glfw3.h>
 #include <math.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include "shader.h"
 
 void on_resize(GLFWwindow *win, int width, int height) {
   glViewport(0, 0, width, height);
@@ -31,7 +33,7 @@ int main() {
     return -1;
   }
 
-  glfwSetFramebufferSizeCallback(window, (void *)on_resize);
+  glfwSetFramebufferSizeCallback(window, on_resize);
   glfwMakeContextCurrent(window);
 
   // Initialize GLEW
@@ -44,43 +46,111 @@ int main() {
   int attrib_count;
   get_max_attrib_count(&attrib_count);
 
+  unsigned int texture1, texture2;
+  glGenTextures(1, &texture1);
+  glBindTexture(GL_TEXTURE_2D, texture1); // Changed from texture to texture1
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
+  float borderColor[] = {1.0f, 1.0f, 0.0f, 1.0f};
+  glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                  GL_LINEAR_MIPMAP_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  int width, height, nrChannels;
+  unsigned char *data =
+      stbi_load("res/images/container.jpg", &width, &height, &nrChannels, 0);
+  if (data) {
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB,
+                 GL_UNSIGNED_BYTE, data);
+    glGenerateMipmap(GL_TEXTURE_2D);
+  } else {
+    printf("Failed to load texture\n");
+  }
+
+  stbi_image_free(data);
+
+  glGenTextures(1, &texture2);
+  glBindTexture(GL_TEXTURE_2D, texture2);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  stbi_set_flip_vertically_on_load(true);
+  data = stbi_load("res/images/awesomeface.png", &width, &height, &nrChannels,
+                   0); // Removed asterisk
+
+  if (data) {
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
+                 GL_UNSIGNED_BYTE, data); // Changed GL_RGB to GL_RGBA
+    glGenerateMipmap(GL_TEXTURE_2D);
+  } else {
+    printf("Failed to load texture\n");
+  }
+
+  stbi_image_free(data);
   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
+      // positions          // colors           // texture coords
+      0.5f,  0.5f,  0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right
+      0.5f,  -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right
+      -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left
+      -0.5f, 0.5f,  0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f  // top left
+  };
+
+  unsigned int indices[] = {
+      0, 1, 3, // first triangle
+      1, 2, 3  // second triangle
   };
 
-  unsigned int VBO;
+  unsigned int VBO, VAO, EBO;
+  glGenVertexArrays(1, &VAO);
   glGenBuffers(1, &VBO);
+  glGenBuffers(1, &EBO);
+
+  glBindVertexArray(VAO);
+
   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");
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
+  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices,
+               GL_STATIC_DRAW);
+
+  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);
+  // position attribute
+  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)0);
   glEnableVertexAttribArray(0);
-  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),
+  // color attribute
+  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float),
                         (void *)(3 * sizeof(float)));
   glEnableVertexAttribArray(1);
+  // texture coord attribute
+  glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float),
+                        (void *)(6 * sizeof(float)));
+  glEnableVertexAttribArray(2);
 
   shader_use(shader);
+  glUniform1i(glGetUniformLocation(shader->program, "texture1"), 0);
+  glUniform1i(glGetUniformLocation(shader->program, "texture2"), 1);
+
   while (!glfwWindowShouldClose(window)) {
     glClearColor(0.1f, 0.1f, 0.25f, 1.0f);
     glClear(GL_COLOR_BUFFER_BIT);
 
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, texture1);
+    glActiveTexture(GL_TEXTURE1);
+    glBindTexture(GL_TEXTURE_2D, texture2);
+
     glBindVertexArray(VAO);
-    glDrawArrays(GL_TRIANGLES, 0, 3);
+    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
 
     glfwSwapBuffers(window);
     glfwPollEvents();
@@ -88,6 +158,7 @@ int main() {
 
   glDeleteVertexArrays(1, &VAO);
   glDeleteBuffers(1, &VBO);
+  glDeleteBuffers(1, &EBO);
   shader_delete(shader);
 
   glfwTerminate();
diff --git a/src/shader.h b/src/shader.h
index ee06930..6d53803 100644
--- a/src/shader.h
+++ b/src/shader.h
@@ -4,7 +4,7 @@
 #include <GL/glew.h>
 
 typedef struct {
-  GLuint program;
+  unsigned int program;
 } Shader;
 
 Shader *shader_create(const char *vertex_path, const char *fragment_path);
diff --git a/src/shaders/triangle.frag.glsl b/src/shaders/triangle.frag.glsl
index b3dcd05..0285eb0 100644
--- a/src/shaders/triangle.frag.glsl
+++ b/src/shaders/triangle.frag.glsl
@@ -1,7 +1,13 @@
 #version 330 core
 out vec4 FragColor;
+  
 in vec3 ourColor;
+in vec2 TexCoord;
+
+uniform sampler2D texture1;
+uniform sampler2D texture2;
+
 void main()
 {
-    FragColor = vec4(ourColor, 1.0);
-} 
+    FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2);
+}
diff --git a/src/shaders/triangle.vert.glsl b/src/shaders/triangle.vert.glsl
index f1dbe00..22041cd 100644
--- a/src/shaders/triangle.vert.glsl
+++ b/src/shaders/triangle.vert.glsl
@@ -1,9 +1,14 @@
 #version 330 core
 layout (location = 0) in vec3 aPos;
 layout (location = 1) in vec3 aColor;
+layout (location = 2) in vec2 aTexCoord;
+
 out vec3 ourColor;
+out vec2 TexCoord;
+
 void main()
 {
-   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
-   ourColor = aColor;
+    gl_Position = vec4(aPos, 1.0);
+    ourColor = aColor;
+    TexCoord = aTexCoord;
 }
diff --git a/src/stb_image.c b/src/stb_image.c
new file mode 100644
index 0000000..8ddfd1f
--- /dev/null
+++ b/src/stb_image.c
@@ -0,0 +1,2 @@
+#define STB_IMAGE_IMPLEMENTATION
+#include "stb_image.h"