[Bf-blender-cvs] [37c4d6a] master: Cycles Volume Render: add flags to quickly detect when objects have a volume shader.
Brecht Van Lommel
noreply at git.blender.org
Sat Dec 28 17:40:28 CET 2013
Commit: 37c4d6a50a7dc8e819ecab208f150ceb0ae1d01c
Author: Brecht Van Lommel
Date: Sat Dec 28 02:27:48 2013 +0100
https://developer.blender.org/rB37c4d6a50a7dc8e819ecab208f150ceb0ae1d01c
Cycles Volume Render: add flags to quickly detect when objects have a volume shader.
===================================================================
M intern/cycles/kernel/kernel_emission.h
M intern/cycles/kernel/kernel_shader.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/render/background.cpp
M intern/cycles/render/shader.cpp
===================================================================
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 2ce0b75..e0db943 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 012aa4a..6be8b66 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 4821a1b..f9742ad 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 9359618..c9c66da 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 8dbff22..2b938f4 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)
More information about the Bf-blender-cvs
mailing list