Cycles: option to make background visible through glass transparent.
[blender-staging.git] / intern / cycles / kernel / closure / bsdf.h
index 0a3f9ff23fe2c71bf135f7921a787bdbced9476f..6f0bdb3fa38214338c8d330b3dfed419bc26c379 100644 (file)
 
 CCL_NAMESPACE_BEGIN
 
+/* Returns the square of the roughness of the closure if it has roughness,
+ * 0 for singular closures and 1 otherwise. */
+ccl_device_inline float bsdf_get_roughness_squared(const ShaderClosure *sc)
+{
+       if(CLOSURE_IS_BSDF_SINGULAR(sc->type)) {
+               return 0.0f;
+       }
+
+       if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
+               MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc;
+               return bsdf->alpha_x*bsdf->alpha_y;
+       }
+
+       return 1.0f;
+}
+
 ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
                                        ShaderData *sd,
                                        const ShaderClosure *sc,
@@ -157,6 +173,17 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
                        break;
        }
 
+       /* Test if BSDF sample should be treated as transparent for background. */
+       if(label & LABEL_TRANSMIT) {
+               float threshold_squared = kernel_data.background.transparent_roughness_squared_threshold;
+
+               if(threshold_squared >= 0.0f) {
+                       if(bsdf_get_roughness_squared(sc) <= threshold_squared) {
+                               label |= LABEL_TRANSMIT_TRANSPARENT;
+                       }
+               }
+       }
+
        return label;
 }
 
@@ -438,23 +465,5 @@ ccl_device bool bsdf_merge(ShaderClosure *a, ShaderClosure *b)
 #endif
 }
 
-/* Classifies a closure as diffuse-like or specular-like.
- * This is needed for the denoising feature pass generation,
- * which are written on the first bounce where more than 25%
- * of the sampling weight belongs to diffuse-line closures. */
-ccl_device_inline bool bsdf_is_specular_like(ShaderClosure *sc)
-{
-       if(CLOSURE_IS_BSDF_TRANSPARENT(sc->type)) {
-               return true;
-       }
-
-       if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
-               MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc;
-               return (bsdf->alpha_x*bsdf->alpha_y <= 0.075f*0.075f);
-       }
-
-       return false;
-}
-
 CCL_NAMESPACE_END