Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2018-08-31 00:28:10 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2018-10-26 17:21:11 +0300
commitf1673d20fa645b895cfa9d67e76dd29df7c739a2 (patch)
tree31e9efc8d99b2084663adbce1931139b08ef81be /intern/cycles/render/buffers.cpp
parent65b25df8018cdef8952d2e49ad66f55c6b0b3e2b (diff)
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
Diffstat (limited to 'intern/cycles/render/buffers.cpp')
-rw-r--r--intern/cycles/render/buffers.cpp35
1 files changed, 25 insertions, 10 deletions
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 4cd8b3726d3..e6021f4b37d 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -160,11 +160,12 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
(offset == DENOISING_PASS_DEPTH_VAR) ||
(offset == DENOISING_PASS_COLOR_VAR);
+ float scale_exposure = scale;
if(offset == DENOISING_PASS_COLOR || offset == DENOISING_PASS_CLEAN) {
- scale *= exposure;
+ scale_exposure *= exposure;
}
else if(offset == DENOISING_PASS_COLOR_VAR) {
- scale *= exposure*exposure;
+ scale_exposure *= exposure*exposure;
}
offset += params.get_denoising_offset();
@@ -181,14 +182,14 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
if(components == 1) {
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) {
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[1] = max(0.0f, var[1] - mean[1]*mean[1]*invsample)*scale;
- pixels[2] = max(0.0f, var[2] - mean[2]*mean[2]*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_exposure;
+ pixels[2] = max(0.0f, var[2] - mean[2]*mean[2]*invsample)*scale_exposure;
}
}
else {
@@ -200,14 +201,28 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
if(components == 1) {
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) {
for(int i = 0; i < size; i++, in += pass_stride, pixels += 3) {
- pixels[0] = in[0]*scale;
- pixels[1] = in[1]*scale;
- pixels[2] = in[2]*scale;
+ pixels[0] = in[0]*scale_exposure;
+ pixels[1] = in[1]*scale_exposure;
+ 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 {