Kaynağa Gözat

properly switch-off fog

Alexander Rose 1 yıl önce
ebeveyn
işleme
320ab77f8e

+ 1 - 0
CHANGELOG.md

@@ -7,6 +7,7 @@ Note that since we don't clearly distinguish between a public and private interf
 ## [Unreleased]
 
 - Fix display issue with SIFTS mapping
+- Properly switch-off fog
 
 ## [v3.37.1] - 2023-06-20
 

+ 1 - 0
src/mol-gl/renderable/schema.ts

@@ -136,6 +136,7 @@ export const GlobalUniformSchema = {
     uCameraDir: UniformSpec('v3'),
     uNear: UniformSpec('f'),
     uFar: UniformSpec('f'),
+    uFog: UniformSpec('b'),
     uFogNear: UniformSpec('f'),
     uFogFar: UniformSpec('f'),
     uFogColor: UniformSpec('v3'),

+ 1 - 0
src/mol-gl/renderer.ts

@@ -213,6 +213,7 @@ namespace Renderer {
             uCameraDir: ValueCell.create(cameraDir),
             uNear: ValueCell.create(1),
             uFar: ValueCell.create(10000),
+            uFog: ValueCell.create(true),
             uFogNear: ValueCell.create(1),
             uFogFar: ValueCell.create(10000),
             uFogColor: ValueCell.create(bgColor),

+ 22 - 20
src/mol-gl/shader/chunks/apply-fog.glsl.ts

@@ -1,30 +1,32 @@
 export const apply_fog = `
-float viewZ = depthToViewZ(uIsOrtho, fragmentDepth, uNear, uFar);
-float fogFactor = smoothstep(uFogNear, uFogFar, abs(viewZ));
-float fogAlpha = (1.0 - fogFactor) * gl_FragColor.a;
 float preFogAlpha = gl_FragColor.a;
-if (!uTransparentBackground) {
-    if (gl_FragColor.a < 1.0) {
-        // transparent objects are blended with background color
-        gl_FragColor.a = fogAlpha;
-    } else {
-        // mix opaque objects with background color
-        gl_FragColor.rgb = mix(gl_FragColor.rgb, uFogColor, fogFactor);
-    }
-} else {
-    #if defined(dRenderVariant_colorDpoit)
+if (uFog) {
+    float viewZ = depthToViewZ(uIsOrtho, fragmentDepth, uNear, uFar);
+    float fogFactor = smoothstep(uFogNear, uFogFar, abs(viewZ));
+    float fogAlpha = (1.0 - fogFactor) * gl_FragColor.a;
+    if (!uTransparentBackground) {
         if (gl_FragColor.a < 1.0) {
             // transparent objects are blended with background color
             gl_FragColor.a = fogAlpha;
         } else {
-            // opaque objects need to be pre-multiplied alpha
+            // mix opaque objects with background color
+            gl_FragColor.rgb = mix(gl_FragColor.rgb, uFogColor, fogFactor);
+        }
+    } else {
+        #if defined(dRenderVariant_colorDpoit)
+            if (gl_FragColor.a < 1.0) {
+                // transparent objects are blended with background color
+                gl_FragColor.a = fogAlpha;
+            } else {
+                // opaque objects need to be pre-multiplied alpha
+                gl_FragColor.rgb *= fogAlpha;
+                gl_FragColor.a = fogAlpha;
+            }
+        #else
+            // pre-multiplied alpha expected for transparent background
             gl_FragColor.rgb *= fogAlpha;
             gl_FragColor.a = fogAlpha;
-        }
-    #else
-        // pre-multiplied alpha expected for transparent background
-        gl_FragColor.rgb *= fogAlpha;
-        gl_FragColor.a = fogAlpha;
-    #endif
+        #endif
+    }
 }
 `;

+ 1 - 0
src/mol-gl/shader/chunks/common-frag-params.glsl.ts

@@ -57,6 +57,7 @@ uniform float uNear;
 uniform float uFar;
 uniform float uIsOrtho;
 
+uniform bool uFog;
 uniform float uFogNear;
 uniform float uFogFar;
 uniform vec3 uFogColor;

+ 1 - 0
src/mol-gl/shader/direct-volume.frag.ts

@@ -68,6 +68,7 @@ uniform int uGroupCount;
 uniform float uMetalness;
 uniform float uRoughness;
 
+uniform bool uFog;
 uniform float uFogNear;
 uniform float uFogFar;
 uniform vec3 uFogColor;