diff options
-rw-r--r-- | intern/cycles/kernel/closure/volume.h | 16 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 3 |
2 files changed, 10 insertions, 9 deletions
diff --git a/intern/cycles/kernel/closure/volume.h b/intern/cycles/kernel/closure/volume.h index 9f519e2e2b1..1cf5e17b8f7 100644 --- a/intern/cycles/kernel/closure/volume.h +++ b/intern/cycles/kernel/closure/volume.h @@ -26,9 +26,6 @@ CCL_NAMESPACE_BEGIN * uniform sphere. g=0 uniform diffuse-like, g=1 close to sharp single ray. */ ccl_device float single_peaked_henyey_greenstein(float cos_theta, float g) { - if(fabsf(g) < 1e-3f) - return M_1_PI_F * 0.25f; - return ((1.0f - g * g) / safe_powf(1.0f + g * g - 2.0f * g * cos_theta, 1.5f)) * (M_1_PI_F * 0.25f); }; @@ -47,9 +44,13 @@ ccl_device float3 volume_henyey_greenstein_eval_phase(const ShaderClosure *sc, c float g = sc->data0; /* note that I points towards the viewer */ - float cos_theta = dot(-I, omega_in); - - *pdf = single_peaked_henyey_greenstein(cos_theta, g); + if(fabsf(g) < 1e-3f) { + *pdf = M_1_PI_F * 0.25f; + } + else { + float cos_theta = dot(-I, omega_in); + *pdf = single_peaked_henyey_greenstein(cos_theta, g); + } return make_float3(*pdf, *pdf, *pdf); } @@ -63,10 +64,12 @@ ccl_device int volume_henyey_greenstein_sample(const ShaderClosure *sc, float3 I /* match pdf for small g */ if(fabsf(g) < 1e-3f) { cos_theta = (1.0f - 2.0f * randu); + *pdf = M_1_PI_F * 0.25f; } else { float k = (1.0f - g * g) / (1.0f - g + 2.0f * g * randu); cos_theta = (1.0f + g * g - k * k) / (2.0f * g); + *pdf = single_peaked_henyey_greenstein(cos_theta, g); } float sin_theta = safe_sqrtf(1.0f - cos_theta * cos_theta); @@ -80,7 +83,6 @@ ccl_device int volume_henyey_greenstein_sample(const ShaderClosure *sc, float3 I make_orthonormals(-I, &T, &B); *omega_in = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (-I); - *pdf = single_peaked_henyey_greenstein(cos_theta, g); *eval = make_float3(*pdf, *pdf, *pdf); /* perfect importance sampling */ #ifdef __RAY_DIFFERENTIALS__ diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index ed3f277e898..07ac7104e68 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -528,8 +528,7 @@ ccl_device void svm_node_closure_volume(KernelGlobals *kg, ShaderData *sd, float ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight * density); if(sc) { - float g = param2; - sc->data0 = g; + sc->data0 = param2; /* g */ sd->flag |= volume_henyey_greenstein_setup(sc); } break; |