Page Menu
Home
Search
Configure Global Search
Log In
Paste
P524
Snippet for T52433
Active
Public
Actions
Authored by
Sergey Sharybin (sergey)
on Sep 4 2017, 6:00 PM.
Edit Paste
Archive Paste
View Raw File
Subscribe
Mute Notifications
Award Token
Tags
None
Subscribers
None
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 0ad3c8a7429..669214f85b2 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -91,6 +91,8 @@ void BVH::build(Progress& progress)
progress.set_substatus("Packing BVH nodes");
pack_nodes(root);
+ pack.root_bounds = root->bounds;
+
/* free build nodes */
root->deleteSubtree();
}
diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h
index 7bac6112fd9..74b694f710c 100644
--- a/intern/cycles/bvh/bvh.h
+++ b/intern/cycles/bvh/bvh.h
@@ -67,9 +67,12 @@ struct PackedBVH {
/* index of the root node. */
int root_index;
+ BoundBox root_bounds;
+
PackedBVH()
{
root_index = 0;
+ root_bounds = BoundBox::empty;
}
};
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 8f65c00491c..8ed61471b0e 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1304,7 +1304,7 @@ typedef struct KernelBVH {
int have_instancing;
int use_qbvh;
int use_bvh_steps;
- int pad1;
+ float max_distance;
} KernelBVH;
static_assert_align(KernelBVH, 16);
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index 42094a9c3f8..e7c11816c31 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -169,8 +169,10 @@ ccl_device void kernel_volume_shadow_homogeneous(KernelGlobals *kg,
{
float3 sigma_t;
- if(volume_shader_extinction_sample(kg, sd, state, ray->P, &sigma_t))
- *throughput *= volume_color_transmittance(sigma_t, ray->t);
+ if(volume_shader_extinction_sample(kg, sd, state, ray->P, &sigma_t)) {
+ const float ray_t = min(ray->t, kernel_data.bvh.max_distance);
+ *throughput *= volume_color_transmittance(sigma_t, ray_t);
+ }
}
/* heterogeneous volume: integrate stepping through the volume until we
@@ -183,6 +185,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg,
{
float3 tp = *throughput;
const float tp_eps = 1e-6f; /* todo: this is likely not the right value */
+ const float ray_t = min(ray->t, kernel_data.bvh.max_distance);
/* prepare for stepping */
int max_steps = kernel_data.integrator.volume_max_steps;
@@ -196,11 +199,11 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg,
for(int i = 0; i < max_steps; i++) {
/* advance to new position */
- float new_t = min(ray->t, (i+1) * step);
+ float new_t = min(ray_t, (i+1) * step);
float dt = new_t - t;
/* use random position inside this segment to sample shader */
- if(new_t == ray->t)
+ if(new_t == ray_t)
random_jitter_offset = lcg_step_float_addrspace(&state->rng_congruential) * dt;
float3 new_P = ray->P + ray->D * (t + random_jitter_offset);
@@ -223,7 +226,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg,
/* stop if at the end of the volume */
t = new_t;
- if(t == ray->t) {
+ if(t == ray_t) {
/* Update throughput in case we haven't done it above */
tp = *throughput * make_float3(expf(sum.x), expf(sum.y), expf(sum.z));
break;
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 84537bf5993..3f0ebc759c3 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1881,6 +1881,9 @@ void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene *
dscene->data.bvh.root = pack.root_index;
dscene->data.bvh.use_qbvh = scene->params.use_qbvh;
dscene->data.bvh.use_bvh_steps = (scene->params.num_bvh_time_steps != 0);
+
+ /* Twice so we don't have possible artifacts due to intersection precision. */
+ dscene->data.bvh.max_distance = 2.0f * len(pack.root_bounds.max - pack.root_bounds.min);
}
void MeshManager::device_update_flags(Device * /*device*/,
Event Timeline
Sergey Sharybin (sergey)
created this paste.
Sep 4 2017, 6:00 PM
Sergey Sharybin (sergey)
created this object with edit policy "Administrators".
Sergey Sharybin (sergey)
mentioned this in
T52433: Volume Absorption color tint
.
Log In to Comment