diff options
Diffstat (limited to '')
-rw-r--r-- | src/main.c | 105 | ||||
-rw-r--r-- | src/shader.h | 2 | ||||
-rw-r--r-- | src/shaders/triangle.frag.glsl | 10 | ||||
-rw-r--r-- | src/shaders/triangle.vert.glsl | 9 | ||||
-rw-r--r-- | src/stb_image.c | 2 |
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" |