From ea80851450812c6f621ba4aa920aee5c202b7a88 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 31 Aug 2026 11:45:26 -0400 Subject: [PATCH] First edit for framebuffers but it's slapped together and doesn't work yet. --- 21-framebuffers/config.json | 8 ++- 21-framebuffers/shaders/21-screen.frag.glsl | 11 ++++ 21-framebuffers/shaders/21-screen.vert.glsl | 11 ++++ 21-framebuffers/src/components.hpp | 4 +- 21-framebuffers/src/main.cpp | 4 ++ 21-framebuffers/src/scene.cpp | 23 ++++++-- 21-framebuffers/src/scene.hpp | 59 ++++++++++++++++++++- 21-framebuffers/tests/config.json | 4 +- 8 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 21-framebuffers/shaders/21-screen.frag.glsl create mode 100644 21-framebuffers/shaders/21-screen.vert.glsl diff --git a/21-framebuffers/config.json b/21-framebuffers/config.json index 4ffaa41..b80fd17 100644 --- a/21-framebuffers/config.json +++ b/21-framebuffers/config.json @@ -8,6 +8,10 @@ "vertex_path": "shaders/19-vert.glsl", "frag_path": "shaders/19-lightsource.frag.glsl" }, + "screen_shader": { + "vertex_path": "shaders/21-screen.vert.glsl", + "frag_path": "shaders/21-screen.frag.glsl" + }, "materials": { "default": { "ambient": [0.5, 0.5, 0.5], @@ -57,11 +61,11 @@ "rotation": {"angle": 90.0, "axes": [1.0,0.0,0.0]}, "scale": 1.0, "material": "default"}, - {"model": "window", "position": [1.75, 0.25, 0.25], + {"model": "window", "position": [1.5, 0.25, 0.0], "rotation": {"angle": 90.0, "axes": [1.0,0.0,0.0]}, "scale": 1.0, "material": "shiny"}, - {"model": "window", "position": [1.5, 0.25, 0.0], + {"model": "window", "position": [1.75, 0.25, 0.25], "rotation": {"angle": 90.0, "axes": [1.0,0.0,0.0]}, "scale": 1.0, "material": "shiny"} diff --git a/21-framebuffers/shaders/21-screen.frag.glsl b/21-framebuffers/shaders/21-screen.frag.glsl new file mode 100644 index 0000000..193eab0 --- /dev/null +++ b/21-framebuffers/shaders/21-screen.frag.glsl @@ -0,0 +1,11 @@ +#version 330 core +out vec4 FragColor; + +in vec2 TexCoords; + +uniform sampler2D screenTexture; + +void main() +{ + FragColor = texture(screenTexture, TexCoords); +} diff --git a/21-framebuffers/shaders/21-screen.vert.glsl b/21-framebuffers/shaders/21-screen.vert.glsl new file mode 100644 index 0000000..19a8fe3 --- /dev/null +++ b/21-framebuffers/shaders/21-screen.vert.glsl @@ -0,0 +1,11 @@ +#version 330 core +layout (location = 0) in vec2 aPos; +layout (location = 1) in vec2 aTexCoords; + +out vec2 TexCoords; + +void main() +{ + gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); + TexCoords = aTexCoords; +} diff --git a/21-framebuffers/src/components.hpp b/21-framebuffers/src/components.hpp index c6a34cd..ff9ff06 100644 --- a/21-framebuffers/src/components.hpp +++ b/21-framebuffers/src/components.hpp @@ -102,7 +102,7 @@ namespace components { struct Scene { components::Shader shader; - components::Shader light_shader; + components::Shader screen_shader; std::unordered_map materials; std::unordered_map models; std::vector things; @@ -110,5 +110,5 @@ namespace components { Lighting light; }; - ENROLL_COMPONENT(Scene, shader, light_shader, materials, models, things, camera, light); + ENROLL_COMPONENT(Scene, shader, screen_shader, materials, models, things, camera, light); } diff --git a/21-framebuffers/src/main.cpp b/21-framebuffers/src/main.cpp index c127f55..069b5fc 100644 --- a/21-framebuffers/src/main.cpp +++ b/21-framebuffers/src/main.cpp @@ -10,6 +10,10 @@ void init_glfw() { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + +#ifdef __APPLE__ + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); +#endif } void framebuffer_size_callback(GLFWwindow *, int width, int height) { diff --git a/21-framebuffers/src/scene.cpp b/21-framebuffers/src/scene.cpp index 5632a18..c9cd9d9 100644 --- a/21-framebuffers/src/scene.cpp +++ b/21-framebuffers/src/scene.cpp @@ -34,15 +34,19 @@ void Scene::draw_thing(Shader& with_shader, Thing& thing) } void Scene::render(GLFWwindow* window) { - glClearColor(0.1f, 0.1f, 0.1f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glm::mat4 view = camera.look_at(); glm::mat4 projection = glm::mat4(1.0f); // fov, aspect, near plane, far plane projection = glm::perspective(glm::radians(camera.fov), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); + // framebuffer stuff here + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glEnable(GL_DEPTH_TEST); + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // render the scene shader.use(); shader.setMat4("view", view); shader.setMat4("projection", projection); @@ -50,6 +54,19 @@ void Scene::render(GLFWwindow* window) { for(auto& thing : things) { draw_thing(shader, thing); } + + // disable the frame buffer + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDisable(GL_DEPTH_TEST); + + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // render the screen quad + screen_shader.use(); + glBindVertexArray(quadVAO); + glBindTexture(GL_TEXTURE_2D, textureColorBuffer); + glDrawArrays(GL_TRIANGLES, 0, 6); } void Scene::cleanup() { diff --git a/21-framebuffers/src/scene.hpp b/21-framebuffers/src/scene.hpp index 9a47069..983ed11 100644 --- a/21-framebuffers/src/scene.hpp +++ b/21-framebuffers/src/scene.hpp @@ -26,7 +26,7 @@ struct Thing { struct Scene { Shader shader; - Shader light_shader; + Shader screen_shader; std::unordered_map materials; Camera camera; @@ -36,10 +36,27 @@ struct Scene { float deltaTime = 0.0f; float lastFrame = 0.0f; + unsigned int framebuffer = 0; + unsigned int textureColorBuffer = 0; + unsigned int quadVAO = 0; + unsigned int quadVBO = 0; + unsigned int rbo = 0; + + float quadVertices[24] = { + // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates. + // positions // texCoords + -1.0f, 1.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 0.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, + + -1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, -1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 1.0f + }; Scene(components::Scene& config): shader{config.shader.vertex_path, config.shader.frag_path}, - light_shader{config.light_shader.vertex_path, config.shader.frag_path}, + screen_shader{config.screen_shader.vertex_path, config.shader.frag_path}, materials{config.materials}, camera{ .position=config.camera.position, @@ -64,8 +81,46 @@ struct Scene { thing.scale); } + // screen quadVAO + glGenVertexArrays(1, &quadVAO); + glGenBuffers(1, &quadVBO); + glBindVertexArray(quadVAO); + glBindBuffer(GL_ARRAY_BUFFER, quadVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float))); + + + // framebuffer config + glGenFramebuffers(1, &framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + + // create a color attachment texture + glGenTextures(1, &textureColorBuffer); + glBindTexture(GL_TEXTURE_2D, textureColorBuffer); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, 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, textureColorBuffer, 0); + + // create renderbuffer object for depth and stencil attachment + glGenRenderbuffers(1, &rbo); + glBindRenderbuffer(GL_RENDERBUFFER, rbo); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, SCR_WIDTH, SCR_HEIGHT); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + dbc::check(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE, "Frame buffer not complete."); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + shader.use(); shader.apply_lighting(light); + + screen_shader.use(); + screen_shader.setInt("screenTexture", 0); } void update(); diff --git a/21-framebuffers/tests/config.json b/21-framebuffers/tests/config.json index ac94d29..adef418 100644 --- a/21-framebuffers/tests/config.json +++ b/21-framebuffers/tests/config.json @@ -72,7 +72,7 @@ "material": "default" }, "shader_test": { - "vertex_path": "shaders/16-vert.glsl", - "frag_path": "shaders/16-frag.glsl" + "vertex_path": "shaders/19-vert.glsl", + "frag_path": "shaders/19-frag.glsl" } }