[Bf-blender-cvs] [697600e7840] upstream_cycles_texture_cache: Cycles: Fixes for texture caching, behavior with auto convert off was broken, color space was misinterpreted sometimes. Note: Texturing with OSL is currently broken.
Stefan Werner
noreply at git.blender.org
Wed Jun 27 14:05:13 CEST 2018
Commit: 697600e7840859f2e36cc28edd04248aee2a0a26
Author: Stefan Werner
Date: Fri Aug 4 11:56:20 2017 +0200
Branches: upstream_cycles_texture_cache
https://developer.blender.org/rB697600e7840859f2e36cc28edd04248aee2a0a26
Cycles: Fixes for texture caching, behavior with auto convert off was broken, color space was misinterpreted sometimes.
Note: Texturing with OSL is currently broken.
===================================================================
M intern/cycles/kernel/kernel_oiio_globals.h
M intern/cycles/kernel/svm/svm_image.h
M intern/cycles/render/image.cpp
M intern/cycles/render/image.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_oiio_globals.h b/intern/cycles/kernel/kernel_oiio_globals.h
index 54644c94160..749ee45ffb0 100644
--- a/intern/cycles/kernel/kernel_oiio_globals.h
+++ b/intern/cycles/kernel/kernel_oiio_globals.h
@@ -28,6 +28,7 @@ struct OIIOTexture
OIIO::TextureSystem::TextureHandle* handle;
OIIO::TextureOpt::InterpMode interpolation;
OIIO::TextureOpt::Wrap extension;
+ bool is_linear;
};
struct OIIOGlobals
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index aada99de8ad..2c610618a91 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -30,6 +30,8 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
OIIO::TextureOpt options;
options.swrap = options.twrap = kg->oiio->textures[id].extension;
options.anisotropic = 8;
+ float missingcolor[4] = {TEX_IMAGE_MISSING_R, TEX_IMAGE_MISSING_G, TEX_IMAGE_MISSING_B, TEX_IMAGE_MISSING_A};
+ options.missingcolor = missingcolor;
if(path_flag & NEAREST_LOOKUP_PATHS && !(path_flag & PATH_RAY_SINGULAR)) {
options.interpmode = OIIO::TextureOpt::InterpClosest;
@@ -38,8 +40,7 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
else {
options.interpmode = kg->oiio->textures[id].interpolation;
options.mipmode = OIIO::TextureOpt::MipModeAniso;
- }
-
+ }
if(path_flag & DIFFUSE_BLUR_PATHS) {
options.sblur = options.tblur = kg->oiio->diffuse_blur;
@@ -55,8 +56,8 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
if(!success) {
(void) kg->oiio->tex_sys->geterror();
} else {
- /* Texture cache is always linear */
- srgb = 0;
+ /* Mip maps are always linear. */
+ srgb = !kg->oiio->textures[id].is_linear;
}
}
else
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 844abec7aab..b5450d19936 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -738,10 +738,10 @@ void ImageManager::device_load_image(Device *device,
}
if(oiio_texture_system && !img->builtin_data) {
- /* Generate a mip mapped tile image file */
- if(scene->params.texture.auto_convert) {
- make_tx(img, progress);
- }
+ /* Get or generate a mip mapped tile image file.
+ * If we have a mip map, assume it's linear, not sRGB. */
+ bool have_mip = get_tx(img, progress, scene->params.texture.auto_convert);
+
/* When using OIIO directly from SVM, store the TextureHandle
* in an array for quicker lookup at shading time */
OIIOGlobals *oiio = (OIIOGlobals*)device->oiio_memory();
@@ -783,6 +783,7 @@ void ImageManager::device_load_image(Device *device,
oiio->textures[flat_slot].extension = OIIO::TextureOpt::WrapPeriodic;
break;
}
+ oiio->textures[flat_slot].is_linear = have_mip;
} else {
oiio->textures[flat_slot].handle = NULL;
}
@@ -1062,7 +1063,8 @@ bool ImageManager::make_tx(const string &filename, const string &outputfilename,
config.attribute("maketx:highlightcomp", 1);
config.attribute("maketx:updatemode", 1);
config.attribute("maketx:oiio_options", 1);
- //config.attribute("maketx:updatemode", 1);
+ config.attribute("maketx:updatemode", 1);
+ /* Convert textures to linear color space before mip mapping. */
if(srgb) {
config.attribute("maketx:incolorspace", "sRGB");
config.attribute("maketx:outcolorspace", "linear");
@@ -1071,7 +1073,7 @@ bool ImageManager::make_tx(const string &filename, const string &outputfilename,
return ImageBufAlgo::make_texture(ImageBufAlgo::MakeTxTexture, filename, outputfilename, config);
}
-bool ImageManager::make_tx(Image *image, Progress *progress)
+bool ImageManager::get_tx(Image *image, Progress *progress, bool auto_convert)
{
if(!path_exists(image->filename)) {
return false;
@@ -1091,14 +1093,16 @@ bool ImageManager::make_tx(Image *image, Progress *progress)
return true;
}
- progress->set_status("Updating Images", "Converting " + image->filename);
+ if(auto_convert) {
+ progress->set_status("Updating Images", "Converting " + image->filename);
- bool ok = make_tx(image->filename, tx_name, image->srgb);
- if(ok) {
- image->filename = tx_name;
+ bool ok = make_tx(image->filename, tx_name, image->srgb);
+ if(ok) {
+ image->filename = tx_name;
+ return true;
+ }
}
-
- return true;
+ return false;
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 8bd78ef4783..9f4907959eb 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -169,8 +169,8 @@ private:
void device_free_image(Device *device,
ImageDataType type,
int slot);
-
- bool make_tx(Image *image, Progress *progress);
+
+ bool get_tx(Image *image, Progress *progress, bool auto_convert);
};
CCL_NAMESPACE_END
More information about the Bf-blender-cvs
mailing list