Browse Source

support picking threshold with screendoor transparency

Alexander Rose 4 years ago
parent
commit
17a0a2be6f

+ 5 - 5
src/mol-gl/shader/chunks/assign-color-varying.glsl.ts

@@ -13,11 +13,6 @@ export default `
     #ifdef dOverpaint
         vOverpaint = readFromTexture(tOverpaint, aInstance * float(uGroupCount) + group, uOverpaintTexDim);
     #endif
-
-    #ifdef dTransparency
-        vGroup = group;
-        vTransparency = readFromTexture(tTransparency, aInstance * float(uGroupCount) + group, uTransparencyTexDim).a;
-    #endif
 #elif defined(dRenderVariant_pick)
     #if defined(dRenderVariant_pickObject)
         vColor = vec4(encodeFloatRGB(float(uObjectId)), 1.0);
@@ -27,4 +22,9 @@ export default `
         vColor = vec4(encodeFloatRGB(group), 1.0);
     #endif
 #endif
+
+#ifdef dTransparency
+    vGroup = group;
+    vTransparency = readFromTexture(tTransparency, aInstance * float(uGroupCount) + group, uTransparencyTexDim).a;
+#endif
 `;

+ 19 - 12
src/mol-gl/shader/chunks/assign-material-color.glsl.ts

@@ -10,10 +10,24 @@ export default `
     #if defined(dOverpaint)
         material.rgb = mix(material.rgb, vOverpaint.rgb, vOverpaint.a);
     #endif
+#elif defined(dRenderVariant_pick)
+    vec4 material = vColor;
+#elif defined(dRenderVariant_depth)
+    #ifdef enabledFragDepth
+        vec4 material = packDepthToRGBA(gl_FragDepthEXT);
+    #else
+        vec4 material = packDepthToRGBA(gl_FragCoord.z);
+    #endif
+#endif
+
+// apply screendoor transparency
+#if defined(dTransparency)
+    float ta = 1.0 - vTransparency;
 
-    // apply screendoor transparency
-    #if defined(dTransparency)
-        float ta = 1.0 - vTransparency;
+    #if defined(dRenderVariant_pick)
+        if (ta < uPickingAlphaThreshold)
+            discard; // ignore so the element below can be picked
+    #else
         float at = 0.0;
 
         // shift by view-offset during multi-sample rendering to allow for blending
@@ -31,15 +45,8 @@ export default `
             at = fract(dot(vec3(coord, vGroup + 0.5), vec3(2.0, 7.0, 23.0) / 17.0f));
         #endif
 
-        if (ta < 0.99 && (ta < 0.01 || ta < at)) discard;
-    #endif
-#elif defined(dRenderVariant_pick)
-    vec4 material = vColor;
-#elif defined(dRenderVariant_depth)
-    #ifdef enabledFragDepth
-        vec4 material = packDepthToRGBA(gl_FragDepthEXT);
-    #else
-        vec4 material = packDepthToRGBA(gl_FragCoord.z);
+        if (ta < 0.99 && (ta < 0.01 || ta < at))
+            discard;
     #endif
 #endif
 `;

+ 5 - 5
src/mol-gl/shader/chunks/color-frag-params.glsl.ts

@@ -9,11 +9,6 @@ export default `
     #ifdef dOverpaint
         varying vec4 vOverpaint;
     #endif
-
-    #ifdef dTransparency
-        varying float vGroup;
-        varying float vTransparency;
-    #endif
 #elif defined(dRenderVariant_pick)
     #if __VERSION__ != 300
         varying vec4 vColor;
@@ -21,4 +16,9 @@ export default `
         flat in vec4 vColor;
     #endif
 #endif
+
+#ifdef dTransparency
+    varying float vGroup;
+    varying float vTransparency;
+#endif
 `;

+ 7 - 7
src/mol-gl/shader/chunks/color-vert-params.glsl.ts

@@ -16,13 +16,6 @@ export default `
         uniform vec2 uOverpaintTexDim;
         uniform sampler2D tOverpaint;
     #endif
-
-    #ifdef dTransparency
-        varying float vGroup;
-        varying float vTransparency;
-        uniform vec2 uTransparencyTexDim;
-        uniform sampler2D tTransparency;
-    #endif
 #elif defined(dRenderVariant_pick)
     #if __VERSION__ != 300
         varying vec4 vColor;
@@ -30,4 +23,11 @@ export default `
         flat out vec4 vColor;
     #endif
 #endif
+
+#ifdef dTransparency
+    varying float vGroup;
+    varying float vTransparency;
+    uniform vec2 uTransparencyTexDim;
+    uniform sampler2D tTransparency;
+#endif
 `;