Browse Source

fog patch by arose

AronKovacs 4 years ago
parent
commit
e672503fda

+ 5 - 8
src/mol-gl/renderer.ts

@@ -468,15 +468,10 @@ namespace Renderer {
         const renderWboitTransparent = (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => {
             updateInternal(group, camera, depthTexture, true);
 
-            // arrayMapUpsert(sharedTexturesList, 'tDepth', depthTexture || nullDepthTexture);
-            // wboit.bind();
-            // ValueCell.updateIfChanged(globalUniforms.uRenderWboit, 1);
-            // globalUniformsNeedUpdate = true;
-
             const { renderables } = group;
             for (let i = 0, il = renderables.length; i < il; ++i) {
                 const r = renderables[i];
-                if (camera.fogNear < camera.fogFar || r.values.uAlpha.ref.value < 1 || r.values.transparencyAverage.ref.value > 0 || r.values?.dRenderMode?.ref.value === 'volume') {
+                if (r.values.uAlpha.ref.value < 1 || r.values.transparencyAverage.ref.value > 0 || r.values?.dRenderMode?.ref.value === 'volume') {
                     renderObject(r, 'colorWboit');
                 }
             }
@@ -489,8 +484,10 @@ namespace Renderer {
                 state.colorMask(true, true, true, true);
                 state.depthMask(true);
 
-                if (toBackgroundColor) {
-                    state.clearColor(bgColor[0], bgColor[1], bgColor[2], transparentBackground ? 0 : 1);
+                if (transparentBackground) {
+                    state.clearColor(1, 1, 1, 0);
+                } else if (toBackgroundColor) {
+                    state.clearColor(bgColor[0], bgColor[1], bgColor[2], 1);
                 } else {
                     state.clearColor(1, 1, 1, 1);
                 }

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

@@ -2,12 +2,12 @@ export default `
 float fogDepth = length(vViewPosition);
 float fogFactor = smoothstep(uFogNear, uFogFar, fogDepth);
 float fogAlpha = (1.0 - fogFactor) * gl_FragColor.a;
+float preFogAlpha = gl_FragColor.a < 1.0 ? fogAlpha : 1.0;
 if (!uTransparentBackground) {
     gl_FragColor.rgb = mix(gl_FragColor.rgb, uFogColor, fogFactor);
     if (gl_FragColor.a < 1.0)
         gl_FragColor.a = fogAlpha;
 } else {
-    float fogAlpha = (1.0 - fogFactor) * gl_FragColor.a;
     gl_FragColor.a = fogAlpha;
 }
 `;

+ 3 - 3
src/mol-gl/shader/chunks/wboit-write.glsl.ts

@@ -1,12 +1,12 @@
 export default `
 #if defined(dRenderVariant_colorWboit)
     if (uRenderWboit == 0) {
-        if (gl_FragColor.a < 1.0) {
+        if (preFogAlpha < 1.0) {
             discard;
         }
     } else if (uRenderWboit == 1) {
-        if (gl_FragColor.a != 1.0 && !interior && fragmentDepth < getDepth(gl_FragCoord.xy / uDrawingBufferSize)) {
-            float alpha = gl_FragColor.a;
+        if (preFogAlpha != 1.0 && !interior && fragmentDepth < getDepth(gl_FragCoord.xy / uDrawingBufferSize)) {
+            float alpha = preFogAlpha;
             float wboitWeight = alpha * clamp(pow(1.0 - fragmentDepth, 2.0), 0.01, 1.0);
             gl_FragColor = vec4(gl_FragColor.rgb * alpha * wboitWeight, alpha);
             gl_FragData[1] = vec4(alpha * wboitWeight);

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

@@ -146,6 +146,8 @@ vec3 v3m4(vec3 p, mat4 m) {
     return (m * vec4(p, 1.0)).xyz;
 }
 
+float preFogAlphaBlended = 0.0;
+
 vec4 raymarch(vec3 startLoc, vec3 step, vec3 rayDir) {
     #if defined(dRenderVariant_color) && !defined(dIgnoreLight)
         mat3 normalMatrix = transpose3(inverse3(mat3(uModelView * vTransform)));
@@ -322,6 +324,8 @@ vec4 raymarch(vec3 startLoc, vec3 step, vec3 rayDir) {
                     float vMarker = readFromTexture(tMarker, vInstance * float(uGroupCount) + group, uMarkerTexDim).a;
                     #include apply_interior_color
                     #include apply_marker_color
+
+                    preFogAlphaBlended = (1.0 - preFogAlphaBlended) * gl_FragColor.a + preFogAlphaBlended;
                     #include apply_fog
 
                     src = gl_FragColor;
@@ -383,6 +387,8 @@ vec4 raymarch(vec3 startLoc, vec3 step, vec3 rayDir) {
 
                 float vMarker = readFromTexture(tMarker, vInstance * float(uGroupCount) + group, uMarkerTexDim).a;
                 #include apply_marker_color
+
+                preFogAlphaBlended = (1.0 - preFogAlphaBlended) * gl_FragColor.a + preFogAlphaBlended;
                 #include apply_fog
 
                 src = gl_FragColor;
@@ -444,6 +450,7 @@ void main () {
         #else
             float fragmentDepth = calcDepth((uView * vec4(uCameraPosition + (d * rayDir), 1.0)).xyz);
         #endif
+        float preFogAlpha = clamp(preFogAlphaBlended, 0.0, 1.0);
         interior = false;
         #include wboit_write
     #endif