Removed reflection call when roughness is low because of artifacts.

This commit is contained in:
2016-12-02 13:55:12 +01:00
parent 732db8a57f
commit f80dcb4f34

View File

@@ -263,32 +263,32 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
if(specular_weight > CLOSURE_WEIGHT_CUTOFF && (specular > CLOSURE_WEIGHT_CUTOFF || metallic > CLOSURE_WEIGHT_CUTOFF)) {
float3 spec_weight = weight * specular_weight;
/* for roughness values close to 0 handle as a sharp reflection */
if(roughness <= 1e-2f) {
float spec_to_ior = (2.0f / (1.0f - safe_sqrtf(0.08f * specular))) - 1.0f;
///* for roughness values close to 0 handle as a sharp reflection */
//if(roughness <= 1e-2f) {
// float spec_to_ior = (2.0f / (1.0f - safe_sqrtf(0.08f * specular))) - 1.0f;
float m_cdlum = linear_rgb_to_gray(base_color);
float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : make_float3(0.0f, 0.0f, 0.0f); // normalize lum. to isolate hue+sat
float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - specular_tint) + m_ctint * specular_tint;
float3 cspec0 = (specular * 0.08f * tmp_col) * (1.0f - metallic) + base_color * metallic;
// float m_cdlum = linear_rgb_to_gray(base_color);
// float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : make_float3(0.0f, 0.0f, 0.0f); // normalize lum. to isolate hue+sat
// float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - specular_tint) + m_ctint * specular_tint;
// float3 cspec0 = (specular * 0.08f * tmp_col) * (1.0f - metallic) + base_color * metallic;
float F0 = fresnel_dielectric_cos(1.0f, spec_to_ior);
float F0_norm = 1.0f / (1.0f - F0);
float FH = (fresnel_dielectric_cos(cosNO, spec_to_ior) - F0) * F0_norm;
// float F0 = fresnel_dielectric_cos(1.0f, spec_to_ior);
// float F0_norm = 1.0f / (1.0f - F0);
// float FH = (fresnel_dielectric_cos(cosNO, spec_to_ior) - F0) * F0_norm;
/* Blend between white and a specular color with respect to the fresnel */
float3 refl_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
// /* Blend between white and a specular color with respect to the fresnel */
// float3 refl_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), spec_weight*refl_color);
// MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), spec_weight*refl_color);
if(bsdf) {
bsdf->N = N;
// if(bsdf) {
// bsdf->N = N;
/* setup bsdf */
ccl_fetch(sd, flag) |= bsdf_reflection_setup(bsdf);
}
}
else {
// /* setup bsdf */
// ccl_fetch(sd, flag) |= bsdf_reflection_setup(bsdf);
// }
//}
//else {
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), spec_weight);
MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
@@ -317,7 +317,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
else /* use multi-scatter GGX */
ccl_fetch(sd, flag) |= bsdf_microfacet_multi_ggx_aniso_fresnel_setup(bsdf);
}
}
//}
}
#ifdef __CAUSTICS_TRICKS__
}
@@ -340,24 +340,24 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
#endif
{
/* for roughness values close to 0 handle as a sharp reflection */
if(roughness <= 1e-2f) {
float F0 = fresnel_dielectric_cos(1.0f, ior);
float F0_norm = 1.0f / (1.0f - F0);
float FH = (fresnel - F0) * F0_norm;
//if(roughness <= 1e-2f) {
// float F0 = fresnel_dielectric_cos(1.0f, ior);
// float F0_norm = 1.0f / (1.0f - F0);
// float FH = (fresnel - F0) * F0_norm;
/* Blend between white and a specular color with respect to the fresnel */
float3 refl_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
// /* Blend between white and a specular color with respect to the fresnel */
// float3 refl_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), refl_color*glass_weight*fresnel);
// MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), refl_color*glass_weight*fresnel);
if(bsdf) {
bsdf->N = N;
// if(bsdf) {
// bsdf->N = N;
/* setup bsdf */
ccl_fetch(sd, flag) |= bsdf_reflection_setup(bsdf);
}
}
else {
// /* setup bsdf */
// ccl_fetch(sd, flag) |= bsdf_reflection_setup(bsdf);
// }
//}
//else {
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), glass_weight*fresnel);
MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
@@ -375,7 +375,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
/* setup bsdf */
ccl_fetch(sd, flag) |= bsdf_microfacet_ggx_fresnel_setup(bsdf);
}
}
//}
}
/* refraction */