diff options
author | Lukas Stockner <lukas.stockner@freenet.de> | 2016-10-30 02:33:10 +0300 |
---|---|---|
committer | Lukas Stockner <lukas.stockner@freenet.de> | 2016-10-30 03:16:22 +0300 |
commit | b2974d7ab79a257f8628c24c05d43da25791018d (patch) | |
tree | cd7b6376d8c5f5cd105bce74d82f991845d511e4 /intern/cycles/kernel/svm | |
parent | 5aa6a2ec06bbfa9ddd255c90ee02da5f9be36f30 (diff) |
Cycles: Add smoothing option to the Brick Texture
This option allows to create a smoother transition between Bricks and Mortar - 0 applies no smoothing, and 1 smooths across the whole mortar width.
Mainly useful for displacement textures.
The new default value for the smoothing option is 0.1 to give some smoothing that helps with antialiasing, but existing nodes are loaded with smoothing 0 to preserve compatibility.
Reviewers: sergey, dingto, juicyfruit, brecht
Reviewed By: brecht
Subscribers: Blendify, nutel
Differential Revision: https://developer.blender.org/D2230
Diffstat (limited to 'intern/cycles/kernel/svm')
-rw-r--r-- | intern/cycles/kernel/svm/svm_brick.h | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/intern/cycles/kernel/svm/svm_brick.h b/intern/cycles/kernel/svm/svm_brick.h index 9b0cf5ab8c4..47e1ba2ba6b 100644 --- a/intern/cycles/kernel/svm/svm_brick.h +++ b/intern/cycles/kernel/svm/svm_brick.h @@ -27,7 +27,7 @@ ccl_device_noinline float brick_noise(int n) /* fast integer noise */ return 0.5f * ((float)nn / 1073741824.0f); } -ccl_device_noinline float2 svm_brick(float3 p, float mortar_size, float bias, +ccl_device_noinline float2 svm_brick(float3 p, float mortar_size, float mortar_smooth, float bias, float brick_width, float row_height, float offset_amount, int offset_frequency, float squash_amount, int squash_frequency) { @@ -47,30 +47,41 @@ ccl_device_noinline float2 svm_brick(float3 p, float mortar_size, float bias, x = (p.x+offset) - brick_width*bricknum; y = p.y - row_height*rownum; - return make_float2( - saturate((brick_noise((rownum << 16) + (bricknum & 0xFFFF)) + bias)), + float tint = saturate((brick_noise((rownum << 16) + (bricknum & 0xFFFF)) + bias)); + float min_dist = min(min(x, y), min(brick_width - x, row_height - y)); - (x < mortar_size || y < mortar_size || - x > (brick_width - mortar_size) || - y > (row_height - mortar_size)) ? 1.0f : 0.0f); + float mortar; + if(min_dist >= mortar_size) { + mortar = 0.0f; + } + else if(mortar_smooth == 0.0f) { + mortar = 1.0f; + } + else { + min_dist = 1.0f - min_dist/mortar_size; + mortar = (min_dist < mortar_smooth)? smoothstepf(min_dist / mortar_smooth) : 1.0f; + } + + return make_float2(tint, mortar); } ccl_device void svm_node_tex_brick(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) { uint4 node2 = read_node(kg, offset); uint4 node3 = read_node(kg, offset); + uint4 node4 = read_node(kg, offset); /* Input and Output Sockets */ uint co_offset, color1_offset, color2_offset, mortar_offset, scale_offset; uint mortar_size_offset, bias_offset, brick_width_offset, row_height_offset; - uint color_offset, fac_offset; + uint color_offset, fac_offset, mortar_smooth_offset; /* RNA properties */ uint offset_frequency, squash_frequency; decode_node_uchar4(node.y, &co_offset, &color1_offset, &color2_offset, &mortar_offset); decode_node_uchar4(node.z, &scale_offset, &mortar_size_offset, &bias_offset, &brick_width_offset); - decode_node_uchar4(node.w, &row_height_offset, &color_offset, &fac_offset, NULL); + decode_node_uchar4(node.w, &row_height_offset, &color_offset, &fac_offset, &mortar_smooth_offset); decode_node_uchar4(node2.x, &offset_frequency, &squash_frequency, NULL, NULL); @@ -82,13 +93,14 @@ ccl_device void svm_node_tex_brick(KernelGlobals *kg, ShaderData *sd, float *sta float scale = stack_load_float_default(stack, scale_offset, node2.y); float mortar_size = stack_load_float_default(stack, mortar_size_offset, node2.z); + float mortar_smooth = stack_load_float_default(stack, mortar_smooth_offset, node4.x); float bias = stack_load_float_default(stack, bias_offset, node2.w); float brick_width = stack_load_float_default(stack, brick_width_offset, node3.x); float row_height = stack_load_float_default(stack, row_height_offset, node3.y); float offset_amount = __int_as_float(node3.z); float squash_amount = __int_as_float(node3.w); - float2 f2 = svm_brick(co*scale, mortar_size, bias, brick_width, row_height, + float2 f2 = svm_brick(co*scale, mortar_size, mortar_smooth, bias, brick_width, row_height, offset_amount, offset_frequency, squash_amount, squash_frequency); float tint = f2.x; @@ -100,7 +112,7 @@ ccl_device void svm_node_tex_brick(KernelGlobals *kg, ShaderData *sd, float *sta } if(stack_valid(color_offset)) - stack_store_float3(stack, color_offset, (f == 1.0f)? mortar: color1); + stack_store_float3(stack, color_offset, lerp(color1, mortar, f)); if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, f); } |