[Bf-blender-cvs] [53700beb092] cycles_texture_cache: Cycles: Implmemented texture filtering for box mapping.

Stefan Werner noreply at git.blender.org
Fri Oct 5 12:26:05 CEST 2018


Commit: 53700beb0929379c496fa2a5f2e8b2232da74938
Author: Stefan Werner
Date:   Fri Sep 28 09:22:04 2018 +0200
Branches: cycles_texture_cache
https://developer.blender.org/rB53700beb0929379c496fa2a5f2e8b2232da74938

Cycles: Implmemented texture filtering for box mapping.

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

M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/render/nodes.cpp

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

diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index e95e533abd0..c6408e32149 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -183,7 +183,9 @@ ccl_device void svm_node_tex_image_box(KernelGlobals *kg, ShaderData *sd, float
 	 * 7 zones, with an if() test for each zone */
 
 	float3 weight = make_float3(0.0f, 0.0f, 0.0f);
-	float blend = __int_as_float(node.w);
+	uint blend_hi, blend_lo, dx_offset, dy_offset;
+	decode_node_uchar4(node.w, &blend_hi, &blend_lo, &dx_offset, &dy_offset);
+	float blend = ((blend_hi << 8) + blend_lo) / 65536.0f;
 	float limit = 0.5f*(1.0f + blend);
 
 	/* first test for corners with single texture */
@@ -235,20 +237,39 @@ ccl_device void svm_node_tex_image_box(KernelGlobals *kg, ShaderData *sd, float
 	float4 f = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 	uint use_alpha = stack_valid(alpha_offset);
 
-	differential ds = differential_zero();
-	differential dt = differential_zero();
-
+	float3 co_dx = make_float3(0.0f, 0.0f, 0.0f);
+	float3 co_dy = make_float3(0.0f, 0.0f, 0.0f);
+	differential ds, dt;
+#ifdef __KERNEL_CPU__
+	if(stack_valid(dx_offset) && stack_valid(dy_offset)) {
+		co_dx = co - stack_load_float3(stack, dx_offset);
+		co_dy = co - stack_load_float3(stack, dy_offset);
+	}
+#endif
+	
 	/* Map so that no textures are flipped, rotation is somewhat arbitrary. */
 	if(weight.x > 0.0f) {
-		float2 uv = make_float2((signed_N.x < 0.0f)? 1.0f - co.y: co.y, co.z);
+		float2 uv = make_float2((signed_N.x < 0.0f) ? 1.0f - co.y: co.y, co.z);
+		ds.dx = co_dx.y;
+		ds.dy = co_dy.y;
+		dt.dx = co_dx.z;
+		dt.dy = co_dy.z;
 		f += weight.x*svm_image_texture(kg, id, uv.x, uv.y, ds, dt, srgb, use_alpha, false);
 	}
 	if(weight.y > 0.0f) {
-		float2 uv = make_float2((signed_N.y > 0.0f)? 1.0f - co.x: co.x, co.z);
+		float2 uv = make_float2((signed_N.y < 0.0f) ? 1.0f - co.x: co.x, co.z);
+		ds.dx = co_dx.x;
+		ds.dy = co_dy.x;
+		dt.dx = co_dx.z;
+		dt.dy = co_dy.z;
 		f += weight.y*svm_image_texture(kg, id, uv.x, uv.y, ds, dt, srgb, use_alpha, false);
 	}
 	if(weight.z > 0.0f) {
-		float2 uv = make_float2((signed_N.z > 0.0f)? 1.0f - co.y: co.y, co.x);
+		float2 uv = make_float2((signed_N.z < 0.0f) ? 1.0f - co.y: co.y, co.x);
+		ds.dx = co_dx.y;
+		ds.dy = co_dy.y;
+		dt.dx = co_dx.x;
+		dt.dy = co_dy.x;
 		f += weight.z*svm_image_texture(kg, id, uv.x, uv.y, ds, dt, srgb, use_alpha, false);
 	}
 	if(stack_valid(out_offset))
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 8eeadd1cf66..68d0c75b107 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -337,6 +337,8 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 					0));
 		}
 		else {
+			/* Blend is a float between 0 and 1. Convert to 16 bit unsigned int to make room for vector_dx and vector_dy. */
+			uint blend = clamp(projection_blend, 0.0f, 1.0f) * 65535.0f;
 			compiler.add_node(NODE_TEX_IMAGE_BOX,
 				slot,
 				compiler.encode_uchar4(
@@ -344,7 +346,11 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 					compiler.stack_assign_if_linked(color_out),
 					compiler.stack_assign_if_linked(alpha_out),
 					srgb),
-				__float_as_int(projection_blend));
+				compiler.encode_uchar4(
+					blend >> 8,
+					blend & 0xff,
+					compiler.stack_assign(vector_dx),
+					compiler.stack_assign(vector_dy)));
 		}
 
 		tex_mapping.compile_end(compiler, vector_in, vector_offset);



More information about the Bf-blender-cvs mailing list