[Bf-blender-cvs] [2ec243d2612] cycles-x: Cycles X: tweak a few functions for easier reuse in volume code
Brecht Van Lommel
noreply at git.blender.org
Mon Jun 28 17:15:23 CEST 2021
Commit: 2ec243d2612253f959f8f096a968f5052d4b54b6
Author: Brecht Van Lommel
Date: Thu Jun 17 17:27:48 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB2ec243d2612253f959f8f096a968f5052d4b54b6
Cycles X: tweak a few functions for easier reuse in volume code
===================================================================
M intern/cycles/kernel/integrator/integrator_intersect_closest.h
M intern/cycles/kernel/integrator/integrator_shade_background.h
M intern/cycles/kernel/integrator/integrator_shade_light.h
M intern/cycles/kernel/integrator/integrator_shade_surface.h
M intern/cycles/kernel/integrator/integrator_shade_volume.h
M intern/cycles/kernel/kernel_accumulate.h
M intern/cycles/kernel/kernel_emission.h
M intern/cycles/kernel/kernel_shader.h
===================================================================
diff --git a/intern/cycles/kernel/integrator/integrator_intersect_closest.h b/intern/cycles/kernel/integrator/integrator_intersect_closest.h
index b0fc87f5c8d..a4538e8f771 100644
--- a/intern/cycles/kernel/integrator/integrator_intersect_closest.h
+++ b/intern/cycles/kernel/integrator/integrator_intersect_closest.h
@@ -29,20 +29,18 @@
CCL_NAMESPACE_BEGIN
template<uint32_t current_kernel>
-ccl_device_forceinline bool integrator_intersect_shader_next_kernel(
- INTEGRATOR_STATE_ARGS, const Intersection *ccl_restrict isect)
+ccl_device_forceinline bool integrator_intersect_terminate(INTEGRATOR_STATE_ARGS,
+ const Intersection *ccl_restrict isect,
+ const int shader_flags)
{
- /* Find shader from intersection. */
- const int shader = intersection_get_shader(kg, isect);
- const int flags = kernel_tex_fetch(__shaders, shader).flags;
/* Optional AO bounce termination. */
if (path_state_ao_bounce(INTEGRATOR_STATE_PASS)) {
- if (flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
+ if (shader_flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
INTEGRATOR_STATE_WRITE(path, flag) |= PATH_RAY_TERMINATE_AFTER_TRANSPARENT;
}
else {
- return false;
+ return true;
}
}
@@ -60,18 +58,28 @@ ccl_device_forceinline bool integrator_intersect_shader_next_kernel(
const float terminate = path_state_rng_1D(kg, &rng_state, PRNG_TERMINATE);
if (probability == 0.0f || terminate >= probability) {
- if (flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
+ if (shader_flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
/* Mark path to be terminated right after shader evaluation. */
INTEGRATOR_STATE_WRITE(path, flag) |= PATH_RAY_TERMINATE_IMMEDIATE;
}
else {
- return false;
+ return true;
}
}
}
+ return false;
+}
+
+template<uint32_t current_kernel>
+ccl_device_forceinline void integrator_intersect_shader_next_kernel(
+ INTEGRATOR_STATE_ARGS,
+ const Intersection *ccl_restrict isect,
+ const int shader,
+ const int shader_flags)
+{
/* Setup next kernel to execute. */
- if (flags & SD_HAS_RAYTRACE) {
+ if (shader_flags & SD_HAS_RAYTRACE) {
INTEGRATOR_PATH_NEXT_SORTED(
current_kernel, DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE, shader);
}
@@ -82,8 +90,6 @@ ccl_device_forceinline bool integrator_intersect_shader_next_kernel(
/* Setup shadow catcher. */
const int object_flags = intersection_get_object_flags(kg, isect);
kernel_shadow_catcher_split(INTEGRATOR_STATE_PASS, object_flags);
-
- return true;
}
ccl_device void integrator_intersect_closest(INTEGRATOR_STATE_ARGS)
@@ -142,8 +148,13 @@ ccl_device void integrator_intersect_closest(INTEGRATOR_STATE_ARGS)
}
else {
/* Hit a surface, continue with surface kernel unless terminated. */
- if (integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST>(
- INTEGRATOR_STATE_PASS, &isect)) {
+ const int shader = intersection_get_shader(kg, &isect);
+ const int flags = kernel_tex_fetch(__shaders, shader).flags;
+
+ if (!integrator_intersect_terminate<DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST>(
+ INTEGRATOR_STATE_PASS, &isect, flags)) {
+ integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST>(
+ INTEGRATOR_STATE_PASS, &isect, shader, flags);
return;
}
else {
diff --git a/intern/cycles/kernel/integrator/integrator_shade_background.h b/intern/cycles/kernel/integrator/integrator_shade_background.h
index 49666fea536..3c310dec898 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_background.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_background.h
@@ -166,7 +166,8 @@ ccl_device_inline void integrate_distant_lights(INTEGRATOR_STATE_ARGS,
}
/* Write to render buffer. */
- kernel_accum_emission(INTEGRATOR_STATE_PASS, light_eval, render_buffer);
+ const float3 throughput = INTEGRATOR_STATE(path, throughput);
+ kernel_accum_emission(INTEGRATOR_STATE_PASS, throughput, light_eval, render_buffer);
}
}
}
diff --git a/intern/cycles/kernel/integrator/integrator_shade_light.h b/intern/cycles/kernel/integrator/integrator_shade_light.h
index d22fb069f1d..04c8a255664 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_light.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_light.h
@@ -88,7 +88,8 @@ ccl_device_inline void integrate_light(INTEGRATOR_STATE_ARGS,
}
/* Write to render buffer. */
- kernel_accum_emission(INTEGRATOR_STATE_PASS, light_eval, render_buffer);
+ const float3 throughput = INTEGRATOR_STATE(path, throughput);
+ kernel_accum_emission(INTEGRATOR_STATE_PASS, throughput, light_eval, render_buffer);
}
ccl_device void integrator_shade_light(INTEGRATOR_STATE_ARGS,
diff --git a/intern/cycles/kernel/integrator/integrator_shade_surface.h b/intern/cycles/kernel/integrator/integrator_shade_surface.h
index 4feda3ab904..d07f6704b8c 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_surface.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_surface.h
@@ -94,7 +94,8 @@ ccl_device_forceinline void integrate_surface_emission(INTEGRATOR_STATE_CONST_AR
L *= mis_weight;
}
- kernel_accum_emission(INTEGRATOR_STATE_PASS, L, render_buffer);
+ const float3 throughput = INTEGRATOR_STATE(path, throughput);
+ kernel_accum_emission(INTEGRATOR_STATE_PASS, throughput, L, render_buffer);
}
#endif /* __EMISSION__ */
diff --git a/intern/cycles/kernel/integrator/integrator_shade_volume.h b/intern/cycles/kernel/integrator/integrator_shade_volume.h
index 279f692feed..e7b0c187518 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_volume.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_volume.h
@@ -154,14 +154,12 @@ ccl_device void integrator_shade_volume(INTEGRATOR_STATE_ARGS,
}
else {
/* Hit a surface, continue with surface kernel unless terminated. */
- if (integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME>(
- INTEGRATOR_STATE_PASS, &isect)) {
- return;
- }
- else {
- INTEGRATOR_PATH_TERMINATE(DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME);
- return;
- }
+ const int shader = intersection_get_shader(kg, &isect);
+ const int flags = kernel_tex_fetch(__shaders, shader).flags;
+
+ integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME>(
+ INTEGRATOR_STATE_PASS, &isect, shader, flags);
+ return;
}
}
#endif /* __VOLUME__ */
diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index 3dff2464e15..54b8ff79df5 100644
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@ -658,10 +658,11 @@ ccl_device_inline void kernel_accum_background(INTEGRATOR_STATE_CONST_ARGS,
/* Write emission to render buffer. */
ccl_device_inline void kernel_accum_emission(INTEGRATOR_STATE_CONST_ARGS,
+ const float3 throughput,
const float3 L,
ccl_global float *ccl_restrict render_buffer)
{
- float3 contribution = INTEGRATOR_STATE(path, throughput) * L;
+ float3 contribution = throughput * L;
kernel_accum_clamp(kg, &contribution, INTEGRATOR_STATE(path, bounce) - 1);
ccl_global float *buffer = kernel_accum_pixel_render_buffer(INTEGRATOR_STATE_PASS,
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 67469dca3b7..c5173cc2563 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -133,14 +133,20 @@ ccl_device_inline bool light_sample_terminate(const KernelGlobals *ccl_restrict
}
/* Create shadow ray towards light sample. */
+template<bool is_volume = false>
ccl_device_inline void light_sample_to_shadow_ray(const ShaderData *sd,
const LightSample *ls,
Ray *ray)
{
if (ls->shader & SHADER_CAST_SHADOW) {
/* setup ray */
- bool transmit = (dot(sd->Ng, ls->D) < 0.0f);
- ray->P = ray_offset(sd->P, (transmit) ? -sd->Ng : sd->Ng);
+ if (is_volume) {
+ ray->P = sd->P;
+ }
+ else {
+ bool transmit = (dot(sd->Ng, ls->D) < 0.0f);
+ ray->P = ray_offset(sd->P, (transmit) ? -sd->Ng : sd->Ng);
+ }
if (ls->t == FLT_MAX) {
/* distant light */
@@ -164,18 +170,4 @@ ccl_device_inline void light_sample_to_shadow_ray(const ShaderData *sd,
ray->time = sd->time;
}
-/* Volume phase evaluation code - to be moved into volume code. */
-#if 0
-# ifdef __VOLUME__
- float bsdf_pdf;
- shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf);
- if (ls->shader & SHADER_USE_MIS) {
- /* Multiple importance sampling. */
- float mis_weight = power_heuristic(ls->pdf, bsdf_pdf);
- light_eval *= mis_weight;
- }
- }
-# endif
-#endif
-
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index ab9f6e7c540..ee27bab3f8c 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -1098,13 +1098,19 @@ ccl_device void shader_volume_phase_eval(const KernelGlobals *kg,
const ShaderData *sd,
const float3 omega_in,
BsdfEval *eval,
- float *pdf)
+ const float light_pdf,
+ const uint light_shader_flags)
{
PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_EVAL);
bsdf_eval_init(eval, false, zero_float3(), kernel_data.film.use_light_pass);
- _shader_volume_phase_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
+ float pdf;
+ _shader_volu
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list