[Bf-blender-cvs] [693667b85ef] upstream_cycles_texture_cache: Cycles: Cached textures are now assumed to be linear and converted from sRGB during texture filtering where necessary

Stefan Werner noreply at git.blender.org
Wed Jun 27 14:04:49 CEST 2018


Commit: 693667b85ef460e1638ee36217958962a6a9c449
Author: Stefan Werner
Date:   Mon May 22 13:36:49 2017 +0200
Branches: upstream_cycles_texture_cache
https://developer.blender.org/rB693667b85ef460e1638ee36217958962a6a9c449

Cycles: Cached textures are now assumed to be linear and converted from sRGB during texture filtering where necessary

===================================================================

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/render/image.cpp
M	intern/cycles/render/image.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	intern/cycles/render/shader.cpp

===================================================================

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 8d2ade1e30b..95040b22daa 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -352,7 +352,8 @@ static void create_mesh_volume_attribute(BL::Object& b_ob,
 	        INTERPOLATION_LINEAR,
 	        EXTENSION_CLIP,
 	        use_alpha,
-	        metadata);
+	        metadata,
+            false);
 }
 
 static void create_mesh_volume_attributes(Scene *scene,
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 5ff4adad5ec..24239317859 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -96,18 +96,17 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
 		return false;
 
 	differential3 dD;
-
-	/* todo: implement */
 	differential3 dN;
+#ifdef __DNDU__
 	dN.dx = sd->dNdu;
 	dN.dy = sd->dNdv;
-
+#else
+	dN = differential3_zero();
+#endif
 	/* This is how differentials are calculated for a perfect specular reflection.
 	 * This is not the exact value that we should be getting here,
 	 * but it's still better than using zero differentials. */
 	differential_reflect(&dD, sd->I, &sd->dI, sd->N, &dN);
-	dD.dx *= -10.0f;
-	dD.dy *= -10.0f;
 
 	/* evaluate closure */
 
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 2d11401c406..e1d97ef8312 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -27,18 +27,24 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
 	if(kg->oiio && kg->oiio->textures.size() > id && kg->oiio->textures[id].handle) {
 		OIIO::TextureOpt options;
 		options.swrap = options.twrap = kg->oiio->textures[id].extension;
+		options.anisotropic = 8;
 
 		if(fast_lookup) {
 			options.interpmode = OIIO::TextureOpt::InterpClosest;
 			options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
+			//if(path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_DIFFUSE_ANCESTOR))
+			//	options.sblur = options.tblur = 1.f/64.f;
 		}
 		else {
 			options.interpmode = kg->oiio->textures[id].interpolation;
 			options.mipmode = OIIO::TextureOpt::MipModeAniso;
 		}
-		bool success = kg->oiio->tex_sys->texture(kg->oiio->textures[id].handle, (OIIO::TextureSystem::Perthread*)kg->oiio_tdata, options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
+		bool success = kg->oiio->tex_sys->texture(kg->oiio->textures[id].handle, (OIIO::TextureSystem::Perthread*)kg->oiio_tdata, options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 4, (float*)&r);
 		if(!success) {
 			(void) kg->oiio->tex_sys->geterror();
+		} else {
+			/* Texture cache is always linear */
+			srgb = 0;
 		}
 	}
 	else
@@ -102,10 +108,27 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, int path_f
 	if(stack_valid(dx_offset) && stack_valid(dy_offset)) {
 		float3 dx = stack_load_float3(stack, dx_offset);
 		float3 dy = stack_load_float3(stack, dy_offset);
-		ds.dx = fabsf(dx.x - tex_co.x);
-		ds.dy = fabsf(dy.x - tex_co.x);
-		dt.dx = fabsf(dx.y - tex_co.y);
-		dt.dy = fabsf(dy.y - tex_co.y);
+		float2 tex_co_dx, tex_co_dy;
+		if(projection == NODE_IMAGE_PROJ_SPHERE) {
+			dx = texco_remap_square(dx);
+			tex_co_dx = map_to_sphere(dx);
+			dy = texco_remap_square(dy);
+			tex_co_dy = map_to_sphere(dy);
+		}
+		else if(projection == NODE_IMAGE_PROJ_TUBE) {
+			dx = texco_remap_square(dx);
+			tex_co_dx = map_to_tube(dx);
+			dy = texco_remap_square(dy);
+			tex_co_dy = map_to_tube(dy);
+		}
+		else {
+			tex_co_dx = make_float2(dx.x, dx.y);
+			tex_co_dy = make_float2(dy.x, dy.y);
+		}
+		ds.dx = tex_co_dx.x - tex_co.x;
+		ds.dy = tex_co_dy.x - tex_co.x;
+		dt.dx = tex_co_dx.y - tex_co.y;
+		dt.dy = tex_co_dy.y - tex_co.y;
 	}
 	else
 #endif
@@ -227,14 +250,55 @@ ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, int
 {
 	uint id = node.y;
 	uint co_offset, out_offset, alpha_offset, srgb;
-	uint projection = node.w;
+	uint projection, dx_offset, dy_offset;
 
 	decode_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset, &srgb);
+	decode_node_uchar4(node.w, &projection, &dx_offset, &dy_offset, NULL);
+
+	uint use_alpha = stack_valid(alpha_offset);
+	float4 f;
 
 	float3 co = stack_load_float3(stack, co_offset);
 	float2 uv;
 
 	co = safe_normalize(co);
+	bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER | PATH_RAY_GLOSSY);
+#ifdef __OIIO__
+	float3 dRdx, dRdy;
+	if(stack_valid(dx_offset) && stack_valid(dy_offset)) {
+		dRdx = co - normalize(stack_load_float3(stack, dx_offset));
+		dRdy = co - normalize(stack_load_float3(stack, dy_offset));
+	}
+	else
+	{
+		dRdx = make_float3(0.0f, 0.0f, 0.0f);
+		dRdy = make_float3(0.0f, 0.0f, 0.0f);
+	}
+	if(kg->oiio && kg->oiio->textures.size() > id && kg->oiio->textures[id].handle && projection == 0) {
+		OIIO::TextureOpt options;
+		options.swrap = options.twrap = kg->oiio->textures[id].extension;
+		options.anisotropic = 8;
+
+		if(fast_lookup) {
+			options.interpmode = OIIO::TextureOpt::InterpClosest;
+			options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
+	//		if(path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_DIFFUSE_ANCESTOR))
+	//		   options.sblur = options.tblur = 1.f/64.f;
+		}
+		else {
+			options.interpmode = kg->oiio->textures[id].interpolation;
+			options.mipmode = OIIO::TextureOpt::MipModeTrilinear;
+		}
+		bool success = kg->oiio->tex_sys->environment (kg->oiio->textures[id].handle, (OIIO::TextureSystem::Perthread*)kg->oiio_tdata, options,
+													   Imath::V3f(co.x, -co.y, co.z), Imath::V3f(dRdx.x, -dRdx.y, dRdx.z),
+													   Imath::V3f(dRdy.x, -dRdy.y, dRdy.z), use_alpha ? 4 : 3, (float*)&f);
+
+		if(!success) {
+			(void) kg->oiio->tex_sys->geterror();
+		}
+	}
+	else {
+#endif
 
 	if(projection == 0)
 		uv = direction_to_equirectangular(co);
@@ -243,7 +307,10 @@ ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, int
 
 	bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER);
 	uint use_alpha = stack_valid(alpha_offset);
-	float4 f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, fast_lookup);
+	f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, fast_lookup);
+#ifdef __OIIO__
+	}
+#endif
 
 	if(stack_valid(out_offset))
 		stack_store_float3(stack, out_offset, make_float3(f.x, f.y, f.z));
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 884ff2ab288..288a8ca2ef3 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -309,7 +309,8 @@ int ImageManager::add_image(const string& filename,
                             InterpolationType interpolation,
                             ExtensionType extension,
                             bool use_alpha,
-                            ImageMetaData& metadata)
+                            ImageMetaData& metadata,
+                            bool srgb)
 {
 	Image *img;
 	size_t slot;
@@ -387,6 +388,7 @@ int ImageManager::add_image(const string& filename,
 	img->users = 1;
 	img->use_alpha = use_alpha;
 	img->mem = NULL;
+	img->srgb = srgb && (!metadata.is_linear);
 
 	images[type][slot] = img;
 
@@ -1075,6 +1077,10 @@ bool ImageManager::make_tx(Image *image, Progress *progress)
 	
 	ImageSpec config;
 	config.attribute("maketx:filtername", "lanczos3");
+	if(image->srgb) {
+		config.attribute("maketx:incolorspace", "sRGB");
+		config.attribute("maketx:outcolorspace", "linear");
+	}
 
 	bool ok = ImageBufAlgo::make_texture(ImageBufAlgo::MakeTxTexture, image->filename, tx_name, config);
 	if(ok) {
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index c900b5d1f0b..fc0c959367b 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -56,7 +56,8 @@ public:
 	              InterpolationType interpolation,
 	              ExtensionType extension,
 	              bool use_alpha,
-	              ImageMetaData& metadata);
+	              ImageMetaData& metadata,
+				  bool srgb);
 	void remove_image(int flat_slot);
 	void remove_image(const string& filename,
 	                  void *builtin_data,
@@ -119,6 +120,7 @@ public:
 		bool use_alpha;
 		bool need_load;
 		bool animated;
+		bool srgb;
 		float frame;
 		InterpolationType interpolation;
 		ExtensionType extension;
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 93fa59f45f5..061ea7138da 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -238,8 +238,8 @@ NODE_DEFINE(ImageTextureNode)
 	SOCKET_FLOAT(projection_blend, "Projection Blend", 0.0f);
 
 	SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_UV);
-	SOCKET_IN_POINT(vector_dx, "Vector_dx", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_DX);
-	SOCKET_IN_POINT(vector_dy, "Vector_dy", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_DY);
+	SOCKET_IN_POINT(vector_dx, "Vector_dx", make_float3(0.0f, 0.0f, 0.0f));
+	SOCKET_IN_POINT(vector_dy, "Vector_dy", make_float3(0.0f, 0.0f, 0.0f));
 
 	SOCKET_OUT_COLOR(color, "Color");
 	SOCKET_OUT_FLOAT(alpha, "Alpha");
@@ -312,7 +312,8 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 		                                interpolation,
 		                                extension,
 		                                use_alpha,
-		                                metadata);
+		                                metadata,
+		                                color_space == NODE_COLOR_SPACE_COLOR);
 		is_float = metadata.is_float;
 		is_linear = metadata.is_linear;
 	}
@@ -381,7 +382,8 @@ void ImageTextureNode::compile(OSLCompiler& compiler)
 			                                interpolation,
 			                                extension,
 			                                use_alpha,
-			                                metadata);
+			                                metadata,
+                                            color_space == NODE_COLOR_SPACE_COLOR);
 		}
 		is_float = metada

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list