Browse Source

wip, transparency

Alexander Rose 6 years ago
parent
commit
581c6bbfc7

+ 2 - 2
src/mol-gl/renderer.ts

@@ -177,7 +177,7 @@ namespace Renderer {
                 gl.depthMask(true)
                 for (let i = 0, il = renderables.length; i < il; ++i) {
                     const r = renderables[i]
-                    if (r.state.opaque && !r.values.dTransparency.ref.value) renderObject(r, variant)
+                    if (r.state.opaque) renderObject(r, variant)
                 }
 
                 gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
@@ -185,7 +185,7 @@ namespace Renderer {
                 for (let i = 0, il = renderables.length; i < il; ++i) {
                     const r = renderables[i]
                     gl.depthMask(r.values.uAlpha.ref.value === 1.0)
-                    if (!r.state.opaque || r.values.dTransparency.ref.value) renderObject(r, variant)
+                    if (!r.state.opaque) renderObject(r, variant)
                 }
             } else {
                 // picking

+ 1 - 0
src/mol-gl/shader/chunks/assign-color-varying.glsl

@@ -19,5 +19,6 @@
 #endif
 
 #ifdef dTransparency
+    vGroup = aGroup;
     vTransparency = readFromTexture(tTransparency, aInstance * float(uGroupCount) + aGroup, uTransparencyTexDim).a;
 #endif

+ 25 - 23
src/mol-gl/shader/chunks/assign-material-color.glsl

@@ -24,29 +24,31 @@
     // );
     // float at = thresholdMatrix[pixelCoord.x % 4][pixelCoord.y % 4];
 
-    // https://research.nvidia.com/publication/hashed-alpha-testing
-    // Find the discretized derivatives of our coordinates
-    float maxDeriv = max(length(dFdx(vViewPosition)), length(dFdy(vViewPosition)));
-    float pixScale = 1.0 / maxDeriv;
-    // Find two nearest log-discretized noise scales
-    vec2 pixScales = vec2(exp2(floor(log2(pixScale))), exp2(ceil(log2(pixScale))));
-    // Compute alpha thresholds at our two noise scales
-    vec2 alpha = vec2(hash3d(floor(pixScales.x * vViewPosition)), hash3d(floor(pixScales.y * vViewPosition)));
-    // Factor to interpolate lerp with
-    float lerpFactor = fract(log2(pixScale));
-    // Interpolate alpha threshold from noise at two scales
-    float x = (1.0 - lerpFactor) * alpha.x + lerpFactor * alpha.y;
-    // Pass into CDF to compute uniformly distrib threshold
-    float a = min(lerpFactor, 1.0 - lerpFactor);
-    vec3 cases = vec3(
-        x * x / (2.0 * a * (1.0 - a)),
-        (x - 0.5 * a) / (1.0 - a),
-        1.0 - ((1.0 - x) * (1.0 - x) / (2.0 * a * (1.0 - a)))
-    );
-    // Find our final, uniformly distributed alpha threshold
-    float at = (x < (1.0 - a)) ? ((x < a) ? cases.x : cases.y) : cases.z;
-    // Avoids ατ == 0. Could also do
-    at = clamp(at, 1.0e-6, 1.0);
+    // // https://research.nvidia.com/publication/hashed-alpha-testing
+    // // Find the discretized derivatives of our coordinates
+    // float maxDeriv = max(length(dFdx(vViewPosition)), length(dFdy(vViewPosition)));
+    // float pixScale = 1.0 / maxDeriv;
+    // // Find two nearest log-discretized noise scales
+    // vec2 pixScales = vec2(exp2(floor(log2(pixScale))), exp2(ceil(log2(pixScale))));
+    // // Compute alpha thresholds at our two noise scales
+    // vec2 alpha = vec2(hash3d(floor(pixScales.x * vViewPosition)), hash3d(floor(pixScales.y * vViewPosition)));
+    // // Factor to interpolate lerp with
+    // float lerpFactor = fract(log2(pixScale));
+    // // Interpolate alpha threshold from noise at two scales
+    // float x = (1.0 - lerpFactor) * alpha.x + lerpFactor * alpha.y;
+    // // Pass into CDF to compute uniformly distrib threshold
+    // float a = min(lerpFactor, 1.0 - lerpFactor);
+    // vec3 cases = vec3(
+    //     x * x / (2.0 * a * (1.0 - a)),
+    //     (x - 0.5 * a) / (1.0 - a),
+    //     1.0 - ((1.0 - x) * (1.0 - x) / (2.0 * a * (1.0 - a)))
+    // );
+    // // Find our final, uniformly distributed alpha threshold
+    // float at = (x < (1.0 - a)) ? ((x < a) ? cases.x : cases.y) : cases.z;
+    // // Avoids ατ == 0. Could also do
+    // at = clamp(at, 1.0e-6, 1.0);
+
+    float at = fract(dot(vec3(gl_FragCoord.xy, vGroup + 0.5), vec3(2.0, 7.0, 23.0) / 17.0f));
 
     if (ma < 0.99 && (ma < 0.01 || ma < at)) discard;
 #endif

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

@@ -15,5 +15,6 @@
 #endif
 
 #ifdef dTransparency
+    varying float vGroup;
     varying float vTransparency;
 #endif

+ 1 - 0
src/mol-gl/shader/chunks/color-vert-params.glsl

@@ -23,6 +23,7 @@
 #endif
 
 #ifdef dTransparency
+    varying float vGroup;
     varying float vTransparency;
     uniform vec2 uTransparencyTexDim;
     uniform sampler2D tTransparency;