|
@@ -979,7 +979,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, void *p_bake_userdata) {
|
|
|
+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, RID p_unocclude_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;
|
|
@@ -1000,8 +1000,15 @@ LightmapperRD::BakeError LightmapperRD::_denoise(RenderingDevice *p_rd, Ref<RDSh
|
|
|
}
|
|
|
{
|
|
|
RD::Uniform u;
|
|
|
- u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
|
+ u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
|
|
u.binding = 3;
|
|
|
+ u.append_id(p_unocclude_tex);
|
|
|
+ uniforms.push_back(u);
|
|
|
+ }
|
|
|
+ {
|
|
|
+ RD::Uniform u;
|
|
|
+ u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
|
|
|
+ u.binding = 4;
|
|
|
u.append_id(denoise_params_buffer);
|
|
|
uniforms.push_back(u);
|
|
|
}
|
|
@@ -1622,6 +1629,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
|
}
|
|
|
|
|
|
PushConstant push_constant;
|
|
|
+ push_constant.denoiser_range = p_use_denoiser ? p_denoiser_range : 1.0;
|
|
|
|
|
|
/* UNOCCLUDE */
|
|
|
{
|
|
@@ -1638,7 +1646,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
|
RD::Uniform u;
|
|
|
u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
|
|
|
u.binding = 1;
|
|
|
- u.append_id(unocclude_tex); //will be unused
|
|
|
+ u.append_id(unocclude_tex);
|
|
|
uniforms.push_back(u);
|
|
|
}
|
|
|
}
|
|
@@ -1659,6 +1667,14 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
|
rd->compute_list_end(); //done
|
|
|
}
|
|
|
|
|
|
+#ifdef DEBUG_TEXTURES
|
|
|
+ for (int i = 0; i < atlas_slices; i++) {
|
|
|
+ Vector<uint8_t> s = rd->texture_get_data(unocclude_tex, i);
|
|
|
+ Ref<Image> img = Image::create_from_data(atlas_size.width, atlas_size.height, false, Image::FORMAT_RGBAF, s);
|
|
|
+ img->save_exr("res://1_unocclude_" + itos(i) + ".exr", false);
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
if (p_step_function) {
|
|
|
if (p_step_function(0.5, RTR("Plot direct lighting"), p_bake_userdata, true)) {
|
|
|
FREE_TEXTURES
|
|
@@ -2083,7 +2099,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, p_bake_userdata);
|
|
|
+ error = _denoise(rd, compute_shader, compute_base_uniform_set, push_constant, light_accum_tex2, normal_tex, light_accum_tex, unocclude_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;
|
|
@@ -2098,7 +2114,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
|
|
|
} else {
|
|
|
// JNLM (built-in).
|
|
|
SWAP(shadowmask_tex, shadowmask_tex2);
|
|
|
- error = _denoise(rd, compute_shader, compute_base_uniform_set, push_constant, shadowmask_tex2, normal_tex, shadowmask_tex, p_denoiser_strength, p_denoiser_range, atlas_size, atlas_slices, false, p_step_function, p_bake_userdata);
|
|
|
+ error = _denoise(rd, compute_shader, compute_base_uniform_set, push_constant, shadowmask_tex2, normal_tex, shadowmask_tex, unocclude_tex, p_denoiser_strength, p_denoiser_range, atlas_size, atlas_slices, false, p_step_function, p_bake_userdata);
|
|
|
}
|
|
|
if (unlikely(error != BAKE_OK)) {
|
|
|
return error;
|