|
@@ -226,7 +226,7 @@ void LightmapperRD::_sort_triangle_clusters(uint32_t p_cluster_size, uint32_t p_
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-Lightmapper::BakeError LightmapperRD::_blit_meshes_into_atlas(int p_max_texture_size, Vector<Ref<Image>> &albedo_images, Vector<Ref<Image>> &emission_images, AABB &bounds, Size2i &atlas_size, int &atlas_slices, BakeStepFunc p_step_function, void *p_bake_userdata) {
|
|
|
|
|
|
+Lightmapper::BakeError LightmapperRD::_blit_meshes_into_atlas(int p_max_texture_size, int p_denoiser_range, Vector<Ref<Image>> &albedo_images, Vector<Ref<Image>> &emission_images, AABB &bounds, Size2i &atlas_size, int &atlas_slices, BakeStepFunc p_step_function, void *p_bake_userdata) {
|
|
Vector<Size2i> sizes;
|
|
Vector<Size2i> sizes;
|
|
|
|
|
|
for (int m_i = 0; m_i < mesh_instances.size(); m_i++) {
|
|
for (int m_i = 0; m_i < mesh_instances.size(); m_i++) {
|
|
@@ -261,7 +261,7 @@ Lightmapper::BakeError LightmapperRD::_blit_meshes_into_atlas(int p_max_texture_
|
|
source_sizes.resize(sizes.size());
|
|
source_sizes.resize(sizes.size());
|
|
source_indices.resize(sizes.size());
|
|
source_indices.resize(sizes.size());
|
|
for (int i = 0; i < source_indices.size(); i++) {
|
|
for (int i = 0; i < source_indices.size(); i++) {
|
|
- source_sizes.write[i] = sizes[i] + Vector2i(2, 2); // Add padding between lightmaps
|
|
|
|
|
|
+ source_sizes.write[i] = sizes[i] + Vector2i(2, 2).maxi(p_denoiser_range); // Add padding between lightmaps
|
|
source_indices.write[i] = i;
|
|
source_indices.write[i] = i;
|
|
}
|
|
}
|
|
Vector<Vector3i> atlas_offsets;
|
|
Vector<Vector3i> atlas_offsets;
|
|
@@ -906,7 +906,7 @@ LightmapperRD::BakeError LightmapperRD::_denoise_oidn(RenderingDevice *p_rd, RID
|
|
return BAKE_OK;
|
|
return BAKE_OK;
|
|
}
|
|
}
|
|
|
|
|
|
-LightmapperRD::BakeError LightmapperRD::_denoise(RenderingDevice *p_rd, Ref<RDShaderFile> &p_compute_shader, const RID &p_compute_base_uniform_set, PushConstant &p_push_constant, RID p_source_light_tex, RID p_source_normal_tex, RID p_dest_light_tex, float p_denoiser_strength, const Size2i &p_atlas_size, int p_atlas_slices, bool p_bake_sh, BakeStepFunc p_step_function) {
|
|
|
|
|
|
+LightmapperRD::BakeError LightmapperRD::_denoise(RenderingDevice *p_rd, Ref<RDShaderFile> &p_compute_shader, const RID &p_compute_base_uniform_set, PushConstant &p_push_constant, RID p_source_light_tex, RID p_source_normal_tex, RID p_dest_light_tex, float p_denoiser_strength, int p_denoiser_range, const Size2i &p_atlas_size, int p_atlas_slices, bool p_bake_sh, BakeStepFunc p_step_function) {
|
|
RID denoise_params_buffer = p_rd->uniform_buffer_create(sizeof(DenoiseParams));
|
|
RID denoise_params_buffer = p_rd->uniform_buffer_create(sizeof(DenoiseParams));
|
|
DenoiseParams denoise_params;
|
|
DenoiseParams denoise_params;
|
|
denoise_params.spatial_bandwidth = 5.0f;
|
|
denoise_params.spatial_bandwidth = 5.0f;
|
|
@@ -914,6 +914,7 @@ LightmapperRD::BakeError LightmapperRD::_denoise(RenderingDevice *p_rd, Ref<RDSh
|
|
denoise_params.albedo_bandwidth = 1.0f;
|
|
denoise_params.albedo_bandwidth = 1.0f;
|
|
denoise_params.normal_bandwidth = 0.1f;
|
|
denoise_params.normal_bandwidth = 0.1f;
|
|
denoise_params.filter_strength = 10.0f;
|
|
denoise_params.filter_strength = 10.0f;
|
|
|
|
+ denoise_params.half_search_window = p_denoiser_range;
|
|
p_rd->buffer_update(denoise_params_buffer, 0, sizeof(DenoiseParams), &denoise_params);
|
|
p_rd->buffer_update(denoise_params_buffer, 0, sizeof(DenoiseParams), &denoise_params);
|
|
|
|
|
|
Vector<RD::Uniform> uniforms = dilate_or_denoise_common_uniforms(p_source_light_tex, p_dest_light_tex);
|
|
Vector<RD::Uniform> uniforms = dilate_or_denoise_common_uniforms(p_source_light_tex, p_dest_light_tex);
|
|
@@ -976,7 +977,7 @@ LightmapperRD::BakeError LightmapperRD::_denoise(RenderingDevice *p_rd, Ref<RDSh
|
|
return BAKE_OK;
|
|
return BAKE_OK;
|
|
}
|
|
}
|
|
|
|
|
|
-LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_denoiser, float p_denoiser_strength, int p_bounces, float p_bounce_indirect_energy, float p_bias, int p_max_texture_size, bool p_bake_sh, bool p_texture_for_bounces, GenerateProbes p_generate_probes, const Ref<Image> &p_environment_panorama, const Basis &p_environment_transform, BakeStepFunc p_step_function, void *p_bake_userdata, float p_exposure_normalization) {
|
|
|
|
|
|
+LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_denoiser, float p_denoiser_strength, int p_denoiser_range, int p_bounces, float p_bounce_indirect_energy, float p_bias, int p_max_texture_size, bool p_bake_sh, bool p_texture_for_bounces, GenerateProbes p_generate_probes, const Ref<Image> &p_environment_panorama, const Basis &p_environment_transform, BakeStepFunc p_step_function, void *p_bake_userdata, float p_exposure_normalization) {
|
|
int denoiser = GLOBAL_GET("rendering/lightmapping/denoising/denoiser");
|
|
int denoiser = GLOBAL_GET("rendering/lightmapping/denoising/denoiser");
|
|
String oidn_path = EDITOR_GET("filesystem/tools/oidn/oidn_denoise_path");
|
|
String oidn_path = EDITOR_GET("filesystem/tools/oidn/oidn_denoise_path");
|
|
|
|
|
|
@@ -1008,7 +1009,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
Vector<Ref<Image>> albedo_images;
|
|
Vector<Ref<Image>> albedo_images;
|
|
Vector<Ref<Image>> emission_images;
|
|
Vector<Ref<Image>> emission_images;
|
|
|
|
|
|
- BakeError bake_error = _blit_meshes_into_atlas(p_max_texture_size, albedo_images, emission_images, bounds, atlas_size, atlas_slices, p_step_function, p_bake_userdata);
|
|
|
|
|
|
+ BakeError bake_error = _blit_meshes_into_atlas(p_max_texture_size, p_denoiser_range, albedo_images, emission_images, bounds, atlas_size, atlas_slices, p_step_function, p_bake_userdata);
|
|
if (bake_error != BAKE_OK) {
|
|
if (bake_error != BAKE_OK) {
|
|
return bake_error;
|
|
return bake_error;
|
|
}
|
|
}
|
|
@@ -1793,7 +1794,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
} else {
|
|
} else {
|
|
// JNLM (built-in).
|
|
// JNLM (built-in).
|
|
SWAP(light_accum_tex, light_accum_tex2);
|
|
SWAP(light_accum_tex, light_accum_tex2);
|
|
- error = _denoise(rd, compute_shader, compute_base_uniform_set, push_constant, light_accum_tex2, normal_tex, light_accum_tex, p_denoiser_strength, atlas_size, atlas_slices, p_bake_sh, p_step_function);
|
|
|
|
|
|
+ error = _denoise(rd, compute_shader, compute_base_uniform_set, push_constant, light_accum_tex2, normal_tex, light_accum_tex, p_denoiser_strength, p_denoiser_range, atlas_size, atlas_slices, p_bake_sh, p_step_function);
|
|
}
|
|
}
|
|
if (unlikely(error != BAKE_OK)) {
|
|
if (unlikely(error != BAKE_OK)) {
|
|
return error;
|
|
return error;
|