Fix T77069 EEVEE: Mix shader with holdout & transparent BSDF fails
authorClément Foucault <foucault.clem@gmail.com>
Tue, 30 Jun 2020 19:12:32 +0000 (21:12 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Tue, 30 Jun 2020 19:12:44 +0000 (21:12 +0200)
This follows Cycles closer.

source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl

index 402d306df451731d4931a030f9c1561e72405197..393ecaf1fc5db59b2e3a833cc7b6d41e6bf84aba 100644 (file)
@@ -877,6 +877,14 @@ Closure closure_mix(Closure cl1, Closure cl2, float fac)
 {
   Closure cl;
   cl.holdout = mix(cl1.holdout, cl2.holdout, fac);
+
+  if (FLAG_TEST(cl1.flag, CLOSURE_HOLDOUT_FLAG)) {
+    fac = 1.0;
+  }
+  else if (FLAG_TEST(cl2.flag, CLOSURE_HOLDOUT_FLAG)) {
+    fac = 0.0;
+  }
+
   cl.transmittance = mix(cl1.transmittance, cl2.transmittance, fac);
   cl.radiance = mix(cl1.radiance, cl2.radiance, fac);
   cl.flag = cl1.flag | cl2.flag;
@@ -958,7 +966,7 @@ void main()
 {
   Closure cl = nodetree_exec();
 
-  float holdout = 1.0 - saturate(cl.holdout);
+  float holdout = saturate(1.0 - cl.holdout);
   float transmit = saturate(avg(cl.transmittance));
   float alpha = 1.0 - transmit;
 
@@ -972,8 +980,9 @@ void main()
    * Since we do that using the blending pipeline we need to account for material transmittance. */
   vol_scatter -= vol_scatter * cl.transmittance;
 
-  outRadiance = vec4(cl.radiance * vol_transmit + vol_scatter, alpha * holdout);
-  outTransmittance = vec4(cl.transmittance, transmit * holdout);
+  cl.radiance = cl.radiance * holdout * vol_transmit + vol_scatter;
+  outRadiance = vec4(cl.radiance, alpha * holdout);
+  outTransmittance = vec4(cl.transmittance, transmit) * holdout;
 #    else
   outRadiance = vec4(cl.radiance, holdout);
   ssrNormals = cl.ssr_normal;