[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