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>2016-07-28 05:14:13 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2016-08-06 06:19:33 +0300
commitda1d462467369e7b9f16edcc2e8d82c5d0eadbe2 (patch)
tree5ccdc44bdef0005b4b9b2e7f9fb0cf5b2de29121 /intern/cycles/kernel/kernel_passes.h
parent2be1f631ee169c7b394ecfb6c3b0a698809c1ef0 (diff)
Cycles: Replace NaNs in the feature passes with zero
As soon as any feature pass sample is NaN, every pixel which contains that sample in its filter window will be black in the filtered result. Ideally no NaNs should be generated in the first place, but there are quite a few cases where they are generated in Cycles and now become visible. So, as a temporary fix, NaNs are now replaced with zero when storing the passes. Ideally these NaNs should be fixed for good, of course.
Diffstat (limited to 'intern/cycles/kernel/kernel_passes.h')
-rw-r--r--intern/cycles/kernel/kernel_passes.h20
1 files changed, 17 insertions, 3 deletions
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 252c45b37d8..39642a61cb0 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -16,6 +16,20 @@
CCL_NAMESPACE_BEGIN
+ccl_device_inline float3 ensure_finite3(float3 a)
+{
+ if(!isfinite(a.x)) a.x = 0.0f;
+ if(!isfinite(a.y)) a.y = 0.0f;
+ if(!isfinite(a.z)) a.z = 0.0f;
+ return a;
+}
+
+ccl_device_inline float ensure_finite(float a)
+{
+ if(!isfinite(a)) return 0.0f;
+ return a;
+}
+
ccl_device_inline void kernel_write_pass_float(ccl_global float *buffer, int sample, float value)
{
ccl_global float *buf = buffer;
@@ -177,9 +191,9 @@ ccl_device_inline bool kernel_write_denoising_passes(KernelGlobals *kg, ccl_glob
/* This bounce is almost specular, so don't write the data yet. */
return false;
}
- kernel_write_pass_float3_var(buffer, sample, normal/sum_weight);
- kernel_write_pass_float3_var(buffer + 6, sample, albedo);
- kernel_write_pass_float_var(buffer + 12, sample, state->path_length);
+ kernel_write_pass_float3_var(buffer, sample, ensure_finite3(normal/sum_weight));
+ kernel_write_pass_float3_var(buffer + 6, sample, ensure_finite3(albedo));
+ kernel_write_pass_float_var(buffer + 12, sample, ensure_finite(state->path_length));
}
}
else {