feat: shadows in fast pipeline & improve lights mix

This commit is contained in:
MihailRis
2025-05-10 14:12:52 +03:00
parent 30a0b81680
commit e158b384fa
9 changed files with 62 additions and 25 deletions
+1
View File
@@ -72,6 +72,7 @@ void PostProcessing::use(DrawContext& context, bool gbufferPipeline) {
}
context.setFramebuffer(gbuffer.get());
} else {
gbuffer.reset();
refreshFbos(vp.x, vp.y);
context.setFramebuffer(fbo.get());
}
+28
View File
@@ -182,6 +182,34 @@ const Mesh<ChunkVertex>* ChunksRenderer::retrieveChunk(
return mesh;
}
void ChunksRenderer::drawChunksShadowsPass(
const Camera& camera, Shader& shader
) {
const auto& atlas = assets.require<Atlas>("blocks");
atlas.getTexture()->bind();
for (int i = indices.size()-1; i >= 0; i--) {
auto& chunk = chunks.getChunks()[indices[i].index];
if (chunk == nullptr) {
continue;
}
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();
}
}
}
void ChunksRenderer::drawChunks(
const Camera& camera, Shader& shader
) {
+3
View File
@@ -72,6 +72,9 @@ public:
const Mesh<ChunkVertex>* getOrRender(
const std::shared_ptr<Chunk>& chunk, bool important
);
void drawChunksShadowsPass(const Camera& camera, Shader& shader);
void drawChunks(const Camera& camera, Shader& shader);
void drawSortedMeshes(const Camera& camera, Shader& shader);
+7 -7
View File
@@ -103,7 +103,7 @@ WorldRenderer::WorldRenderer(
assets->require<Shader>("skybox_gen")
);
shadowMap = std::make_unique<ShadowMap>(1024 * 4);
shadowMap = std::make_unique<ShadowMap>(1024 * 8);
shadowCamera = std::make_unique<Camera>();
}
@@ -133,9 +133,9 @@ void WorldRenderer::setupWorldShader(
shader.uniform2f("u_lightDir", skybox->getLightDir());
shader.uniform3f("u_cameraPos", camera.position);
shader.uniform1i("u_skybox", 1);
shader.uniform1i("u_enableShadows", gbufferPipeline);
shader.uniform1i("u_enableShadows", shadows);
if (gbufferPipeline) {
if (shadows) {
shader.uniformMatrix("u_shadowsMatrix", shadowCamera->getProjView());
shader.uniform3f("u_sunDir", shadowCamera->front);
shader.uniform1i("u_shadowsRes", shadowMap->getResolution());
@@ -374,7 +374,7 @@ void WorldRenderer::draw(
auto& linesShader = assets.require<Shader>("lines");
auto& shadowsShader = assets.require<Shader>("shadows");
if (gbufferPipeline) {
if (shadows) {
int resolution = shadowMap->getResolution();
float shadowMapScale = 0.05f;
float shadowMapSize = resolution * shadowMapScale;
@@ -384,7 +384,7 @@ void WorldRenderer::draw(
shadowCamera->perspective = false;
shadowCamera->setAspectRatio(1.0f);
shadowCamera->rotate(
glm::radians(90.0f - worldInfo.daytime * 360.0f),
glm::radians(fmod(90.0f - worldInfo.daytime * 360.0f, 180.0f)),
glm::radians(-40.0f),
glm::radians(-0.0f)
);
@@ -402,7 +402,7 @@ void WorldRenderer::draw(
sctx.setViewport({resolution, resolution});
shadowMap->bind();
setupWorldShader(shadowsShader, *shadowCamera, settings, 0.0f);
chunks->drawChunks(*shadowCamera, shadowsShader);
chunks->drawChunksShadowsPass(*shadowCamera, shadowsShader);
shadowMap->unbind();
}
}
@@ -444,7 +444,7 @@ void WorldRenderer::draw(
assets,
timer,
camera,
gbufferPipeline ? shadowMap->getDepthMap() : 0
shadows ? shadowMap->getDepthMap() : 0
);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);
+2 -1
View File
@@ -54,7 +54,8 @@ class WorldRenderer {
float timer = 0.0f;
bool debug = false;
bool lightsDebug = false;
bool gbufferPipeline = true;
bool gbufferPipeline = false;
bool shadows = true;
/// @brief Render block selection lines
void renderBlockSelection();