From 1d49205b1a1d39bdc47ac85ce8ec70a773a1a7e0 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 17 May 2017 15:29:47 +0200 Subject: [PATCH] Fix T51529: Black boxes on a denoising render when using a .exr image as a environmental texture It is caused by NaN value in the input texture. Now we check for all the pixels having proper finite values. Should also help here in the studio, --- intern/cycles/render/image.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index b66d694c82a..e242192e9e0 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -639,6 +639,37 @@ bool ImageManager::file_load_image(Image *img, } } } + /* Make sure we don't have buggy values. */ + if(FileFormat == TypeDesc::FLOAT) { + /* For RGBA buffers we put all channels to 0 if either of them is not + * finite. This way we avoid possible artifacts caused by fully changed + * hue. + */ + if(is_rgba) { + for(size_t i = 0; i < num_pixels; i += 4) { + StorageType *pixel = &pixels[i*4]; + if(!isfinite(pixel[0]) || + !isfinite(pixel[1]) || + !isfinite(pixel[2]) || + !isfinite(pixel[3])) + { + pixel[0] = 0; + pixel[1] = 0; + pixel[2] = 0; + pixel[3] = 0; + } + } + } + else { + for(size_t i = 0; i < num_pixels; ++i) { + StorageType *pixel = &pixels[i*4]; + if(!isfinite(pixel[0])) { + pixel[0] = 0; + } + } + } + } + /* Scale image down if needed. */ if(pixels_storage.size() > 0) { float scale_factor = 1.0f; while(max_size * scale_factor > texture_limit) {