|
@@ -915,7 +915,7 @@ LightmapperRD::BakeError LightmapperRD::_denoise_oidn(RenderingDevice *p_rd, RID
|
|
|
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, int p_denoiser_range, 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, void *p_bake_userdata) {
|
|
|
RID denoise_params_buffer = p_rd->uniform_buffer_create(sizeof(DenoiseParams));
|
|
|
DenoiseParams denoise_params;
|
|
|
denoise_params.spatial_bandwidth = 5.0f;
|
|
@@ -978,6 +978,11 @@ LightmapperRD::BakeError LightmapperRD::_denoise(RenderingDevice *p_rd, Ref<RDSh
|
|
|
p_rd->sync();
|
|
|
}
|
|
|
}
|
|
|
+ if (p_step_function) {
|
|
|
+ int percent = (s + 1) * 100 / p_atlas_slices;
|
|
|
+ float p = float(s) / p_atlas_slices * 0.1;
|
|
|
+ p_step_function(0.8 + p, vformat(RTR("Denoising %d%%"), percent), p_bake_userdata, false);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
p_rd->free(compute_shader_denoise);
|
|
@@ -1581,6 +1586,14 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
|
Ref<Image> img = Image::create_from_data(atlas_size.width, atlas_size.height, false, Image::FORMAT_RGBAH, s);
|
|
|
img->save_exr("res://2_light_primary_" + itos(i) + ".exr", false);
|
|
|
}
|
|
|
+
|
|
|
+ if (p_bake_sh) {
|
|
|
+ for (int i = 0; i < atlas_slices * 4; i++) {
|
|
|
+ Vector<uint8_t> s = rd->texture_get_data(light_accum_tex, i);
|
|
|
+ Ref<Image> img = Image::create_from_data(atlas_size.width, atlas_size.height, false, Image::FORMAT_RGBAH, s);
|
|
|
+ img->save_exr("res://2_light_primary_accum_" + itos(i) + ".exr", false);
|
|
|
+ }
|
|
|
+ }
|
|
|
#endif
|
|
|
|
|
|
/* SECONDARY (indirect) LIGHT PASS(ES) */
|
|
@@ -1803,7 +1816,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
|
} else {
|
|
|
// JNLM (built-in).
|
|
|
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, p_denoiser_range, 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, p_bake_userdata);
|
|
|
}
|
|
|
if (unlikely(error != BAKE_OK)) {
|
|
|
return error;
|