diff options
author | Mai Lavelle <mai.lavelle@gmail.com> | 2017-02-21 15:24:33 +0300 |
---|---|---|
committer | Mai Lavelle <mai.lavelle@gmail.com> | 2017-02-21 15:24:33 +0300 |
commit | 4e9b17da4ca7b0b77b796080217af495b9bd180b (patch) | |
tree | 1dc3f5a09b823075c47677d487c7ec0d805bb425 /intern/cycles/kernel/svm | |
parent | 34a502c16a5bf258d67e0371fc5fd9015d28dfa1 (diff) |
Cycles: Speedup by avoiding extra calculations in noise texture when unneeded
Noise texture is now faster when the color socket is unused. Potential for
speedup spotted by @nutel.
Some performance results:
Render Time Before After Difference
Gooseberry benchmark 47:51.34 45:55.57 -4%
Koro 12:24.92 12:18.46 -0.8%
Simple cube (Color socket) 48.53 48.72 +0.3%
Simple cube (Fac socket) 48.74 32.78 -32.7%
Goethe displacement 1:21.18 1:08.47 -15.6%
Cycles brick displacement 3:02.38 2:16.76 -25.0%
Large displacement scene 23:54.12 20:09.62 -15.6%
Reviewed By: sergey
Differential Revision: https://developer.blender.org/D2513
Diffstat (limited to 'intern/cycles/kernel/svm')
-rw-r--r-- | intern/cycles/kernel/svm/svm_noisetex.h | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/intern/cycles/kernel/svm/svm_noisetex.h b/intern/cycles/kernel/svm/svm_noisetex.h index 62ff38cf1c5..0347ab7b193 100644 --- a/intern/cycles/kernel/svm/svm_noisetex.h +++ b/intern/cycles/kernel/svm/svm_noisetex.h @@ -18,50 +18,42 @@ CCL_NAMESPACE_BEGIN /* Noise */ -ccl_device_inline void svm_noise(float3 p, float detail, float distortion, float *fac, float3 *color) -{ - int hard = 0; - - if(distortion != 0.0f) { - float3 r, offset = make_float3(13.5f, 13.5f, 13.5f); - - r.x = noise(p + offset) * distortion; - r.y = noise(p) * distortion; - r.z = noise(p - offset) * distortion; - - p += r; - } - - *fac = noise_turbulence(p, detail, hard); - *color = make_float3(*fac, - noise_turbulence(make_float3(p.y, p.x, p.z), detail, hard), - noise_turbulence(make_float3(p.y, p.z, p.x), detail, hard)); -} - ccl_device void svm_node_tex_noise(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) { uint co_offset, scale_offset, detail_offset, distortion_offset, fac_offset, color_offset; decode_node_uchar4(node.y, &co_offset, &scale_offset, &detail_offset, &distortion_offset); + decode_node_uchar4(node.z, &color_offset, &fac_offset, NULL, NULL); uint4 node2 = read_node(kg, offset); float scale = stack_load_float_default(stack, scale_offset, node2.x); float detail = stack_load_float_default(stack, detail_offset, node2.y); float distortion = stack_load_float_default(stack, distortion_offset, node2.z); - float3 co = stack_load_float3(stack, co_offset); + float3 p = stack_load_float3(stack, co_offset) * scale; + int hard = 0; - float3 color; - float f; + if(distortion != 0.0f) { + float3 r, offset = make_float3(13.5f, 13.5f, 13.5f); + + r.x = noise(p + offset) * distortion; + r.y = noise(p) * distortion; + r.z = noise(p - offset) * distortion; - svm_noise(co*scale, detail, distortion, &f, &color); + p += r; + } - decode_node_uchar4(node.z, &color_offset, &fac_offset, NULL, NULL); + float f = noise_turbulence(p, detail, hard); - if(stack_valid(fac_offset)) + if(stack_valid(fac_offset)) { stack_store_float(stack, fac_offset, f); - if(stack_valid(color_offset)) + } + if(stack_valid(color_offset)) { + float3 color = make_float3(f, + noise_turbulence(make_float3(p.y, p.x, p.z), detail, hard), + noise_turbulence(make_float3(p.y, p.z, p.x), detail, hard)); stack_store_float3(stack, color_offset, color); + } } CCL_NAMESPACE_END |