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/render/shader.cpp | |
parent | a35db17cee5a9b47dc9624f7dfcb41f5fc185b33 (diff) |
Cycles Volume Render: add flags to quickly detect when objects have a volume shader.
Diffstat (limited to 'intern/cycles/render/shader.cpp')
-rw-r--r-- | intern/cycles/render/shader.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
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) |