Fresnel in the microfacet multiscatter implementation improved
This commit is contained in:
@@ -88,7 +88,7 @@ ccl_device_inline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
|
|||||||
float3 throughput2 = make_float3(1.0f, 1.0f, 1.0f);
|
float3 throughput2 = make_float3(1.0f, 1.0f, 1.0f);
|
||||||
float F0 = fresnel_dielectric_cos(1.0f, eta);
|
float F0 = fresnel_dielectric_cos(1.0f, eta);
|
||||||
float F0_norm = 1.0f / (1.0f - F0);
|
float F0_norm = 1.0f / (1.0f - F0);
|
||||||
if (use_fresnel && initial_outside) {
|
if (use_fresnel/* && initial_outside*/) {
|
||||||
float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wo)), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi, normalize(wi + wo))); //
|
float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wo)), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi, normalize(wi + wo))); //
|
||||||
throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
||||||
|
|
||||||
@@ -167,7 +167,7 @@ ccl_device_inline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
|
|||||||
else
|
else
|
||||||
phase = mf_eval_phase_glass(wr, lambda_r, -wo, !wo_outside, alpha, 1.0f/eta);
|
phase = mf_eval_phase_glass(wr, lambda_r, -wo, !wo_outside, alpha, 1.0f/eta);
|
||||||
|
|
||||||
if (use_fresnel && initial_outside)
|
if (use_fresnel/* && initial_outside*/)
|
||||||
eval2 += throughput2 * phase * mf_G1(wo_outside ? wo : -wo, mf_C1((outside == wo_outside) ? hr : -hr), shadowing_lambda);
|
eval2 += throughput2 * phase * mf_G1(wo_outside ? wo : -wo, mf_C1((outside == wo_outside) ? hr : -hr), shadowing_lambda);
|
||||||
#elif defined(MF_MULTI_DIFFUSE)
|
#elif defined(MF_MULTI_DIFFUSE)
|
||||||
phase = mf_eval_phase_diffuse(wo, wm);
|
phase = mf_eval_phase_diffuse(wo, wm);
|
||||||
@@ -191,16 +191,16 @@ ccl_device_inline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
|
|||||||
hr = -hr;
|
hr = -hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_fresnel && initial_outside && outside && next_outside) {
|
if (use_fresnel && !next_outside) {
|
||||||
|
throughput2 *= color;
|
||||||
|
}
|
||||||
|
else if (use_fresnel/* && initial_outside && outside && next_outside*/) {
|
||||||
float FH = (fresnel_dielectric_cos(dot(wi_prev, wm), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi_prev, wm)); //
|
float FH = (fresnel_dielectric_cos(dot(wi_prev, wm), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi_prev, wm)); //
|
||||||
t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
||||||
|
|
||||||
if (order > 0)
|
if (order > 0)
|
||||||
throughput2 *= t_color;
|
throughput2 *= t_color;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
throughput2 *= color;
|
|
||||||
}
|
|
||||||
#elif defined(MF_MULTI_DIFFUSE)
|
#elif defined(MF_MULTI_DIFFUSE)
|
||||||
wr = mf_sample_phase_diffuse(wm,
|
wr = mf_sample_phase_diffuse(wm,
|
||||||
lcg_step_float_addrspace(lcg_state),
|
lcg_step_float_addrspace(lcg_state),
|
||||||
@@ -274,7 +274,7 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
|
|||||||
float3 throughput2 = make_float3(1.0f, 1.0f, 1.0f);
|
float3 throughput2 = make_float3(1.0f, 1.0f, 1.0f);
|
||||||
float F0 = fresnel_dielectric_cos(1.0f, eta);
|
float F0 = fresnel_dielectric_cos(1.0f, eta);
|
||||||
float F0_norm = 1.0f / (1.0f - F0);
|
float F0_norm = 1.0f / (1.0f - F0);
|
||||||
if (use_fresnel && initial_outside) {
|
if (use_fresnel/* && initial_outside*/) {
|
||||||
float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wr)), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi, normalize(wi + wr))); //
|
float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wr)), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi, normalize(wi + wr))); //
|
||||||
throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
||||||
}
|
}
|
||||||
@@ -295,7 +295,7 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
|
|||||||
if(!mf_sample_height(wr, &hr, &C1_r, &G1_r, &lambda_r, lcg_step_float_addrspace(lcg_state))) {
|
if(!mf_sample_height(wr, &hr, &C1_r, &G1_r, &lambda_r, lcg_step_float_addrspace(lcg_state))) {
|
||||||
/* The random walk has left the surface. */
|
/* The random walk has left the surface. */
|
||||||
#ifdef MF_MULTI_GLASS
|
#ifdef MF_MULTI_GLASS
|
||||||
if ((only_refractions && outside && initial_outside) || (only_reflections && !outside)) {
|
if ((only_refractions && outside/* && initial_outside*/) || (only_reflections && !outside)) {
|
||||||
*wo = make_float3(0.0f, 0.0f, 1.0f);
|
*wo = make_float3(0.0f, 0.0f, 1.0f);
|
||||||
return make_float3(0.0f, 0.0f, 0.0f);
|
return make_float3(0.0f, 0.0f, 0.0f);
|
||||||
}
|
}
|
||||||
@@ -327,7 +327,10 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (use_fresnel) {
|
if (use_fresnel) {
|
||||||
if (initial_outside && outside && next_outside) {
|
if (!next_outside) {
|
||||||
|
throughput2 *= color;
|
||||||
|
}
|
||||||
|
else if (/*initial_outside && outside && next_outside*/true) {
|
||||||
float FH = (fresnel_dielectric_cos(dot(wi_prev, wm), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi_prev, wm)); //
|
float FH = (fresnel_dielectric_cos(dot(wi_prev, wm), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi_prev, wm)); //
|
||||||
t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
|
||||||
|
|
||||||
@@ -336,9 +339,6 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
|
|||||||
else
|
else
|
||||||
throughput2 *= t_color;
|
throughput2 *= t_color;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
throughput2 *= color;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#elif defined(MF_MULTI_DIFFUSE)
|
#elif defined(MF_MULTI_DIFFUSE)
|
||||||
wr = mf_sample_phase_diffuse(wm,
|
wr = mf_sample_phase_diffuse(wm,
|
||||||
|
|||||||
Reference in New Issue
Block a user