forked from bartvdbraak/blender
Cycles: Expose noisy image pass by default when rendering with denoiser
Apparently quite a few users would like to have the noisy pass available when using the denoiser, and since it's being generated anyways we might as well expose it by default. Reviewers: brecht Differential Revision: https://developer.blender.org/D3608
This commit is contained in:
parent
65b25df801
commit
f1673d20fa
@ -254,21 +254,21 @@ def register_passes(engine, scene, srl):
|
|||||||
if crl.use_pass_volume_indirect: engine.register_pass(scene, srl, "VolumeInd", 3, "RGB", 'COLOR')
|
if crl.use_pass_volume_indirect: engine.register_pass(scene, srl, "VolumeInd", 3, "RGB", 'COLOR')
|
||||||
|
|
||||||
cscene = scene.cycles
|
cscene = scene.cycles
|
||||||
if crl.use_denoising and crl.denoising_store_passes and not cscene.use_progressive_refine:
|
if crl.use_denoising:
|
||||||
engine.register_pass(scene, srl, "Denoising Normal", 3, "XYZ", 'VECTOR')
|
engine.register_pass(scene, srl, "Noisy Image", 3, "RGBA", 'COLOR')
|
||||||
engine.register_pass(scene, srl, "Denoising Normal Variance", 3, "XYZ", 'VECTOR')
|
if crl.denoising_store_passes:
|
||||||
engine.register_pass(scene, srl, "Denoising Albedo", 3, "RGB", 'COLOR')
|
engine.register_pass(scene, srl, "Denoising Normal", 3, "XYZ", 'VECTOR')
|
||||||
engine.register_pass(scene, srl, "Denoising Albedo Variance", 3, "RGB", 'COLOR')
|
engine.register_pass(scene, srl, "Denoising Normal Variance", 3, "XYZ", 'VECTOR')
|
||||||
engine.register_pass(scene, srl, "Denoising Depth", 1, "Z", 'VALUE')
|
engine.register_pass(scene, srl, "Denoising Albedo", 3, "RGB", 'COLOR')
|
||||||
engine.register_pass(scene, srl, "Denoising Depth Variance", 1, "Z", 'VALUE')
|
engine.register_pass(scene, srl, "Denoising Albedo Variance", 3, "RGB", 'COLOR')
|
||||||
engine.register_pass(scene, srl, "Denoising Shadow A", 3, "XYV", 'VECTOR')
|
engine.register_pass(scene, srl, "Denoising Depth", 1, "Z", 'VALUE')
|
||||||
engine.register_pass(scene, srl, "Denoising Shadow B", 3, "XYV", 'VECTOR')
|
engine.register_pass(scene, srl, "Denoising Depth Variance", 1, "Z", 'VALUE')
|
||||||
engine.register_pass(scene, srl, "Denoising Image", 3, "RGB", 'COLOR')
|
engine.register_pass(scene, srl, "Denoising Shadow A", 3, "XYV", 'VECTOR')
|
||||||
engine.register_pass(scene, srl, "Denoising Image Variance", 3, "RGB", 'COLOR')
|
engine.register_pass(scene, srl, "Denoising Shadow B", 3, "XYV", 'VECTOR')
|
||||||
|
engine.register_pass(scene, srl, "Denoising Image Variance", 3, "RGB", 'COLOR')
|
||||||
clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
|
clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
|
||||||
"denoising_glossy_direct", "denoising_glossy_indirect",
|
"denoising_glossy_direct", "denoising_glossy_indirect",
|
||||||
"denoising_transmission_direct", "denoising_transmission_indirect",
|
"denoising_transmission_direct", "denoising_transmission_indirect",
|
||||||
"denoising_subsurface_direct", "denoising_subsurface_indirect")
|
"denoising_subsurface_direct", "denoising_subsurface_indirect")
|
||||||
if any(getattr(crl, option) for option in clean_options):
|
if any(getattr(crl, option) for option in clean_options):
|
||||||
engine.register_pass(scene, srl, "Denoising Clean", 3, "RGB", 'COLOR')
|
engine.register_pass(scene, srl, "Denoising Clean", 3, "RGB", 'COLOR')
|
||||||
|
@ -525,6 +525,9 @@ PassType BlenderSync::get_pass_type(BL::RenderPass& b_pass)
|
|||||||
int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
|
int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
|
||||||
{
|
{
|
||||||
string name = b_pass.name();
|
string name = b_pass.name();
|
||||||
|
|
||||||
|
if(name == "Noisy Image") return DENOISING_PASS_COLOR;
|
||||||
|
|
||||||
if(name.substr(0, 10) != "Denoising ") {
|
if(name.substr(0, 10) != "Denoising ") {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -539,7 +542,6 @@ int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
|
|||||||
MAP_PASS("Depth Variance", DENOISING_PASS_DEPTH_VAR);
|
MAP_PASS("Depth Variance", DENOISING_PASS_DEPTH_VAR);
|
||||||
MAP_PASS("Shadow A", DENOISING_PASS_SHADOW_A);
|
MAP_PASS("Shadow A", DENOISING_PASS_SHADOW_A);
|
||||||
MAP_PASS("Shadow B", DENOISING_PASS_SHADOW_B);
|
MAP_PASS("Shadow B", DENOISING_PASS_SHADOW_B);
|
||||||
MAP_PASS("Image", DENOISING_PASS_COLOR);
|
|
||||||
MAP_PASS("Image Variance", DENOISING_PASS_COLOR_VAR);
|
MAP_PASS("Image Variance", DENOISING_PASS_COLOR_VAR);
|
||||||
MAP_PASS("Clean", DENOISING_PASS_CLEAN);
|
MAP_PASS("Clean", DENOISING_PASS_CLEAN);
|
||||||
#undef MAP_PASS
|
#undef MAP_PASS
|
||||||
@ -573,20 +575,8 @@ array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
|
|||||||
|
|
||||||
scene->film->denoising_flags = 0;
|
scene->film->denoising_flags = 0;
|
||||||
PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
|
PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
|
||||||
if(get_boolean(crp, "denoising_store_passes") &&
|
if(get_boolean(crp, "use_denoising"))
|
||||||
get_boolean(crp, "use_denoising"))
|
|
||||||
{
|
{
|
||||||
b_engine.add_pass("Denoising Normal", 3, "XYZ", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Albedo", 3, "RGB", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Depth", 1, "Z", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Image", 3, "RGB", b_srlay.name().c_str());
|
|
||||||
b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_srlay.name().c_str());
|
|
||||||
|
|
||||||
#define MAP_OPTION(name, flag) if(!get_boolean(crp, name)) scene->film->denoising_flags |= flag;
|
#define MAP_OPTION(name, flag) if(!get_boolean(crp, name)) scene->film->denoising_flags |= flag;
|
||||||
MAP_OPTION("denoising_diffuse_direct", DENOISING_CLEAN_DIFFUSE_DIR);
|
MAP_OPTION("denoising_diffuse_direct", DENOISING_CLEAN_DIFFUSE_DIR);
|
||||||
MAP_OPTION("denoising_diffuse_indirect", DENOISING_CLEAN_DIFFUSE_IND);
|
MAP_OPTION("denoising_diffuse_indirect", DENOISING_CLEAN_DIFFUSE_IND);
|
||||||
@ -598,8 +588,21 @@ array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
|
|||||||
MAP_OPTION("denoising_subsurface_indirect", DENOISING_CLEAN_SUBSURFACE_IND);
|
MAP_OPTION("denoising_subsurface_indirect", DENOISING_CLEAN_SUBSURFACE_IND);
|
||||||
#undef MAP_OPTION
|
#undef MAP_OPTION
|
||||||
|
|
||||||
if(scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES) {
|
b_engine.add_pass("Noisy Image", 4, "RGBA", b_srlay.name().c_str());
|
||||||
b_engine.add_pass("Denoising Clean", 3, "RGB", b_srlay.name().c_str());
|
if(get_boolean(crp, "denoising_store_passes")) {
|
||||||
|
b_engine.add_pass("Denoising Normal", 3, "XYZ", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Albedo", 3, "RGB", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Depth", 1, "Z", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_srlay.name().c_str());
|
||||||
|
b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_srlay.name().c_str());
|
||||||
|
|
||||||
|
if(scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES) {
|
||||||
|
b_engine.add_pass("Denoising Clean", 3, "RGB", b_srlay.name().c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef __KERNEL_DEBUG__
|
#ifdef __KERNEL_DEBUG__
|
||||||
|
@ -160,11 +160,12 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
|
|||||||
(offset == DENOISING_PASS_DEPTH_VAR) ||
|
(offset == DENOISING_PASS_DEPTH_VAR) ||
|
||||||
(offset == DENOISING_PASS_COLOR_VAR);
|
(offset == DENOISING_PASS_COLOR_VAR);
|
||||||
|
|
||||||
|
float scale_exposure = scale;
|
||||||
if(offset == DENOISING_PASS_COLOR || offset == DENOISING_PASS_CLEAN) {
|
if(offset == DENOISING_PASS_COLOR || offset == DENOISING_PASS_CLEAN) {
|
||||||
scale *= exposure;
|
scale_exposure *= exposure;
|
||||||
}
|
}
|
||||||
else if(offset == DENOISING_PASS_COLOR_VAR) {
|
else if(offset == DENOISING_PASS_COLOR_VAR) {
|
||||||
scale *= exposure*exposure;
|
scale_exposure *= exposure*exposure;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += params.get_denoising_offset();
|
offset += params.get_denoising_offset();
|
||||||
@ -181,14 +182,14 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
|
|||||||
|
|
||||||
if(components == 1) {
|
if(components == 1) {
|
||||||
for(int i = 0; i < size; i++, mean += pass_stride, var += pass_stride, pixels++) {
|
for(int i = 0; i < size; i++, mean += pass_stride, var += pass_stride, pixels++) {
|
||||||
pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale;
|
pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale_exposure;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(components == 3) {
|
else if(components == 3) {
|
||||||
for(int i = 0; i < size; i++, mean += pass_stride, var += pass_stride, pixels += 3) {
|
for(int i = 0; i < size; i++, mean += pass_stride, var += pass_stride, pixels += 3) {
|
||||||
pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale;
|
pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale_exposure;
|
||||||
pixels[1] = max(0.0f, var[1] - mean[1]*mean[1]*invsample)*scale;
|
pixels[1] = max(0.0f, var[1] - mean[1]*mean[1]*invsample)*scale_exposure;
|
||||||
pixels[2] = max(0.0f, var[2] - mean[2]*mean[2]*invsample)*scale;
|
pixels[2] = max(0.0f, var[2] - mean[2]*mean[2]*invsample)*scale_exposure;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -200,14 +201,28 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
|
|||||||
|
|
||||||
if(components == 1) {
|
if(components == 1) {
|
||||||
for(int i = 0; i < size; i++, in += pass_stride, pixels++) {
|
for(int i = 0; i < size; i++, in += pass_stride, pixels++) {
|
||||||
pixels[0] = in[0]*scale;
|
pixels[0] = in[0]*scale_exposure;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(components == 3) {
|
else if(components == 3) {
|
||||||
for(int i = 0; i < size; i++, in += pass_stride, pixels += 3) {
|
for(int i = 0; i < size; i++, in += pass_stride, pixels += 3) {
|
||||||
pixels[0] = in[0]*scale;
|
pixels[0] = in[0]*scale_exposure;
|
||||||
pixels[1] = in[1]*scale;
|
pixels[1] = in[1]*scale_exposure;
|
||||||
pixels[2] = in[2]*scale;
|
pixels[2] = in[2]*scale_exposure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(components == 4) {
|
||||||
|
assert(offset == DENOISING_PASS_COLOR);
|
||||||
|
|
||||||
|
/* Since the alpha channel is not involved in denoising, output the Combined alpha channel. */
|
||||||
|
assert(params.passes[0].type == PASS_COMBINED);
|
||||||
|
float *in_combined = buffer.data();
|
||||||
|
|
||||||
|
for(int i = 0; i < size; i++, in += pass_stride, in_combined += pass_stride, pixels += 4) {
|
||||||
|
pixels[0] = in[0]*scale_exposure;
|
||||||
|
pixels[1] = in[1]*scale_exposure;
|
||||||
|
pixels[2] = in[2]*scale_exposure;
|
||||||
|
pixels[3] = saturate(in_combined[3]*scale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
Loading…
Reference in New Issue
Block a user