[Bf-blender-cvs] [13b8a2ea83c] cycles-x: Cycles X: adapt AO/bevel node implementation to new code
Brecht Van Lommel
noreply at git.blender.org
Thu May 27 19:15:40 CEST 2021
Commit: 13b8a2ea83c85ab156b221ee27a522f6aeca4673
Author: Brecht Van Lommel
Date: Thu May 27 12:32:55 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB13b8a2ea83c85ab156b221ee27a522f6aeca4673
Cycles X: adapt AO/bevel node implementation to new code
Still not actually rendering through.
===================================================================
M intern/cycles/kernel/kernel_path_state.h
M intern/cycles/kernel/svm/svm_ao.h
M intern/cycles/kernel/svm/svm_bevel.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h
index 0e193ebbe33..8798424aca2 100644
--- a/intern/cycles/kernel/kernel_path_state.h
+++ b/intern/cycles/kernel/kernel_path_state.h
@@ -338,18 +338,18 @@ ccl_device_inline float path_state_rng_1D_hash(const KernelGlobals *kg,
}
ccl_device_inline float path_branched_rng_1D(const KernelGlobals *kg,
- uint rng_hash,
const RNGState *rng_state,
int branch,
int num_branches,
int dimension)
{
- return path_rng_1D(
- kg, rng_hash, rng_state->sample * num_branches + branch, rng_state->rng_offset + dimension);
+ return path_rng_1D(kg,
+ rng_state->rng_hash,
+ rng_state->sample * num_branches + branch,
+ rng_state->rng_offset + dimension);
}
ccl_device_inline void path_branched_rng_2D(const KernelGlobals *kg,
- uint rng_hash,
const RNGState *rng_state,
int branch,
int num_branches,
@@ -358,7 +358,7 @@ ccl_device_inline void path_branched_rng_2D(const KernelGlobals *kg,
float *fy)
{
path_rng_2D(kg,
- rng_hash,
+ rng_state->rng_hash,
rng_state->sample * num_branches + branch,
rng_state->rng_offset + dimension,
fx,
@@ -377,13 +377,4 @@ ccl_device_inline float path_state_rng_light_termination(const KernelGlobals *kg
return 0.0f;
}
-ccl_device_inline float path_branched_rng_light_termination(
- const KernelGlobals *kg, uint rng_hash, const RNGState *state, int branch, int num_branches)
-{
- if (kernel_data.integrator.light_inv_rr_threshold > 0.0f) {
- return path_branched_rng_1D(kg, rng_hash, state, branch, num_branches, PRNG_LIGHT_TERMINATE);
- }
- return 0.0f;
-}
-
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/svm/svm_ao.h b/intern/cycles/kernel/svm/svm_ao.h
index 94d5c4d4712..1cff8d678b3 100644
--- a/intern/cycles/kernel/svm/svm_ao.h
+++ b/intern/cycles/kernel/svm/svm_ao.h
@@ -48,13 +48,14 @@ ccl_device_noinline float svm_ao(INTEGRATOR_STATE_CONST_ARGS,
float3 T, B;
make_orthonormals(N, &T, &B);
+ /* TODO: support ray-tracing in shadow shader evaluation? */
+ RNGState rng_state;
+ path_state_rng_load(INTEGRATOR_STATE_PASS, &rng_state);
+
int unoccluded = 0;
for (int sample = 0; sample < num_samples; sample++) {
- /* TODO */
-# if 0
float disk_u, disk_v;
- path_branched_rng_2D(
- kg, state->rng_hash, state, sample, num_samples, PRNG_BEVEL_U, &disk_u, &disk_v);
+ path_branched_rng_2D(kg, &rng_state, sample, num_samples, PRNG_BEVEL_U, &disk_u, &disk_v);
float2 d = concentric_sample_disk(disk_u, disk_v);
float3 D = make_float3(d.x, d.y, safe_sqrtf(1.0f - dot(d, d)));
@@ -65,8 +66,8 @@ ccl_device_noinline float svm_ao(INTEGRATOR_STATE_CONST_ARGS,
ray.D = D.x * T + D.y * B + D.z * N;
ray.t = max_dist;
ray.time = sd->time;
- ray.dP = sd->dP;
- ray.dD = differential3_zero();
+ ray.dP = differential_zero_compact();
+ ray.dD = differential_zero_compact();
if (flags & NODE_AO_ONLY_LOCAL) {
if (!scene_intersect_local(kg, &ray, NULL, sd->object, NULL, 0)) {
@@ -79,7 +80,6 @@ ccl_device_noinline float svm_ao(INTEGRATOR_STATE_CONST_ARGS,
unoccluded++;
}
}
-# endif
}
return ((float)unoccluded) / num_samples;
diff --git a/intern/cycles/kernel/svm/svm_bevel.h b/intern/cycles/kernel/svm/svm_bevel.h
index 4ad1109daa8..9ba9182e6c8 100644
--- a/intern/cycles/kernel/svm/svm_bevel.h
+++ b/intern/cycles/kernel/svm/svm_bevel.h
@@ -33,8 +33,6 @@ ccl_device_noinline float3 svm_bevel(INTEGRATOR_STATE_CONST_ARGS,
float radius,
int num_samples)
{
- /* TODO */
-# if 0
/* Early out if no sampling needed. */
if (radius <= 0.0f || num_samples < 1 || sd->object == OBJECT_NONE) {
return sd->N;
@@ -46,21 +44,27 @@ ccl_device_noinline float3 svm_bevel(INTEGRATOR_STATE_CONST_ARGS,
}
/* Don't bevel for blurry indirect rays. */
- if (state->min_ray_pdf < 8.0f) {
+ if (INTEGRATOR_STATE(path, min_ray_pdf) < 8.0f) {
return sd->N;
}
/* Setup for multi intersection. */
LocalIntersection isect;
- uint lcg_state = lcg_state_init_addrspace(state, 0x64c6a40e);
+ uint lcg_state = lcg_state_init(INTEGRATOR_STATE(path, rng_hash),
+ INTEGRATOR_STATE(path, rng_offset),
+ INTEGRATOR_STATE(path, sample),
+ 0x64c6a40e);
/* Sample normals from surrounding points on surface. */
float3 sum_N = make_float3(0.0f, 0.0f, 0.0f);
+ /* TODO: support ray-tracing in shadow shader evaluation? */
+ RNGState rng_state;
+ path_state_rng_load(INTEGRATOR_STATE_PASS, &rng_state);
+
for (int sample = 0; sample < num_samples; sample++) {
float disk_u, disk_v;
- path_branched_rng_2D(
- kg, state->rng_hash, state, sample, num_samples, PRNG_BEVEL_U, &disk_u, &disk_v);
+ path_branched_rng_2D(kg, &rng_state, sample, num_samples, PRNG_BEVEL_U, &disk_u, &disk_v);
/* Pick random axis in local frame and point on disk. */
float3 disk_N, disk_T, disk_B;
@@ -111,8 +115,8 @@ ccl_device_noinline float3 svm_bevel(INTEGRATOR_STATE_CONST_ARGS,
ray->P = sd->P + disk_N * disk_height + disk_P;
ray->D = -disk_N;
ray->t = 2.0f * disk_height;
- ray->dP = sd->dP;
- ray->dD = differential3_zero();
+ ray->dP = differential_zero_compact();
+ ray->dD = differential_zero_compact();
ray->time = sd->time;
/* Intersect with the same object. if multiple intersections are found it
@@ -125,16 +129,18 @@ ccl_device_noinline float3 svm_bevel(INTEGRATOR_STATE_CONST_ARGS,
/* Quickly retrieve P and Ng without setting up ShaderData. */
float3 hit_P;
if (sd->type & PRIMITIVE_TRIANGLE) {
- hit_P = triangle_refine_local(kg, sd, &isect.hits[hit], ray);
+ hit_P = triangle_refine_local(
+ kg, sd, ray->P, ray->D, ray->t, isect.hits[hit].object, isect.hits[hit].prim);
}
-# ifdef __OBJECT_MOTION__
+# ifdef __OBJECT_MOTION__
else if (sd->type & PRIMITIVE_MOTION_TRIANGLE) {
float3 verts[3];
motion_triangle_vertices(
kg, sd->object, kernel_tex_fetch(__prim_index, isect.hits[hit].prim), sd->time, verts);
- hit_P = motion_triangle_refine_local(kg, sd, &isect.hits[hit], ray, verts);
+ hit_P = motion_triangle_refine_local(
+ kg, sd, ray->P, ray->D, ray->t, isect.hits[hit].object, isect.hits[hit].prim, verts);
}
-# endif /* __OBJECT_MOTION__ */
+# endif /* __OBJECT_MOTION__ */
/* Get geometric normal. */
float3 hit_Ng = isect.Ng[hit];
@@ -158,11 +164,11 @@ ccl_device_noinline float3 svm_bevel(INTEGRATOR_STATE_CONST_ARGS,
if (sd->type & PRIMITIVE_TRIANGLE) {
N = triangle_smooth_normal(kg, N, prim, u, v);
}
-# ifdef __OBJECT_MOTION__
+# ifdef __OBJECT_MOTION__
else if (sd->type & PRIMITIVE_MOTION_TRIANGLE) {
N = motion_triangle_smooth_normal(kg, N, sd->object, prim, u, v, sd->time);
}
-# endif /* __OBJECT_MOTION__ */
+# endif /* __OBJECT_MOTION__ */
}
/* Transform normals to world space. */
@@ -201,9 +207,6 @@ ccl_device_noinline float3 svm_bevel(INTEGRATOR_STATE_CONST_ARGS,
/* Normalize. */
float3 N = safe_normalize(sum_N);
return is_zero(N) ? sd->N : (sd->flag & SD_BACKFACING) ? -N : N;
-# else
- return sd->N;
-# endif
}
ccl_device void svm_node_bevel(INTEGRATOR_STATE_CONST_ARGS,
More information about the Bf-blender-cvs
mailing list