diff options
author | Thomas Dinges <blender@dingto.org> | 2016-01-07 01:38:13 +0300 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2016-01-07 01:43:29 +0300 |
commit | 83e73a2100688655f0eb2df5cbfac2ca1f051fff (patch) | |
tree | 76f1cd502187544777b61fa55f5695b2503993a8 /intern/cycles/kernel/kernel_shader.h | |
parent | be28706bacfb95e7c3c1b58b183acda0e35977f8 (diff) |
Cycles: Refactor how we pass bounce info to light path node.
This commit changes the way how we pass bounce information to the Light
Path node. Instead of manualy copying the bounces into ShaderData, we now
directly pass PathState. This reduces the arguments that we need to pass
around and also makes it easier to extend the feature.
This commit also exposes the Transmission Bounce Depth to the Light Path
node. It works similar to the Transparent Depth Output: Replace a
Transmission lightpath after X bounces with another shader, e.g a Diffuse
one. This can be used to avoid black surfaces, due to low amount of max
bounces.
Reviewed by Sergey and Brecht, thanks for some hlp with this.
I tested compilation and usage on CPU (SVM and OSL), CUDA, OpenCL Split
and Mega kernel. Hopefully this covers all devices. :)
Diffstat (limited to 'intern/cycles/kernel/kernel_shader.h')
-rw-r--r-- | intern/cycles/kernel/kernel_shader.h | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index 25e5822a21b..63e5ace8f94 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -49,7 +49,7 @@ ccl_device void shader_setup_object_transforms(KernelGlobals *kg, ShaderData *sd #endif ccl_device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, - const Intersection *isect, const Ray *ray, int bounce, int transparent_bounce) + const Intersection *isect, const Ray *ray) { #ifdef __INSTANCING__ ccl_fetch(sd, object) = (isect->object == PRIM_NONE)? kernel_tex_fetch(__prim_object, isect->prim): isect->object; @@ -66,8 +66,6 @@ ccl_device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, ccl_fetch(sd, prim) = kernel_tex_fetch(__prim_index, isect->prim); ccl_fetch(sd, ray_length) = isect->t; - ccl_fetch(sd, ray_depth) = bounce; - ccl_fetch(sd, transparent_depth) = transparent_bounce; #ifdef __UV__ ccl_fetch(sd, u) = isect->u; @@ -227,7 +225,7 @@ ccl_device_inline void shader_setup_from_subsurface(KernelGlobals *kg, ShaderDat ccl_device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, const float3 P, const float3 Ng, const float3 I, - int shader, int object, int prim, float u, float v, float t, float time, int bounce, int transparent_bounce) + int shader, int object, int prim, float u, float v, float t, float time) { /* vectors */ ccl_fetch(sd, P) = P; @@ -248,8 +246,6 @@ ccl_device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, ccl_fetch(sd, v) = v; #endif ccl_fetch(sd, ray_length) = t; - ccl_fetch(sd, ray_depth) = bounce; - ccl_fetch(sd, transparent_depth) = transparent_bounce; /* detect instancing, for non-instanced the object index is -object-1 */ #ifdef __INSTANCING__ @@ -347,12 +343,12 @@ ccl_device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd, /* watch out: no instance transform currently */ - shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v, 0.0f, TIME_INVALID, 0, 0); + shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v, 0.0f, TIME_INVALID); } /* ShaderData setup from ray into background */ -ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray, int bounce, int transparent_bounce) +ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray) { /* vectors */ ccl_fetch(sd, P) = ray->D; @@ -365,8 +361,6 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderDat ccl_fetch(sd, time) = ray->time; #endif ccl_fetch(sd, ray_length) = 0.0f; - ccl_fetch(sd, ray_depth) = bounce; - ccl_fetch(sd, transparent_depth) = transparent_bounce; #ifdef __INSTANCING__ ccl_fetch(sd, object) = PRIM_NONE; @@ -395,7 +389,7 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderDat /* ShaderData setup from point inside volume */ #ifdef __VOLUME__ -ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *sd, const Ray *ray, int bounce, int transparent_bounce) +ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *sd, const Ray *ray) { /* vectors */ sd->P = ray->P; @@ -408,8 +402,6 @@ ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *s sd->time = ray->time; #endif sd->ray_length = 0.0f; /* todo: can we set this to some useful value? */ - sd->ray_depth = bounce; - sd->transparent_depth = transparent_bounce; #ifdef __INSTANCING__ sd->object = PRIM_NONE; /* todo: fill this for texture coordinates */ @@ -826,19 +818,19 @@ ccl_device float3 shader_holdout_eval(KernelGlobals *kg, ShaderData *sd) /* Surface Evaluation */ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd, - float randb, int path_flag, ShaderContext ctx) + ccl_addr_space PathState *state, float randb, int path_flag, ShaderContext ctx) { ccl_fetch(sd, num_closure) = 0; ccl_fetch(sd, randb_closure) = randb; #ifdef __OSL__ if(kg->osl) - OSLShader::eval_surface(kg, sd, path_flag, ctx); + OSLShader::eval_surface(kg, sd, state, path_flag, ctx); else #endif { #ifdef __SVM__ - svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, path_flag); + svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag); #else ccl_fetch_array(sd, closure, 0)->weight = make_float3(0.8f, 0.8f, 0.8f); ccl_fetch_array(sd, closure, 0)->N = ccl_fetch(sd, N); @@ -851,21 +843,22 @@ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd, /* Background Evaluation */ -ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag, ShaderContext ctx) +ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, + ccl_addr_space PathState *state, int path_flag, ShaderContext ctx) { ccl_fetch(sd, num_closure) = 0; ccl_fetch(sd, randb_closure) = 0.0f; #ifdef __OSL__ if(kg->osl) { - return OSLShader::eval_background(kg, sd, path_flag, ctx); + return OSLShader::eval_background(kg, sd, state, path_flag, ctx); } else #endif { #ifdef __SVM__ - svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, path_flag); + svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag); float3 eval = make_float3(0.0f, 0.0f, 0.0f); @@ -992,7 +985,7 @@ ccl_device int shader_phase_sample_closure(KernelGlobals *kg, const ShaderData * /* Volume Evaluation */ ccl_device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd, - VolumeStack *stack, int path_flag, ShaderContext ctx) + PathState *state, VolumeStack *stack, int path_flag, ShaderContext ctx) { /* reset closures once at the start, we will be accumulating the closures * for all volumes in the stack into a single array of closures */ @@ -1022,12 +1015,12 @@ ccl_device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd, #ifdef __SVM__ #ifdef __OSL__ if(kg->osl) { - OSLShader::eval_volume(kg, sd, path_flag, ctx); + OSLShader::eval_volume(kg, sd, state, path_flag, ctx); } else #endif { - svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, path_flag); + svm_eval_nodes(kg, sd, state, SHADER_TYPE_VOLUME, path_flag); } #endif @@ -1041,7 +1034,7 @@ ccl_device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd, /* Displacement Evaluation */ -ccl_device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd, ShaderContext ctx) +ccl_device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd, ccl_addr_space PathState *state, ShaderContext ctx) { ccl_fetch(sd, num_closure) = 0; ccl_fetch(sd, randb_closure) = 0.0f; @@ -1054,7 +1047,7 @@ ccl_device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd, Shad else #endif { - svm_eval_nodes(kg, sd, SHADER_TYPE_DISPLACEMENT, 0); + svm_eval_nodes(kg, sd, state, SHADER_TYPE_DISPLACEMENT, 0); } #endif } |