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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-05-19 03:56:12 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-05-19 15:36:42 +0300
commit3b23b5c638feae0ad6319440771b83a64a1f9ebe (patch)
tree16fbedd83ffa6a02904d3f93576c1de1674a0584 /intern/cycles
parent7c78c20b6bf6f7dd00397c456fb9e2116febfca7 (diff)
Images: don't (un)premultipy non-color data
The previous behavior here was wrong for some specific combinations of settings, non-color RGB channels should never be affected by the alpha channel.
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/render/colorspace.cpp25
-rw-r--r--intern/cycles/render/colorspace.h3
-rw-r--r--intern/cycles/render/image.cpp8
-rw-r--r--intern/cycles/render/nodes.cpp12
4 files changed, 45 insertions, 3 deletions
diff --git a/intern/cycles/render/colorspace.cpp b/intern/cycles/render/colorspace.cpp
index 7b57478ff51..f4c217bc9fb 100644
--- a/intern/cycles/render/colorspace.cpp
+++ b/intern/cycles/render/colorspace.cpp
@@ -82,6 +82,31 @@ ColorSpaceProcessor *ColorSpaceManager::get_processor(ustring colorspace)
#endif
}
+bool ColorSpaceManager::colorspace_is_data(ustring colorspace)
+{
+ if (colorspace == u_colorspace_auto || colorspace == u_colorspace_raw ||
+ colorspace == u_colorspace_srgb) {
+ return false;
+ }
+
+#ifdef WITH_OCIO
+ OCIO::ConstConfigRcPtr config = OCIO::GetCurrentConfig();
+ if (!config) {
+ return false;
+ }
+
+ try {
+ OCIO::ConstColorSpaceRcPtr space = config->getColorSpace(colorspace.c_str());
+ return space && space->isData();
+ }
+ catch (OCIO::Exception &exception) {
+ return false;
+ }
+#else
+ return false;
+#endif
+}
+
ustring ColorSpaceManager::detect_known_colorspace(ustring colorspace,
const char *file_format,
bool is_float)
diff --git a/intern/cycles/render/colorspace.h b/intern/cycles/render/colorspace.h
index e7c7f943c2d..9fea2d6efc6 100644
--- a/intern/cycles/render/colorspace.h
+++ b/intern/cycles/render/colorspace.h
@@ -37,6 +37,9 @@ class ColorSpaceManager {
const char *file_format,
bool is_float);
+ /* Test if colorspace is for non-color data. */
+ static bool colorspace_is_data(ustring colorspace);
+
/* Convert pixels in the specified colorspace to scene linear color for
* rendering. Must be a colorspace returned from detect_known_colorspace. */
template<typename T>
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 431e9230cb4..6301b416724 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -513,8 +513,14 @@ bool ImageManager::file_load_image_generic(Image *img, unique_ptr<ImageInput> *i
ImageSpec spec = ImageSpec();
ImageSpec config = ImageSpec();
- if (img->use_alpha == false)
+ /* For typical RGBA images we let OIIO convert to associated alpha,
+ * but some types we want to leave the RGB channels untouched. */
+ const bool associate_alpha = !(ColorSpaceManager::colorspace_is_data(img->colorspace) ||
+ img->use_alpha == false);
+
+ if (!associate_alpha) {
config.attribute("oiio:UnassociatedAlpha", 1);
+ }
if (!(*in)->open(img->filename, spec, config)) {
return false;
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 27e6309ab2d..3905189c8b0 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -316,7 +316,12 @@ void ImageTextureNode::compile(SVMCompiler &compiler)
flags |= NODE_IMAGE_COMPRESS_AS_SRGB;
}
if (!alpha_out->links.empty()) {
- flags |= NODE_IMAGE_ALPHA_UNASSOCIATE;
+ const bool unassociate_alpha = !(ColorSpaceManager::colorspace_is_data(colorspace) ||
+ use_alpha == false);
+
+ if (unassociate_alpha) {
+ flags |= NODE_IMAGE_ALPHA_UNASSOCIATE;
+ }
}
if (projection != NODE_IMAGE_PROJ_BOX) {
@@ -389,11 +394,14 @@ void ImageTextureNode::compile(OSLCompiler &compiler)
compiler.parameter_texture("filename", slot);
}
+ const bool unassociate_alpha = !(ColorSpaceManager::colorspace_is_data(colorspace) ||
+ use_alpha == false);
+
compiler.parameter(this, "projection");
compiler.parameter(this, "projection_blend");
compiler.parameter("convert_from_srgb", compress_as_srgb);
compiler.parameter("ignore_alpha", !use_alpha);
- compiler.parameter("unassociate_alpha", !alpha_out->links.empty());
+ compiler.parameter("unassociate_alpha", !alpha_out->links.empty() && unassociate_alpha);
compiler.parameter("is_float", is_float);
compiler.parameter(this, "interpolation");
compiler.parameter(this, "extension");