[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