From 8174ebaee495adcb7d0957e3d479bb13667a6930 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 21 Jan 2021 16:11:41 +0100 Subject: [PATCH] Added support for PNG --- examples/debug/assets/opengl.png | Bin 0 -> 39028 bytes examples/debug/main.cpp | 12 ++++++++++-- examples/debug/shaders/fragmentShader.frag | 5 +++-- include/texture.hpp | 2 +- src/texture.cpp | 14 +++++++++++++- 5 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 examples/debug/assets/opengl.png diff --git a/examples/debug/assets/opengl.png b/examples/debug/assets/opengl.png new file mode 100644 index 0000000000000000000000000000000000000000..5be3706e9b278cc7d36c37aafbe30ac3af93797c GIT binary patch literal 39028 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 literal 0 HcmV?d00001 diff --git a/examples/debug/main.cpp b/examples/debug/main.cpp index d5f6e6d..97f6f6c 100644 --- a/examples/debug/main.cpp +++ b/examples/debug/main.cpp @@ -76,7 +76,8 @@ int main(int argc, char** argv) } // Create a texture - oglu::Texture texture = oglu::MakeTexture("assets/crate.jpg"); + oglu::Texture crate = oglu::MakeTexture("assets/crate.jpg"); + oglu::Texture opengl = oglu::MakeTexture("assets/opengl.png"); // Window loop while (!glfwWindowShouldClose(window)) @@ -85,8 +86,15 @@ int main(int argc, char** argv) oglu::ClearScreen(GL_COLOR_BUFFER_BIT, oglu::Color(0.29f, 0.13f, 0.23f)); + oglu::ActiveTexture(0); + crate->Bind(); + oglu::ActiveTexture(1); + opengl->Bind(); + shader->Use(); - texture->Bind(); + shader->SetUniform("texture1", 0); + shader->SetUniform("texture2", 1); + square->BindAndDraw(); glfwSwapBuffers(window); diff --git a/examples/debug/shaders/fragmentShader.frag b/examples/debug/shaders/fragmentShader.frag index d60e23e..bbc8224 100644 --- a/examples/debug/shaders/fragmentShader.frag +++ b/examples/debug/shaders/fragmentShader.frag @@ -4,9 +4,10 @@ in vec2 oUV; out vec4 FragColor; -uniform sampler2D ourTexture; +uniform sampler2D texture1; +uniform sampler2D texture2; void main() { - FragColor = texture(ourTexture, oUV) * vec4(oCol, 1.0); + FragColor = mix(texture(texture1, oUV), texture(texture2, oUV), 0.2); } \ No newline at end of file diff --git a/include/texture.hpp b/include/texture.hpp index 459f2f9..4806b97 100644 --- a/include/texture.hpp +++ b/include/texture.hpp @@ -19,7 +19,7 @@ namespace oglu * * @param[in] index Index of the texture unit (Note: This index is actually an offset to @p GL_TEXTURE0) */ - void ActiveTexture(GLubyte index); + void OGLU_API ActiveTexture(GLubyte index); /** * @brief An object representing an OpenGL Texture. diff --git a/src/texture.cpp b/src/texture.cpp index 4f7387b..aa550e1 100644 --- a/src/texture.cpp +++ b/src/texture.cpp @@ -1,4 +1,5 @@ #include "texture.hpp" +#include #define STB_IMAGE_IMPLEMENTATION #include @@ -40,7 +41,18 @@ namespace oglu glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); + GLenum pixelFormat; + switch (nrChannels) + { + case 3: pixelFormat = GL_RGB; break; + case 4: pixelFormat = GL_RGBA; break; + default: + glDeleteTextures(1, &texture); + stbi_image_free(data); + throw std::runtime_error(std::string("Texture has unsupported pixel format: " + std::string(filename))); + } + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, pixelFormat, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); stbi_image_free(data);