diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2013-12-30 01:19:38 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2013-12-30 03:04:02 +0400 |
commit | 889d77e6f67e8da70a7cd7dcec6eec12bd996d9f (patch) | |
tree | 16a27ead241306ceafe3f5741b8c9e65d785f68c /intern/cycles/kernel/kernel_path_state.h | |
parent | af128c4c9655c57b860010746dc7b5707c6520ba (diff) |
Cycles Volume Render: heterogeneous (textured) volumes support.
Volumes can now have textured colors and density. There is a Volume Sampling
panel in the Render properties with these settings:
* Step size: distance between volume shader samples when rendering the volume.
Lower values give more accurate and detailed results but also increased render
time.
* Max steps: maximum number of steps through the volume before giving up, to
protect from extremely long render times with big objects or small step sizes.
This is much more compute intensive than homogeneous volume, so when you are not
using a texture you should enable the Homogeneous Volume option in the material
or world for faster rendering.
One important missing feature is that Generated texture coordinates are not yet
working in volumes, and they are the default coordinates for nearly all texture
nodes. So until that works you need to plug in object texture coordinates or a
world space position.
This is work by "storm", Stuart Broadfoot, Thomas Dinges and myself.
Diffstat (limited to 'intern/cycles/kernel/kernel_path_state.h')
-rw-r--r-- | intern/cycles/kernel/kernel_path_state.h | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h index afca28fddcf..3e0ad81c187 100644 --- a/intern/cycles/kernel/kernel_path_state.h +++ b/intern/cycles/kernel/kernel_path_state.h @@ -16,7 +16,7 @@ CCL_NAMESPACE_BEGIN -ccl_device_inline void path_state_init(KernelGlobals *kg, PathState *state) +ccl_device_inline void path_state_init(KernelGlobals *kg, PathState *state, RNG *rng, int sample) { state->flag = PATH_RAY_CAMERA|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP; state->bounce = 0; @@ -26,7 +26,15 @@ ccl_device_inline void path_state_init(KernelGlobals *kg, PathState *state) state->transparent_bounce = 0; #ifdef __VOLUME__ - kernel_volume_stack_init(kg, state->volume_stack); + if(kernel_data.integrator.use_volumes) { + /* initialize volume stack with volume we are inside of */ + kernel_volume_stack_init(kg, state->volume_stack); + /* seed RNG for cases where we can't use stratified samples */ + state->rng_congruential = lcg_init(*rng + sample*0x51633e2d); + } + else { + state->volume_stack[0].shader = SHADER_NO_ID; + } #endif } |