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 | |
parent | 045eb047c556898606005e548c16f102ac02e995 (diff) |
Get FBOs working.
-rw-r--r-- | .DS_Store | bin | 10244 -> 10244 bytes | |||
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | CMakeLists.txt.user | 5 | ||||
-rw-r--r-- | resources/shaders/color.frag | 8 | ||||
-rw-r--r-- | resources/shaders/color.vert | 10 | ||||
-rwxr-xr-x | src/glwidget.cpp | 138 | ||||
-rwxr-xr-x | src/glwidget.h | 19 | ||||
-rw-r--r-- | src/graphics/shape.cpp | 2 |
8 files changed, 183 insertions, 1 deletions
Binary files differ diff --git a/CMakeLists.txt b/CMakeLists.txt index adf92af..6d35a8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,8 @@ qt6_add_resources(${PROJECT_NAME} "Resources" resources/shaders/anchorPoint.frag resources/shaders/texture.vert resources/shaders/texture.frag + resources/shaders/color.vert + resources/shaders/color.frag ) diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index a57a6a8..9cfaad8 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 8.0.1, 2024-04-24T11:59:03. --> +<!-- Written by QtCreator 8.0.1, 2024-04-30T18:44:58. --> <qtcreator> <data> <variable>EnvironmentId</variable> @@ -80,6 +80,9 @@ <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/> <value type="bool" key="ClangTools.UseGlobalSettings">true</value> </valuemap> + <valuemap type="QVariantMap" key="CppEditor.QuickFix"> + <value type="bool" key="UseGlobalSettings">true</value> + </valuemap> </valuemap> </data> <data> diff --git a/resources/shaders/color.frag b/resources/shaders/color.frag new file mode 100644 index 0000000..4a052a1 --- /dev/null +++ b/resources/shaders/color.frag @@ -0,0 +1,8 @@ +#version 330 core + +in vec3 col; +out vec4 fragColor; + +void main() { + fragColor = vec4(col, 1.0); +} diff --git a/resources/shaders/color.vert b/resources/shaders/color.vert new file mode 100644 index 0000000..d449122 --- /dev/null +++ b/resources/shaders/color.vert @@ -0,0 +1,10 @@ +#version 330 core + +layout (location = 0) in vec3 position; +layout (location = 1) in vec3 color; +out vec3 col; + +void main() { + gl_Position = vec4(position, 1.0); + col = color; +} 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 |