diff options
author | Brecht Van Lommel <brecht@blender.org> | 2020-03-11 13:37:31 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-03-11 14:59:29 +0300 |
commit | 5cb2861420c733a3fa2d73593d820d9bddc7fd85 (patch) | |
tree | a2286509b5de42106ef52c796cfa3d76569b90e5 /intern | |
parent | 68c0d77b0c95a0fca89ca010f9666c4fc3eb9598 (diff) |
Fix Cycles incorrect result when compressing some 8 bit log colorspace images
Don't clamp and do premultiply after color space conversion.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/svm/svm_image.h | 4 | ||||
-rw-r--r-- | intern/cycles/render/colorspace.cpp | 12 |
2 files changed, 7 insertions, 9 deletions
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h index 90f1a7845c7..63939a049a5 100644 --- a/intern/cycles/kernel/svm/svm_image.h +++ b/intern/cycles/kernel/svm/svm_image.h @@ -30,10 +30,6 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y, if ((flags & NODE_IMAGE_ALPHA_UNASSOCIATE) && alpha != 1.0f && alpha != 0.0f) { r /= alpha; - const int texture_type = kernel_tex_type(id); - if (texture_type == IMAGE_DATA_TYPE_BYTE4 || texture_type == IMAGE_DATA_TYPE_BYTE) { - r = min(r, make_float4(1.0f, 1.0f, 1.0f, 1.0f)); - } r.w = alpha; } diff --git a/intern/cycles/render/colorspace.cpp b/intern/cycles/render/colorspace.cpp index 2e5b53057c0..97a9ba3f012 100644 --- a/intern/cycles/render/colorspace.cpp +++ b/intern/cycles/render/colorspace.cpp @@ -283,7 +283,7 @@ inline void processor_apply_pixels(const OCIO::Processor *processor, for (size_t x = 0; x < width; x++, i++) { float4 value = cast_to_float4(pixels + 4 * (y * width + x)); - if (!(value.w == 0.0f || value.w == 1.0f)) { + if (!(value.w <= 0.0f || value.w == 1.0f)) { float inv_alpha = 1.0f / value.w; value.x *= inv_alpha; value.y *= inv_alpha; @@ -302,14 +302,16 @@ inline void processor_apply_pixels(const OCIO::Processor *processor, for (size_t x = 0; x < width; x++, i++) { float4 value = float_pixels[i]; - value.x *= value.w; - value.y *= value.w; - value.z *= value.w; - if (compress_as_srgb) { value = color_linear_to_srgb_v4(value); } + if (!(value.w <= 0.0f || value.w == 1.0f)) { + value.x *= value.w; + value.y *= value.w; + value.z *= value.w; + } + cast_from_float4(pixels + 4 * (y * width + x), value); } } |