From c591275bd1265d0bf8c6a49f4e89a02753c65da3 Mon Sep 17 00:00:00 2001 From: Fries Date: Sun, 21 Apr 2024 18:23:24 -0700 Subject: [PATCH] Overlay a transparent meme over the crate texture. --- src/awesomeface.png | Bin 0 -> 59277 bytes src/fragment.glsl | 5 ++-- src/image.cc | 5 ++-- src/image.hh | 3 +- src/main.cc | 71 +++++++++++++++++++++++++++++++------------- src/meson.build | 3 +- src/shader.cc | 12 ++++---- src/shader.hh | 6 ++-- src/utilities.cc | 5 ++++ src/utilities.hh | 1 + 10 files changed, 75 insertions(+), 36 deletions(-) create mode 100644 src/awesomeface.png diff --git a/src/awesomeface.png b/src/awesomeface.png new file mode 100644 index 0000000000000000000000000000000000000000..9840caf3e7f4914ea1c6c15f688ffaf2cf44bae8 GIT binary patch literal 59277 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 Q0|5VhP*hj=DQ6!3fBcW&%>V!Z literal 0 HcmV?d00001 diff --git a/src/fragment.glsl b/src/fragment.glsl index f6d7b2e..9af658b 100644 --- a/src/fragment.glsl +++ b/src/fragment.glsl @@ -5,8 +5,9 @@ out vec4 FragColor; in vec3 ourColor; in vec2 TexCoord; -uniform sampler2D ourTexture; +uniform sampler2D texture1; +uniform sampler2D texture2; void main() { - FragColor = texture(ourTexture, TexCoord); + FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2); } diff --git a/src/image.cc b/src/image.cc index 050d3b8..ceec35b 100644 --- a/src/image.cc +++ b/src/image.cc @@ -1,8 +1,9 @@ #include "image.hh" #include -Image::Image(const char* path) { - data = stbi_load(path, &width, &height, &nrChannels, 0); +Image::Image(std::string path) { + stbi_set_flip_vertically_on_load(true); + data = stbi_load(path.c_str(), &width, &height, &nrChannels, 0); } Image::~Image() { diff --git a/src/image.hh b/src/image.hh index d0245a8..2de3a5e 100644 --- a/src/image.hh +++ b/src/image.hh @@ -1,11 +1,12 @@ #ifndef IMAGE_HH #define IMAGE_HH +#include #define STB_IMAGE_IMPLEMENTATION class Image { public: int width, height, nrChannels; unsigned char* data; - Image(const char* path); + Image(std::string path); ~Image(); }; #endif diff --git a/src/main.cc b/src/main.cc index f448494..96f78fa 100644 --- a/src/main.cc +++ b/src/main.cc @@ -3,6 +3,7 @@ #include #include +#include #include "shader.hh" #include "utilities.hh" @@ -134,6 +135,7 @@ GlRenderObjects* rectangle() { int main() { glfwInit(); +{ // Set OpenGL version to 3.3. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); @@ -162,29 +164,56 @@ int main() { std::string currentPath = utilities::getCurrentPath(); // Create a shader class. - Shader* shader = new Shader(std::format("{}/vertex.glsl", currentPath).c_str(), std::format("{}/fragment.glsl", currentPath).c_str()); + Shader shader(std::format("{}/vertex.glsl", currentPath).c_str(), std::format("{}/fragment.glsl", currentPath).c_str()); - GlRenderObjects* triangleRenderObjs = triangle(); - GlRenderObjects* rectangleRenderObjs = rectangle(); + std::unique_ptr triangleRenderObjs(triangle()); + std::unique_ptr rectangleRenderObjs(rectangle()); - unsigned int texture; - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); + unsigned int texture1, texture2; + +{ + glGenTextures(1, &texture1); + glBindTexture(GL_TEXTURE_2D, texture1); 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_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - { - Image texture(std::format("{}/container.jpg", utilities::getCurrentPath()).c_str()); - if (texture.data) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture.width, texture.height, 0, GL_RGB, GL_UNSIGNED_BYTE, texture.data); - glGenerateMipmap(GL_TEXTURE_2D); - } else { - std::cout << "Failed to load texture." << std::endl; - } + Image texture(utilities::getCurrentPath("container.jpg")); + if (texture.data) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture.width, texture.height, 0, GL_RGB, GL_UNSIGNED_BYTE, texture.data); + glGenerateMipmap(GL_TEXTURE_2D); + } else { + std::cout << "Failed to load texture." << std::endl; } +} + +{ + 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); + + Image texture(utilities::getCurrentPath("awesomeface.png")); + + if (texture.data) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.width, texture.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.data); + glGenerateMipmap(GL_TEXTURE_2D); + } else { + std::cout << "Failed to load texture." << std::endl; + } +} + + // activate the shader + shader.activate(); + + // tell the shader what texture unit the textures are on + shader.setInt("texture1", 0); + shader.setInt("texture2", 1); // Create a render loop, which keeps the program open until glfw tells the loop that the window should close. while (!glfwWindowShouldClose(window)) { @@ -198,8 +227,12 @@ int main() { // Clear the screen and use the color from the state. glClear(GL_COLOR_BUFFER_BIT); - // activate the shader - shader->activate(); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture1); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, texture2); + + shader.activate(); if (!rectangleToggled) { // Bind the state to use the vertexArrayObject object so OpenGL knows what to do with the verticies. @@ -219,11 +252,7 @@ int main() { // Check if any events are triggered. glfwPollEvents(); } - - // Clean up objects from memory. - delete triangleRenderObjs; - delete rectangleRenderObjs; - delete shader; +} glfwTerminate(); return 0; diff --git a/src/meson.build b/src/meson.build index 2b665cb..902cb98 100644 --- a/src/meson.build +++ b/src/meson.build @@ -10,6 +10,7 @@ copy = find_program('cp') fragment = custom_target('fragment', output: 'fragment.glsl', input: 'fragment.glsl', command: [copy, '@INPUT@', '@OUTPUT@']) vertex = custom_target('vertex', output: 'vertex.glsl', input: 'vertex.glsl', command: [copy, '@INPUT@', '@OUTPUT@']) container = custom_target('container', output: 'container.jpg', input: 'container.jpg', command: [copy, '@INPUT@', '@OUTPUT@']) +awesomeface = custom_target('awesomeface', output: 'awesomeface.png', input: 'awesomeface.png', command: [copy, '@INPUT@', '@OUTPUT@']) -executable('main', [sources] + [fragment, vertex, container], dependencies: [glfw, libepoxy]) +executable('main', [sources, fragment, vertex, container, awesomeface], dependencies: [glfw, libepoxy]) executable('fixedfunction', ['fixedfunction.cc'], dependencies: [glfw, libepoxy]) diff --git a/src/shader.cc b/src/shader.cc index 49db14f..a751cbc 100644 --- a/src/shader.cc +++ b/src/shader.cc @@ -94,12 +94,12 @@ void Shader::activate() { glUseProgram(id); } -void Shader::setBool(const std::string &name, bool value) const { - glUniform1f(glGetUniformLocation(id, name.c_str()), (int)value); +void Shader::setBool(const char* name, bool value) const { + glUniform1i(glGetUniformLocation(id, name), (int)value); } -void Shader::setInt(const std::string &name, int value) const { - glUniform1f(glGetUniformLocation(id, name.c_str()), value); +void Shader::setInt(const char* name, int value) { + glUniform1i(glGetUniformLocation(id, name), value); } -void Shader::setFloat(const std::string &name, float value) const { - glUniform1f(glGetUniformLocation(id, name.c_str()), value); +void Shader::setFloat(const char* name, float value) const { + glUniform1f(glGetUniformLocation(id, name), value); } diff --git a/src/shader.hh b/src/shader.hh index 6b747b1..e7877bd 100644 --- a/src/shader.hh +++ b/src/shader.hh @@ -14,9 +14,9 @@ class Shader { // activate the shader. void activate(); // utility uniform functions - void setBool(const std::string &name, bool value) const; - void setInt(const std::string &name, int value) const; - void setFloat(const std::string &name, float value) const; + void setBool(const char* name, bool value) const; + void setInt(const char* name, int value) ; + void setFloat(const char* name, float value) const; private: uint compileShader(std::string code, GLenum type, std::string shaderTypeName); uint compileVertexShader(std::string code); diff --git a/src/utilities.cc b/src/utilities.cc index cda6226..49e4f5a 100644 --- a/src/utilities.cc +++ b/src/utilities.cc @@ -4,6 +4,7 @@ #include #include #include +#include std::string utilities::getCurrentPath() { char result[PATH_MAX]; @@ -14,6 +15,10 @@ std::string utilities::getCurrentPath() { return utilities::combineString(stringVector, '/'); } +std::string utilities::getCurrentPath(std::string file) { + return std::format("{}/{}", getCurrentPath(), file); +} + std::vector utilities::splitString(std::string string, char delimiter) { size_t last = 0; size_t next = 0; diff --git a/src/utilities.hh b/src/utilities.hh index fb32785..7745cdc 100644 --- a/src/utilities.hh +++ b/src/utilities.hh @@ -5,6 +5,7 @@ namespace utilities { std::string getCurrentPath(); + std::string getCurrentPath(std::string file); std::vector splitString(std::string string, char delimiter); std::string combineString(std::vector stringVector, char delimiter); }