fix render advanced pipeline issues

This commit is contained in:
MihailRis
2025-07-12 17:31:55 +03:00
parent 0ab23a117d
commit ac9772cd67
12 changed files with 192 additions and 86 deletions
+4
View File
@@ -96,3 +96,7 @@ uint Framebuffer::getWidth() const {
uint Framebuffer::getHeight() const {
return height;
}
uint Framebuffer::getFBO() const {
return fbo;
}
+2
View File
@@ -37,4 +37,6 @@ public:
uint getWidth() const;
/// @brief Get framebuffer height
uint getHeight() const;
uint getFBO() const;
};
+2 -2
View File
@@ -181,9 +181,9 @@ void GBuffer::bindSSAOBuffer() const {
glBindTexture(GL_TEXTURE_2D, ssaoBuffer);
}
void GBuffer::bindDepthBuffer() {
void GBuffer::bindDepthBuffer(int drawFbo) {
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height,
GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}
+1 -1
View File
@@ -16,7 +16,7 @@ public:
void bindBuffers() const;
void bindSSAOBuffer() const;
void bindDepthBuffer();
void bindDepthBuffer(int drawFbo);
void resize(uint width, uint height);
+78 -46
View File
@@ -77,7 +77,9 @@ void PostProcessing::refreshFbos(uint width, uint height) {
}
void PostProcessing::bindDepthBuffer() {
gbuffer->bindDepthBuffer();
if (gbuffer) {
gbuffer->bindDepthBuffer(fbo->getFBO());
}
}
void PostProcessing::configureEffect(
@@ -118,7 +120,7 @@ void PostProcessing::configureEffect(
shader.uniformMatrix("u_inverseView", glm::inverse(camera.getView()));
}
void PostProcessing::render(
void PostProcessing::renderDeferredShading(
const DrawContext& context,
const Assets& assets,
float timer,
@@ -129,18 +131,9 @@ void PostProcessing::render(
const glm::mat4& shadowMatrix2,
uint shadowMapResolution
) {
if (fbo == nullptr && gbuffer == nullptr) {
throw std::runtime_error("'use(...)' was never called");
if (gbuffer == nullptr) {
throw std::runtime_error("gbuffer is not initialized");
}
int totalPasses = 0;
for (const auto& effect : effectSlots) {
totalPasses +=
(effect != nullptr && effect->isActive() &&
!(effect->isAdvanced() && gbuffer == nullptr));
}
const auto& vp = context.getViewport();
refreshFbos(vp.x, vp.y);
glActiveTexture(GL_TEXTURE0 + TARGET_SHADOWS0);
glBindTexture(GL_TEXTURE_2D, shadowMap);
@@ -149,43 +142,47 @@ void PostProcessing::render(
glBindTexture(GL_TEXTURE_2D, shadowMap2);
// Generating ssao
if (gbuffer) {
gbuffer->bindBuffers();
gbuffer->bindBuffers();
glActiveTexture(GL_TEXTURE0 + TARGET_SSAO);
glBindTexture(GL_TEXTURE_2D, noiseTexture);
glActiveTexture(GL_TEXTURE0 + TARGET_SSAO);
glBindTexture(GL_TEXTURE_2D, noiseTexture);
glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE0);
auto& ssaoEffect = assets.require<PostEffect>("ssao");
auto& shader = ssaoEffect.use();
configureEffect(
context,
ssaoEffect,
shader,
timer,
camera,
shadowMap,
shadowMap2,
shadowMatrix,
shadowMatrix2,
shadowMapResolution
);
gbuffer->bindSSAO();
quadMesh->draw();
gbuffer->unbind();
auto& ssaoEffect = assets.require<PostEffect>("ssao");
auto& shader = ssaoEffect.use();
configureEffect(
context,
ssaoEffect,
shader,
timer,
camera,
shadowMap,
shadowMap2,
shadowMatrix,
shadowMatrix2,
shadowMapResolution
);
gbuffer->bindSSAO();
quadMesh->draw();
gbuffer->unbind();
{
auto viewport = context.getViewport();
refreshFbos(viewport.x, viewport.y);
auto ctx = context.sub();
ctx.setFramebuffer(fbo.get());
glActiveTexture(GL_TEXTURE0 + TARGET_SSAO);
gbuffer->bindSSAOBuffer();
} else {
glActiveTexture(GL_TEXTURE0);
fbo->getTexture()->bind();
}
if (totalPasses == 0) {
auto& effect = assets.require<PostEffect>(
gbuffer ? "deferred_lighting" : "default"
);
glActiveTexture(GL_TEXTURE0);
gbuffer->bindBuffers();
// TODO: move upper & move skybox->draw(...) here
auto& effect = assets.require<PostEffect>("deferred_lighting");
auto& shader = effect.use();
configureEffect(
context,
@@ -200,6 +197,44 @@ void PostProcessing::render(
shadowMapResolution
);
quadMesh->draw();
}
}
void PostProcessing::render(
const DrawContext& context,
const Assets& assets,
float timer,
const Camera& camera,
uint shadowMap,
uint shadowMap2,
const glm::mat4& shadowMatrix,
const glm::mat4& shadowMatrix2,
uint shadowMapResolution
) {
if (fbo == nullptr) {
throw std::runtime_error("'use(...)' was never called");
}
int totalPasses = 0;
for (const auto& effect : effectSlots) {
totalPasses +=
(effect != nullptr && effect->isActive() &&
!(effect->isAdvanced() && gbuffer == nullptr));
}
const auto& vp = context.getViewport();
refreshFbos(vp.x, vp.y);
glActiveTexture(GL_TEXTURE0);
fbo->getTexture()->bind();
if (totalPasses == 0) {
// TODO: move upper & move skybox->draw(...) here
auto& effect = assets.require<PostEffect>("default");
auto& shader = effect.use();
configureEffect(
context, effect, shader, timer, camera, 0, 0, {}, {}, 0
);
quadMesh->draw();
return;
}
@@ -251,9 +286,6 @@ PostEffect* PostProcessing::getEffect(size_t slot) {
}
std::unique_ptr<ImageData> PostProcessing::toImage() {
if (gbuffer) {
return gbuffer->toImage();
}
return fbo->getTexture()->readData();
}
+12
View File
@@ -35,6 +35,18 @@ public:
/// @param context graphics context will be modified
void use(DrawContext& context, bool gbufferPipeline);
void renderDeferredShading(
const DrawContext& context,
const Assets& assets,
float timer,
const Camera& camera,
uint shadowMap,
uint shadowMap2,
const glm::mat4& shadowMatrix,
const glm::mat4& shadowMatrix2,
uint shadowMapResolution
);
/// @brief Render fullscreen quad using the passed shader
/// with framebuffer texture bound
/// @param context graphics context