diff --git a/.gitmodules b/.gitmodules index d755c53..8ae2790 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "digraphene-headers"] path = digraphene-headers url = https://gitlab.com/TestingPlant/digraphene-headers.git +[submodule "stb"] + path = stb + url = https://github.com/nothings/stb.git diff --git a/native/main.cpp b/native/main.cpp index 21b2cdc..a03eda8 100644 --- a/native/main.cpp +++ b/native/main.cpp @@ -14,13 +14,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#define STB_IMAGE_IMPLEMENTATION +#include #include #include #include #include #include #include -#include typedef struct { linalg::aliases::float2 position; @@ -122,6 +123,16 @@ int main() { GLFWwindow* window = glfwCreateWindow(resultLength, resultLength, "You aren't supposed to see this", NULL, NULL); glfwMakeContextCurrent(window); + int contextFlags; + glGetIntegerv(GL_CONTEXT_FLAGS, &contextFlags); + if (contextFlags & GL_CONTEXT_FLAG_DEBUG_BIT) { + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(onDebugOutput, NULL); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE); + } else { + std::cerr << "Warning: Debug context could not be created.\n"; + } + // Load a square /* 0--1 @@ -170,13 +181,15 @@ int main() { shader.use(); // Set up a framebuffer - /*unsigned int frameBuffer; + unsigned int frameBuffer; glGenFramebuffers(1, &frameBuffer); glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); unsigned int colorBuffer; glGenTextures(1, &colorBuffer); glBindTexture(GL_TEXTURE_2D, colorBuffer); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, resultLength, resultLength, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resultLength, resultLength, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0); unsigned int renderBuffer; glGenRenderbuffers(1, &renderBuffer); @@ -185,13 +198,48 @@ int main() { glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer); assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE && "Generated framebuffer is incomplete"); -*/ - glClearColor(0.5, 0, 0, 1); + unsigned int texture, normal; + // Load the image + { + int width, height; + unsigned char* data = stbi_load("../test.png", &width, &height, nullptr, 0); + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); + stbi_image_free(data); + + glUniform1i(glGetUniformLocation(shader.id, "aTexture"), 0); + } + + glClearColor(0.25, 0.25, 0.25, 1); + glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_SRC_ALPHA); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + const float increment = -1.0f/30.0f; + float offset = 0; while (!glfwWindowShouldClose(window)) { + glUniform1f(glGetUniformLocation(shader.id, "aHorizontalOffset"), offset); + offset += increment; + if (offset <= -1) + offset = 0; + + glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); + glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), -1); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture); + square.draw(); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glUniform1f(glGetUniformLocation(shader.id, "aTexCoordYScale"), 1); glClear(GL_COLOR_BUFFER_BIT); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, colorBuffer); square.draw(); glfwSwapBuffers(window); glfwPollEvents(); diff --git a/shaders/fragment.glsl b/shaders/fragment.glsl index 297e587..8d6bcd3 100644 --- a/shaders/fragment.glsl +++ b/shaders/fragment.glsl @@ -5,28 +5,33 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with this program. If not, see . */ #version 330 core -in vec2 vTexCoord; +in vec2 vFragCoord; -uniform sampler2D aTexture0; +uniform float aHorizontalOffset; +uniform sampler2D aTexture; void main() { - /* - dot(vTexCoord, vTexCoord) - essentially does pow(length(gl_FragCoord.xy),2), but - (probably) more optimized + float distanceFromCenterSquared = dot(vFragCoord, vFragCoord); - We're doing this since we don't want fragments outside a circle - */ - float alpha = dot(vTexCoord, vTexCoord) > 1 ? 1 : 0; + // alpha = 0 if fragment is outside circle + // alpha = 1 if fragment is inside circle + float alpha = distanceFromCenterSquared > 1 ? 0 : 1; - gl_FragColor = vec4(0, 0, 0, alpha); + // An equation which seems to work + float specular = distanceFromCenterSquared * (-0.5f*vFragCoord.x + vFragCoord.y) + 1; + + vec2 texCoord = vFragCoord * vec2(0.5,0.5) + vec2(0.5+aHorizontalOffset,0.5); + + gl_FragColor = vec4(texture(aTexture, texCoord).xyz*specular, alpha); } diff --git a/shaders/vertex.glsl b/shaders/vertex.glsl index b50f81a..2ac7401 100644 --- a/shaders/vertex.glsl +++ b/shaders/vertex.glsl @@ -18,9 +18,12 @@ layout (location = 0) in vec2 aPosition; -out vec2 vTexCoord; +out vec2 vFragCoord; + +// Set to 1 or -1 to flip Y +uniform float aTexCoordYScale; void main() { gl_Position = vec4(aPosition, 0, 1); - vTexCoord = aPosition; + vFragCoord = aPosition * vec2(1, aTexCoordYScale); } diff --git a/stb b/stb new file mode 160000 index 0000000..b42009b --- /dev/null +++ b/stb @@ -0,0 +1 @@ +Subproject commit b42009b3b9d4ca35bc703f5310eedc74f584be58