Fix Cycles incorrect result when compressing some 8 bit log colorspace images

Don't clamp and do premultiply after color space conversion.
This commit is contained in:
Brecht Van Lommel 2020-03-11 11:37:31 +01:00
parent 68c0d77b0c
commit 5cb2861420
2 changed files with 7 additions and 9 deletions

@ -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;
}

@ -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);
}
}