From 6debc92ae5cf5a23515eb46c2a4df4ff2591eaa8 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 22 Jul 2025 01:41:52 +0300 Subject: [PATCH] optimize shadow maps generation a bit --- src/graphics/render/ChunksRenderer.cpp | 29 +++++++++++++++++++------- src/graphics/render/WorldRenderer.cpp | 1 - 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index 284ebb43..7238cb19 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -185,6 +185,9 @@ const Mesh* ChunksRenderer::retrieveChunk( void ChunksRenderer::drawChunksShadowsPass( const Camera& camera, Shader& shader ) { + Frustum frustum; + frustum.update(camera.getProjView()); + const auto& atlas = assets.require("blocks"); atlas.getTexture()->bind(); @@ -193,19 +196,29 @@ void ChunksRenderer::drawChunksShadowsPass( if (chunk == nullptr) { continue; } + glm::ivec2 pos {chunk->x, chunk->z}; const auto& found = meshes.find({chunk->x, chunk->z}); if (found == meshes.end()) { continue; } - auto mesh = found->second.mesh.get(); - if (mesh) { - glm::vec3 coord( - chunk->x * CHUNK_W + 0.5f, 0.5f, chunk->z * CHUNK_D + 0.5f - ); - glm::mat4 model = glm::translate(glm::mat4(1.0f), coord); - shader.uniformMatrix("u_model", model); - mesh->draw(); + + glm::vec3 coord( + pos.x * CHUNK_W + 0.5f, 0.5f, pos.y * CHUNK_D + 0.5f + ); + + glm::vec3 min(pos.x * CHUNK_W, chunk->bottom, chunk->z * CHUNK_D); + glm::vec3 max( + chunk->x * CHUNK_W + CHUNK_W, + chunk->top, + chunk->z * CHUNK_D + CHUNK_D + ); + + if (!frustum.isBoxVisible(min, max)) { + continue; } + glm::mat4 model = glm::translate(glm::mat4(1.0f), coord); + shader.uniformMatrix("u_model", model); + found->second.mesh->draw(); } } diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 93039d2c..065673ba 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -400,7 +400,6 @@ void WorldRenderer::generateShadowsMap( shadowCamera.setProjection(glm::ortho(min.x, max.x, min.y, max.y, 0.1f, 1000.0f)); { - frustumCulling->update(shadowCamera.getProjView()); auto sctx = pctx.sub(); sctx.setDepthTest(true); sctx.setCullFace(true);