diff options
author | Sebastian Park <SebPark03@gmail.com> | 2024-05-05 02:41:56 -0400 |
---|---|---|
committer | Sebastian Park <SebPark03@gmail.com> | 2024-05-05 02:41:56 -0400 |
commit | 551b160b816cdfa446de800140aa1c7aef352b19 (patch) | |
tree | 3f5c1f7c24f187e0dae9da6c95538312cdb11489 /src | |
parent | 045eb047c556898606005e548c16f102ac02e995 (diff) |
Get FBOs working.
Diffstat (limited to 'src')
-rwxr-xr-x | src/glwidget.cpp | 138 | ||||
-rwxr-xr-x | src/glwidget.h | 19 | ||||
-rw-r--r-- | src/graphics/shape.cpp | 2 |
3 files changed, 159 insertions, 0 deletions
diff --git a/src/glwidget.cpp b/src/glwidget.cpp index 7d56389..c13d476 100755 --- a/src/glwidget.cpp +++ b/src/glwidget.cpp @@ -77,7 +77,10 @@ void GLWidget::initializeGL() m_defaultShader = new Shader(":resources/shaders/shader.vert", ":resources/shaders/shader.frag"); m_pointShader = new Shader(":resources/shaders/anchorPoint.vert", ":resources/shaders/anchorPoint.geom", ":resources/shaders/anchorPoint.frag"); // m_texture_shader = new Shader(":/resources/shaders/texture.vert", ":/resources/shaders/texture.frag"); + m_colorShader = new Shader(":resources/shaders/color.vert", ":resources/shaders/color.frag"); + + initCaustics(); // INITIALIZE TEXTURE STUFF // Prepare filepath @@ -95,6 +98,19 @@ void GLWidget::initializeGL() // -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // 1.0f, -1.0f, 0.0f, 1.0f, 0.0f // }; + + // START FBO STUFF + + m_devicePixelRatio = this->devicePixelRatio(); + + m_defaultFBO = 2; + m_fbo_width = size().width() * m_devicePixelRatio; + m_fbo_height = size().height() * m_devicePixelRatio; + + makeFBO(); + + // FBO STUFF END + m_arap.initSkyPlane(":/resources/images/sky_clouds.png", 2, m_defaultShader); m_arap.initGroundPlane(":/resources/images/daniel.jpg", 2, m_defaultShader); @@ -151,6 +167,89 @@ void GLWidget::initializeGL() } +void GLWidget::paintCaustics() { + glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); + + // Task 15: Clear the screen here + + // TA SOLUTION + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Bind the shader + m_colorShader->bind(); + + // Task 16: Bind your VAO here + + // TA SOLUTION + glBindVertexArray(m_floor_vao); + + // Task 17: Draw your VAO here + + // TA SOLUTION + glDrawArrays(GL_TRIANGLES, 0, 3); + + // Task 18: Unbind your VAO here + + // TA SOLUTION + glBindVertexArray(0); + + // Unbind the shader + glUseProgram(0); +} + +void GLWidget::initCaustics() { + glGenBuffers(1, &m_floor_vbo); + + // Task 6: Bind the VBO you created here + + // TA SOLUTION + glBindBuffer(GL_ARRAY_BUFFER, m_floor_vbo); + + // Task 8: Construct your std::vector of triangle data here | Task 10: Add colors to your triangle here + + // TA SOLUTION + std::vector<GLfloat> triangle = + { // POSITIONS // COLORS // + -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f + }; + + // Task 9: Pass the triangle vector into your VBO here + + // TA SOLUTION + glBufferData(GL_ARRAY_BUFFER, triangle.size() * sizeof(GLfloat), triangle.data(), GL_STATIC_DRAW); + + // ================== Vertex Array Objects + + // Task 11: Generate a VAO here and store it in m_vao + + // TA SOLUTION + glGenVertexArrays(1, &m_floor_vao); + + // Task 12: Bind the VAO you created here + + // TA SOLUTION + glBindVertexArray(m_floor_vao); + + // Task 13: Add position and color attributes to your VAO here + + // TA SOLUTION + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + GLsizei stride = 6 * sizeof(GLfloat); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, nullptr); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<void *>(3 * sizeof(GLfloat))); + + // ================== Returning to Default State + + // Task 14: Unbind your VBO and VAO here + + // TA SOLUTION + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); +} + //void GLWidget::paintTexture(GLuint texture, bool filtered){ //// glUseProgram(m_texture_shader->id()); // m_texture_shader->bind(); @@ -169,8 +268,43 @@ void GLWidget::initializeGL() // m_texture_shader->unbind(); //} +void GLWidget::makeFBO() { + // Task 19 + glActiveTexture(GL_TEXTURE2); + glGenTextures(1, &m_fbo_texture); + glBindTexture(GL_TEXTURE_2D, m_fbo_texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_fbo_width, m_fbo_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); + glBindTexture(GL_TEXTURE_2D, 0); + + // Task 20 + glGenRenderbuffers(1, &m_fbo_renderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_fbo_renderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, + GL_DEPTH24_STENCIL8, + m_fbo_width, + m_fbo_height); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + // Task 18 + glGenFramebuffers(1, &m_fbo); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); + + // Task 21 + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_fbo_texture, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_fbo_renderbuffer); + + // Task 22 + glBindFramebuffer(GL_FRAMEBUFFER, m_defaultFBO); + +} + void GLWidget::paintGL() { + paintCaustics(); + glBindFramebuffer(GL_FRAMEBUFFER, m_defaultFBO); +// return; // paintTexture(m_ground_texture, false); // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -184,6 +318,10 @@ void GLWidget::paintGL() m_defaultShader->setUniform("widthBounds", m_arap.minCorner[0], m_arap.maxCorner[0]); m_defaultShader->setUniform("lengthBounds", m_arap.minCorner[2], m_arap.maxCorner[2]); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, m_fbo_texture); + glUniform1i(glGetUniformLocation(m_defaultShader->id(), "groundSampler"), 2); + m_arap.draw(m_defaultShader, GL_TRIANGLES); m_defaultShader->unbind(); diff --git a/src/glwidget.h b/src/glwidget.h index 91df32f..810829a 100755 --- a/src/glwidget.h +++ b/src/glwidget.h @@ -40,6 +40,11 @@ private: void keyPressEvent (QKeyEvent *event) override; void keyReleaseEvent (QKeyEvent *event) override; + void makeFBO(); + + void initCaustics(); + void paintCaustics(); + private slots: // Physics Tick void tick(); @@ -51,11 +56,25 @@ private: Shader *m_pointShader; Shader *m_texture_shader; + Shader *m_colorShader; + GLuint m_fullscreen_vbo; GLuint m_fullscreen_vao; QImage m_ground_image; GLuint m_ground_texture; + int m_fbo_width; + int m_fbo_height; + float m_devicePixelRatio; + + GLuint m_fbo; + GLuint m_fbo_texture; + GLuint m_fbo_renderbuffer; + GLuint m_defaultFBO; + + GLuint m_floor_vbo; + GLuint m_floor_vao; + float m_movementScaling; float m_vertexSelectionThreshold; float m_vSize; diff --git a/src/graphics/shape.cpp b/src/graphics/shape.cpp index 07af24a..980f1da 100644 --- a/src/graphics/shape.cpp +++ b/src/graphics/shape.cpp @@ -138,11 +138,13 @@ void Shape::draw(Shader *shader, GLenum mode) // Not that one texture is overwriting the other, because if we just load sky it doesn't work // Draws whatever is bound to texture0 no matter what. // Drawing the ground texture. + /* glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_ground_texture); // glBindTexture(GL_TEXTURE_2D, 0); shader->setUniform("groundSampler", 0); glUniform1i(glGetUniformLocation(shader->id(), "groundSampler"), 0); + */ // https://stackoverflow.com/questions/67277087/opengl-glsl-multiple-texture-binding-not-working // FIGURED OUT THE PROBLEM. it was that SAMPLERS WERE DEFAULTING TO SLOT 0 AND SETUNIFORM WASN'T WORKING |