forked from bartvdbraak/blender
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:
parent
68c0d77b0c
commit
5cb2861420
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user