void SSAO::Update(const FrameBuffer *FBO, const Camera *camera) const { ssaoFBO.Bind(); glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); Shader *ssao = Manager::Shader->GetShader("ssao"); ssao->Use(); ssao->BindTexturesUnits(); ssaoFBO.SendResolution(ssao); camera->BindViewMatrix(ssao->loc_view_matrix); camera->BindProjectionMatrix(ssao->loc_projection_matrix); camera->BindProjectionDistances(ssao); glUniform1f(ssao->loc_u_rad, radius); glUniform1i(ssao->loc_kernel_size, kernelSize); glUniform3fv(ssao->loc_kernel, kernelSize * 3, glm::value_ptr(kernel[0])); FBO->BindTexture(3, GL_TEXTURE0); FBO->BindTexture(4, GL_TEXTURE1); FBO->BindDepthTexture(GL_TEXTURE2); RandomNoise1->BindToTextureUnit(GL_TEXTURE3); RandomNoise2->BindToTextureUnit(GL_TEXTURE4); ScreenQuad->Render(ssao); // Finish TASK glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); FrameBuffer::Unbind(); // -- COMPUTE SHADER int WORK_GROUP_SIZE = 16; auto res = ssaoFBO.GetResolution(); Shader *S = Manager::Shader->GetShader("ssaoBlur"); S->Use(); // First Pass ssaoFBO.BindTexture(0, GL_TEXTURE0); glBindImageTexture(1, computeTexture->GetTextureID(), 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA16F); glDispatchCompute(GLuint(UPPER_BOUND(res.x, WORK_GROUP_SIZE)), GLuint(UPPER_BOUND(res.y, WORK_GROUP_SIZE)), 1); glMemoryBarrier(GL_ALL_BARRIER_BITS); }