Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-01-26 16:09:55 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-01-26 20:47:21 +0300
commitce4915cddb08860f06ccc6a8ce7a7118441674ec (patch)
treee23ea9079bfb003875d70094da32ae4f973fd8da /intern/cycles/kernel/kernel_subsurface.h
parent47a3bbcc34185684813ba21d808f124c584a93ae (diff)
Code refactor: store RGB BSSRDF in a single closure.
Previously we stored each color channel in a single closure, which was convenient for sampling a closure and channel together. But this doesn't work so well for algorithms where we want to render multiple color channels together.
Diffstat (limited to 'intern/cycles/kernel/kernel_subsurface.h')
-rw-r--r--intern/cycles/kernel/kernel_subsurface.h48
1 files changed, 20 insertions, 28 deletions
diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h
index c79992ee99b..582a20704d3 100644
--- a/intern/cycles/kernel/kernel_subsurface.h
+++ b/intern/cycles/kernel/kernel_subsurface.h
@@ -23,11 +23,6 @@ CCL_NAMESPACE_BEGIN
*
*/
-/* TODO:
- * - test using power heuristic for combing bssrdfs
- * - try to reduce one sample model variance
- */
-
ccl_device_inline float3 subsurface_scatter_eval(ShaderData *sd,
const ShaderClosure *sc,
float disk_r,
@@ -63,12 +58,11 @@ ccl_device_inline float3 subsurface_scatter_eval(ShaderData *sd,
float sample_weight = (all)? 1.0f: sc->sample_weight * sample_weight_inv;
/* compute pdf */
- float pdf = bssrdf_pdf(sc, r);
- float disk_pdf = bssrdf_pdf(sc, disk_r);
+ float3 eval = bssrdf_eval(sc, r);
+ float pdf = bssrdf_pdf(sc, disk_r);
- /* TODO power heuristic is not working correct here */
- eval_sum += sc->weight*pdf; //*sample_weight*disk_pdf;
- pdf_sum += sample_weight*disk_pdf; //*sample_weight*disk_pdf;
+ eval_sum += sc->weight * eval;
+ pdf_sum += sample_weight * pdf;
}
}
@@ -190,20 +184,20 @@ ccl_device_inline int subsurface_scatter_multi_intersect(
disk_N = sd->Ng;
make_orthonormals(disk_N, &disk_T, &disk_B);
- if(disk_u < 0.5f) {
+ if(disk_v < 0.5f) {
pick_pdf_N = 0.5f;
pick_pdf_T = 0.25f;
pick_pdf_B = 0.25f;
- disk_u *= 2.0f;
+ disk_v *= 2.0f;
}
- else if(disk_u < 0.75f) {
+ else if(disk_v < 0.75f) {
float3 tmp = disk_N;
disk_N = disk_T;
disk_T = tmp;
pick_pdf_N = 0.25f;
pick_pdf_T = 0.5f;
pick_pdf_B = 0.25f;
- disk_u = (disk_u - 0.5f)*4.0f;
+ disk_v = (disk_v - 0.5f)*4.0f;
}
else {
float3 tmp = disk_N;
@@ -212,15 +206,14 @@ ccl_device_inline int subsurface_scatter_multi_intersect(
pick_pdf_N = 0.25f;
pick_pdf_T = 0.25f;
pick_pdf_B = 0.5f;
- disk_u = (disk_u - 0.75f)*4.0f;
+ disk_v = (disk_v - 0.75f)*4.0f;
}
/* sample point on disk */
- float phi = M_2PI_F * disk_u;
- float disk_r = disk_v;
- float disk_height;
+ float phi = M_2PI_F * disk_v;
+ float disk_height, disk_r;
- bssrdf_sample(sc, disk_r, &disk_r, &disk_height);
+ bssrdf_sample(sc, disk_u, &disk_r, &disk_height);
float3 disk_P = (disk_r*cosf(phi)) * disk_T + (disk_r*sinf(phi)) * disk_B;
@@ -359,20 +352,20 @@ ccl_device void subsurface_scatter_step(KernelGlobals *kg, ShaderData *sd, ccl_a
disk_N = sd->Ng;
make_orthonormals(disk_N, &disk_T, &disk_B);
- if(disk_u < 0.5f) {
+ if(disk_v < 0.5f) {
pick_pdf_N = 0.5f;
pick_pdf_T = 0.25f;
pick_pdf_B = 0.25f;
- disk_u *= 2.0f;
+ disk_v *= 2.0f;
}
- else if(disk_u < 0.75f) {
+ else if(disk_v < 0.75f) {
float3 tmp = disk_N;
disk_N = disk_T;
disk_T = tmp;
pick_pdf_N = 0.25f;
pick_pdf_T = 0.5f;
pick_pdf_B = 0.25f;
- disk_u = (disk_u - 0.5f)*4.0f;
+ disk_v = (disk_v - 0.5f)*4.0f;
}
else {
float3 tmp = disk_N;
@@ -381,15 +374,14 @@ ccl_device void subsurface_scatter_step(KernelGlobals *kg, ShaderData *sd, ccl_a
pick_pdf_N = 0.25f;
pick_pdf_T = 0.25f;
pick_pdf_B = 0.5f;
- disk_u = (disk_u - 0.75f)*4.0f;
+ disk_v = (disk_v - 0.75f)*4.0f;
}
/* sample point on disk */
- float phi = M_2PI_F * disk_u;
- float disk_r = disk_v;
- float disk_height;
+ float phi = M_2PI_F * disk_v;
+ float disk_height, disk_r;
- bssrdf_sample(sc, disk_r, &disk_r, &disk_height);
+ bssrdf_sample(sc, disk_u, &disk_r, &disk_height);
float3 disk_P = (disk_r*cosf(phi)) * disk_T + (disk_r*sinf(phi)) * disk_B;