You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Implement shadowmasks for LightmapGI
Co-authored-by: dearthdev <nathandearthdev@gmail.com>
This commit is contained in:
@@ -2660,14 +2660,14 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
||||
glBlitFramebuffer(0, 0, size.x, size.y,
|
||||
0, 0, size.x, size.y,
|
||||
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 5);
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 6);
|
||||
glBindTexture(GL_TEXTURE_2D, backbuffer);
|
||||
}
|
||||
if (scene_state.used_depth_texture) {
|
||||
glBlitFramebuffer(0, 0, size.x, size.y,
|
||||
0, 0, size.x, size.y,
|
||||
GL_DEPTH_BUFFER_BIT, GL_NEAREST);
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 6);
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 7);
|
||||
glBindTexture(GL_TEXTURE_2D, backbuffer_depth);
|
||||
}
|
||||
}
|
||||
@@ -3245,8 +3245,28 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
||||
spec_constants |= SceneShaderGLES3::DISABLE_LIGHT_OMNI;
|
||||
spec_constants |= SceneShaderGLES3::DISABLE_LIGHT_SPOT;
|
||||
spec_constants |= SceneShaderGLES3::DISABLE_LIGHT_DIRECTIONAL;
|
||||
spec_constants |= SceneShaderGLES3::DISABLE_LIGHTMAP;
|
||||
spec_constants |= SceneShaderGLES3::DISABLE_REFLECTION_PROBE;
|
||||
|
||||
bool disable_lightmaps = true;
|
||||
|
||||
// Additive directional passes may use shadowmasks, so enable lightmaps for them.
|
||||
if (pass >= int32_t(inst->light_passes.size()) && inst->lightmap_instance.is_valid()) {
|
||||
GLES3::LightmapInstance *li = GLES3::LightStorage::get_singleton()->get_lightmap_instance(inst->lightmap_instance);
|
||||
GLES3::Lightmap *lm = GLES3::LightStorage::get_singleton()->get_lightmap(li->lightmap);
|
||||
|
||||
if (lm->shadowmask_mode != RS::SHADOWMASK_MODE_NONE) {
|
||||
spec_constants |= SceneShaderGLES3::USE_LIGHTMAP;
|
||||
disable_lightmaps = false;
|
||||
|
||||
if (lightmap_bicubic_upscale) {
|
||||
spec_constants |= SceneShaderGLES3::LIGHTMAP_BICUBIC_FILTER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (disable_lightmaps) {
|
||||
spec_constants |= SceneShaderGLES3::DISABLE_LIGHTMAP;
|
||||
}
|
||||
}
|
||||
|
||||
if (uses_additive_lighting) {
|
||||
@@ -3341,6 +3361,33 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
||||
GLuint tex = GLES3::LightStorage::get_singleton()->directional_shadow_get_texture();
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 3);
|
||||
glBindTexture(GL_TEXTURE_2D, tex);
|
||||
|
||||
if (inst->lightmap_instance.is_valid()) {
|
||||
// Use shadowmasks for directional light passes.
|
||||
GLES3::LightmapInstance *li = GLES3::LightStorage::get_singleton()->get_lightmap_instance(inst->lightmap_instance);
|
||||
GLES3::Lightmap *lm = GLES3::LightStorage::get_singleton()->get_lightmap(li->lightmap);
|
||||
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::LIGHTMAP_SLICE, inst->lightmap_slice_index, shader->version, instance_variant, spec_constants);
|
||||
|
||||
Vector4 uv_scale(inst->lightmap_uv_scale.position.x, inst->lightmap_uv_scale.position.y, inst->lightmap_uv_scale.size.x, inst->lightmap_uv_scale.size.y);
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::LIGHTMAP_UV_SCALE, uv_scale, shader->version, instance_variant, spec_constants);
|
||||
|
||||
if (lightmap_bicubic_upscale) {
|
||||
Vector2 light_texture_size(lm->light_texture_size.x, lm->light_texture_size.y);
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::LIGHTMAP_TEXTURE_SIZE, light_texture_size, shader->version, instance_variant, spec_constants);
|
||||
}
|
||||
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::LIGHTMAP_SHADOWMASK_MODE, (uint32_t)lm->shadowmask_mode, shader->version, instance_variant, spec_constants);
|
||||
|
||||
if (lm->shadow_texture.is_valid()) {
|
||||
tex = GLES3::TextureStorage::get_singleton()->texture_get_texid(lm->shadow_texture);
|
||||
} else {
|
||||
tex = GLES3::TextureStorage::get_singleton()->texture_get_texid(GLES3::TextureStorage::get_singleton()->texture_gl_get_default(GLES3::DEFAULT_GL_TEXTURE_2D_ARRAY_WHITE));
|
||||
}
|
||||
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 5);
|
||||
glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3399,6 +3446,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
||||
};
|
||||
glUniformMatrix3fv(material_storage->shaders.scene_shader.version_get_uniform(SceneShaderGLES3::LIGHTMAP_NORMAL_XFORM, shader->version, instance_variant, spec_constants), 1, GL_FALSE, matrix);
|
||||
}
|
||||
|
||||
} else if (inst->lightmap_sh) {
|
||||
glUniform4fv(material_storage->shaders.scene_shader.version_get_uniform(SceneShaderGLES3::LIGHTMAP_CAPTURES, shader->version, instance_variant, spec_constants), 9, reinterpret_cast<const GLfloat *>(inst->lightmap_sh->sh));
|
||||
}
|
||||
@@ -3430,7 +3478,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE1_AMBIENT_COLOR, probe->ambient_color * probe->ambient_color_energy, shader->version, instance_variant, spec_constants);
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE1_LOCAL_MATRIX, inst->reflection_probes_local_transform_cache[0], shader->version, instance_variant, spec_constants);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 7);
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 8);
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, light_storage->reflection_probe_instance_get_texture(inst->reflection_probe_rid_cache[0]));
|
||||
}
|
||||
|
||||
@@ -3448,7 +3496,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE2_AMBIENT_COLOR, probe->ambient_color * probe->ambient_color_energy, shader->version, instance_variant, spec_constants);
|
||||
material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::REFPROBE2_LOCAL_MATRIX, inst->reflection_probes_local_transform_cache[1], shader->version, instance_variant, spec_constants);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 8);
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 9);
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, light_storage->reflection_probe_instance_get_texture(inst->reflection_probe_rid_cache[1]));
|
||||
|
||||
spec_constants |= SceneShaderGLES3::SECOND_REFLECTION_PROBE;
|
||||
|
||||
Reference in New Issue
Block a user