diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2013-12-28 05:27:48 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2013-12-28 19:57:10 +0400 |
commit | 37c4d6a50a7dc8e819ecab208f150ceb0ae1d01c (patch) | |
tree | dfb741142554015bb046ee20aedab3198637263e /intern/cycles | |
parent | a35db17cee5a9b47dc9624f7dfcb41f5fc185b33 (diff) |
Cycles Volume Render: add flags to quickly detect when objects have a volume shader.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/kernel/kernel_emission.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_shader.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 22 | ||||
-rw-r--r-- | intern/cycles/render/background.cpp | 15 | ||||
-rw-r--r-- | intern/cycles/render/shader.cpp | 17 |
5 files changed, 42 insertions, 16 deletions
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 2ce0b758972..e0db9435239 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -225,7 +225,7 @@ ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int ccl_device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, int bounce) { #ifdef __BACKGROUND__ - int shader = kernel_data.background.shader; + int shader = kernel_data.background.surface_shader; /* use visibility flag to skip lights */ if(shader & SHADER_EXCLUDE_ANY) { diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index 012aa4a7e19..6be8b66c150 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -376,7 +376,7 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderDat sd->N = -ray->D; sd->Ng = -ray->D; sd->I = -ray->D; - sd->shader = kernel_data.background.shader; + sd->shader = kernel_data.background.surface_shader; sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2); #ifdef __OBJECT_MOTION__ sd->time = ray->time; diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 4821a1b482c..f9742ad3b77 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -46,6 +46,8 @@ CCL_NAMESPACE_BEGIN #define TEX_NUM_FLOAT_IMAGES 5 +#define SHADER_NO_ID -1 + /* device capabilities */ #ifdef __KERNEL_CPU__ #define __KERNEL_SHADING__ @@ -502,13 +504,14 @@ enum ShaderDataFlag { SD_USE_MIS = 512, /* direct light sample */ SD_HAS_TRANSPARENT_SHADOW = 1024, /* has transparent shadow */ SD_HAS_VOLUME = 2048, /* has volume shader */ - SD_HOMOGENEOUS_VOLUME = 4096, /* has homogeneous volume */ - SD_HAS_BSSRDF_BUMP = 8192, /* bssrdf normal uses bump */ + SD_HAS_ONLY_VOLUME = 4096, /* has only volume shader, no surface */ + SD_HOMOGENEOUS_VOLUME = 8192, /* has homogeneous volume */ + SD_HAS_BSSRDF_BUMP = 16384, /* bssrdf normal uses bump */ /* object flags */ - SD_HOLDOUT_MASK = 16384, /* holdout for camera rays */ - SD_OBJECT_MOTION = 32768, /* has object motion blur */ - SD_TRANSFORM_APPLIED = 65536 /* vertices have transform applied */ + SD_HOLDOUT_MASK = 32768, /* holdout for camera rays */ + SD_OBJECT_MOTION = 65536, /* has object motion blur */ + SD_TRANSFORM_APPLIED = 131072 /* vertices have transform applied */ }; struct KernelGlobals; @@ -704,12 +707,15 @@ typedef struct KernelFilm { typedef struct KernelBackground { /* only shader index */ - int shader; + int surface_shader; + int volume_shader; int transparent; + int pad; /* ambient occlusion */ float ao_factor; float ao_distance; + float ao_pad1, ao_pad2; } KernelBackground; typedef struct KernelIntegrator { @@ -765,8 +771,8 @@ typedef struct KernelIntegrator { /* sampler */ int sampling_pattern; - /* padding */ - int pad; + /* volume render */ + int use_volumes; } KernelIntegrator; typedef struct KernelBVH { diff --git a/intern/cycles/render/background.cpp b/intern/cycles/render/background.cpp index 9359618b48d..c9c66dad3fe 100644 --- a/intern/cycles/render/background.cpp +++ b/intern/cycles/render/background.cpp @@ -65,16 +65,21 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene kbackground->ao_distance = ao_distance; kbackground->transparent = transparent; - kbackground->shader = scene->shader_manager->get_shader_id(shader); + kbackground->surface_shader = scene->shader_manager->get_shader_id(shader); + + if(scene->shaders[shader]->has_volume) + kbackground->volume_shader = kbackground->surface_shader; + else + kbackground->volume_shader = SHADER_NO_ID; if(!(visibility & PATH_RAY_DIFFUSE)) - kbackground->shader |= SHADER_EXCLUDE_DIFFUSE; + kbackground->surface_shader |= SHADER_EXCLUDE_DIFFUSE; if(!(visibility & PATH_RAY_GLOSSY)) - kbackground->shader |= SHADER_EXCLUDE_GLOSSY; + kbackground->surface_shader |= SHADER_EXCLUDE_GLOSSY; if(!(visibility & PATH_RAY_TRANSMIT)) - kbackground->shader |= SHADER_EXCLUDE_TRANSMIT; + kbackground->surface_shader |= SHADER_EXCLUDE_TRANSMIT; if(!(visibility & PATH_RAY_CAMERA)) - kbackground->shader |= SHADER_EXCLUDE_CAMERA; + kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA; need_update = false; } diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 8dbff224225..2b938f459c4 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -218,6 +218,7 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc uint *shader_flag = dscene->shader_flag.resize(shader_flag_size); uint i = 0; bool has_converter_blackbody = false; + bool has_volumes = false; foreach(Shader *shader, scene->shaders) { uint flag = 0; @@ -226,8 +227,19 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc flag |= SD_USE_MIS; if(shader->has_surface_transparent && shader->use_transparent_shadow) flag |= SD_HAS_TRANSPARENT_SHADOW; - if(shader->has_volume) + if(shader->has_volume) { flag |= SD_HAS_VOLUME; + has_volumes = true; + + /* in this case we can assume transparent surface */ + if(!shader->has_surface) + flag |= SD_HAS_ONLY_VOLUME; + + /* todo: this could check more fine grained, to skip useless volumes + * enclosed inside an opaque bsdf, although we still need to handle + * the case with camera inside volumes too */ + flag |= SD_HAS_TRANSPARENT_SHADOW; + } if(shader->homogeneous_volume) flag |= SD_HOMOGENEOUS_VOLUME; if(shader->has_bssrdf_bump) @@ -263,6 +275,9 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc blackbody_table_offset = TABLE_OFFSET_INVALID; } + /* volumes */ + KernelIntegrator *kintegrator = &dscene->data.integrator; + kintegrator->use_volumes = has_volumes; } void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scene *scene) |