Skip to content

Commit 88cdb37

Browse files
committed
fix ambient occlusion and shadow mapping (closes AlpineMapsOrg#136)
1 parent 0396720 commit 88cdb37

File tree

3 files changed

+24
-21
lines changed

3 files changed

+24
-21
lines changed

gl_engine/ShadowMapping.cpp

+16-15
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,8 @@
3030

3131
namespace gl_engine {
3232

33-
ShadowMapping::ShadowMapping(
34-
ShaderRegistry* shader_registry, std::shared_ptr<UniformBuffer<uboShadowConfig>> shadow_config, std::shared_ptr<UniformBuffer<uboSharedConfig>> shared_config)
33+
ShadowMapping::ShadowMapping(ShaderRegistry* shader_registry)
3534
: m_shadow_program(std::make_shared<ShaderProgram>("shadowmap.vert", "shadowmap.frag"))
36-
, m_shadow_config(shadow_config)
37-
, m_shared_config(shared_config)
3835
{
3936
shader_registry->add_shader(m_shadow_program);
4037
m_f = QOpenGLContext::currentContext()->extraFunctions();
@@ -49,28 +46,32 @@ ShadowMapping::~ShadowMapping() {
4946

5047
}
5148

52-
void ShadowMapping::draw(TileGeometry* tile_geometry, const nucleus::tile::IdSet& draw_tileset, const nucleus::camera::Definition& camera)
49+
void ShadowMapping::draw(TileGeometry* tile_geometry,
50+
const nucleus::tile::IdSet& draw_tileset,
51+
const nucleus::camera::Definition& camera,
52+
std::shared_ptr<UniformBuffer<uboShadowConfig>> shadow_config,
53+
std::shared_ptr<UniformBuffer<uboSharedConfig>> shared_config)
5354
{
5455

5556
// NOTE: ReverseZ is not necessary for ShadowMapping since a directional light is using an orthographic projection
5657
// and therefore the distribution of depth is linear anyway.
5758

5859
float far_plane = 100000; // Similar to camera?
5960
float near_plane = camera.near_plane(); // Similar to camera?
60-
m_shadow_config->data.cascade_planes[0].x = near_plane;
61-
m_shadow_config->data.cascade_planes[1].x = far_plane / 50.0f;
62-
m_shadow_config->data.cascade_planes[2].x = far_plane / 25.0f;
63-
m_shadow_config->data.cascade_planes[3].x = far_plane / 10.0f;
64-
m_shadow_config->data.cascade_planes[4].x = far_plane;
65-
m_shadow_config->data.shadowmap_size = glm::vec2(SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT);
66-
67-
auto qlight_dir = m_shared_config->data.m_sun_light_dir;
61+
shadow_config->data.cascade_planes[0].x = near_plane;
62+
shadow_config->data.cascade_planes[1].x = far_plane / 50.0f;
63+
shadow_config->data.cascade_planes[2].x = far_plane / 25.0f;
64+
shadow_config->data.cascade_planes[3].x = far_plane / 10.0f;
65+
shadow_config->data.cascade_planes[4].x = far_plane;
66+
shadow_config->data.shadowmap_size = glm::vec2(SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT);
67+
68+
auto qlight_dir = shared_config->data.m_sun_light_dir;
6869
auto light_dir = -glm::vec3(qlight_dir.x(), qlight_dir.y(), qlight_dir.z());
6970

7071
for (size_t i = 0; i < SHADOW_CASCADES; ++i)
71-
m_shadow_config->data.light_space_view_proj_matrix[i] = getLightSpaceMatrix(m_shadow_config->data.cascade_planes[i].x, m_shadow_config->data.cascade_planes[i + 1].x, camera, light_dir);
72+
shadow_config->data.light_space_view_proj_matrix[i] = getLightSpaceMatrix(shadow_config->data.cascade_planes[i].x, shadow_config->data.cascade_planes[i + 1].x, camera, light_dir);
7273

73-
m_shadow_config->update_gpu_data();
74+
shadow_config->update_gpu_data();
7475

7576
m_f->glEnable(GL_DEPTH_TEST);
7677
m_f->glDepthFunc(GL_LESS);

gl_engine/ShadowMapping.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,15 @@ struct uboShadowConfig;
4646
class ShadowMapping
4747
{
4848
public:
49-
ShadowMapping(ShaderRegistry* shader_registry, std::shared_ptr<UniformBuffer<uboShadowConfig>> shadow_config, std::shared_ptr<UniformBuffer<uboSharedConfig>> shared_config);
49+
ShadowMapping(ShaderRegistry* shader_registry);
5050

5151
~ShadowMapping();
5252

53-
void draw(TileGeometry* tile_manager, const nucleus::tile::IdSet& draw_tileset, const nucleus::camera::Definition& camera);
53+
void draw(TileGeometry* tile_manager,
54+
const nucleus::tile::IdSet& draw_tileset,
55+
const nucleus::camera::Definition& camera,
56+
std::shared_ptr<UniformBuffer<uboShadowConfig>> shadow_config,
57+
std::shared_ptr<UniformBuffer<uboSharedConfig>> shared_config);
5458

5559
void bind_shadow_maps(ShaderProgram* program, unsigned int start_location);
5660
nucleus::camera::Frustum getFrustum(const nucleus::camera::Definition& camera);
@@ -59,8 +63,6 @@ class ShadowMapping
5963

6064
std::shared_ptr<ShaderProgram> m_shadow_program;
6165
std::vector<std::unique_ptr<Framebuffer>> m_shadowmapbuffer;
62-
std::shared_ptr<UniformBuffer<uboShadowConfig>> m_shadow_config;
63-
std::shared_ptr<UniformBuffer<uboSharedConfig>> m_shared_config;
6466
QOpenGLExtraFunctions *m_f;
6567

6668
std::vector<glm::vec4> getFrustumCornersWorldSpace(const glm::mat4& projview);

gl_engine/Window.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ void Window::initialise_gpu()
141141
shader_registry->add_shader(m_compose_shader);
142142
shader_registry->add_shader(m_screen_copy_shader);
143143

144-
m_shadowmapping = std::make_unique<gl_engine::ShadowMapping>(shader_registry, m_shadow_config_ubo, m_shared_config_ubo);
144+
m_shadowmapping = std::make_unique<gl_engine::ShadowMapping>(shader_registry);
145145
m_ssao = std::make_unique<gl_engine::SSAO>(shader_registry);
146146

147147
m_shared_config_ubo = std::make_shared<gl_engine::UniformBuffer<gl_engine::uboSharedConfig>>(0, "shared_config");
@@ -249,7 +249,7 @@ void Window::paint(QOpenGLFramebufferObject* framebuffer)
249249
// DRAW SHADOWMAPS
250250
if (m_shared_config_ubo->data.m_csm_enabled) {
251251
m_timer->start_timer("shadowmap");
252-
m_shadowmapping->draw(m_context->tile_geometry(), tile_set, m_camera);
252+
m_shadowmapping->draw(m_context->tile_geometry(), tile_set, m_camera, m_shadow_config_ubo, m_shared_config_ubo);
253253
m_timer->stop_timer("shadowmap");
254254
}
255255

0 commit comments

Comments
 (0)