diff --git a/src/main.cpp b/src/main.cpp index c847ade..c167a43 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,7 +42,7 @@ public: m_registry.emplace(cameraEntity, glm::vec3(0.f, 2.f, 2.f)); m_registry.emplace(cameraEntity); - Object* targetObj = Object::LoadFile("./assets/cube.obj"); + Object* targetObj = Object::LoadFile("./assets/wizard/wizard.obj"); const auto targetEntity = m_registry.create(); m_registry.emplace(targetEntity, glm::vec3(0.f, 0.5f, 0.f)); m_registry.emplace(targetEntity, std::unique_ptr(targetObj)); diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index 55a7069..52364cb 100644 --- a/src/renderer/renderer.cpp +++ b/src/renderer/renderer.cpp @@ -158,23 +158,39 @@ void Renderer::Render(entt::registry& registry) { auto shadowLight = registry.view().back(); auto &comp = registry.get(shadowLight); - float near_plane = -10.0f, far_plane = 20.0f; - glm::mat4 lightProjection = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane); - - glm::mat4 lightView = glm::lookAt(comp.position, - glm::vec3( 0.0f, 0.0f, 0.0f), - glm::vec3( 0.0f, 1.0f, 0.0f)); - + float near_plane = 0.1f, far_plane = 50.0f; // pick bounds that cover your scene + glm::vec3 lightPos = comp.position; + glm::vec3 target = glm::vec3(0.0f, 0.5f, 0.0f); + glm::mat4 lightView = glm::lookAt(lightPos, target, glm::vec3(0.0f, 1.0f, 0.0f)); + glm::mat4 lightProjection = glm::ortho(-6.0f, 6.0f, -6.0f, 6.0f, 1.0f, 20.0f); glm::mat4 lightSpaceMatrix = lightProjection * lightView; + + // lightView = glm::lookAt(/*eye*/ -lightDir * distance, /*center*/ vec3(0), up) + + // glm::mat4 lightSpaceMatrix = lightProjection * lightView; SwitchShader(&m_depthShader); m_currentShader->setMat4("u_lightSpace", lightSpaceMatrix); + // enable culling and render front faces to the shadow map + glEnable(GL_CULL_FACE); + glCullFace(GL_FRONT); // only for the depth pass + // or use polygon offset: + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(2.0f, 4.0f); + glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); glBindFramebuffer(GL_FRAMEBUFFER, m_depth_fbo); glClear(GL_DEPTH_BUFFER_BIT); RenderScene(registry); glBindFramebuffer(GL_FRAMEBUFFER, 0); + // enable culling and render front faces to the shadow map + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); // only for the depth pass + // or use polygon offset: + glDisable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(0.f, 1.f); + glViewport(0, 0, Window::GetWidth(), Window::GetHeight()); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/src/shaders/pbr.fs b/src/shaders/pbr.fs index 458c375..f728665 100644 --- a/src/shaders/pbr.fs +++ b/src/shaders/pbr.fs @@ -60,7 +60,7 @@ float ShadowCalculation(vec4 fragPosLightSpace, vec3 N, vec3 L) float currentDepth = projCoords.z; // bias to prevent self-shadowing (depend on slope) - float bias = max(0.05 * (1.0 - dot(N, L)), 0.005); + float bias = max(0.001 * (1.0 - dot(N, L)), 0.0005); // PCF (3x3) float shadow = 0.0;