Browse Source

improved picking alpha and fog shader code

Alexander Rose 4 years ago
parent
commit
1117ce05d5

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

@@ -1,9 +1,6 @@
 export default `
-float viewZ = uIsOrtho == 1.0
-    ? orthographicDepthToViewZ(fragmentDepth, uNear, uFar)
-    : perspectiveDepthToViewZ(fragmentDepth, uNear, uFar);
-float fogDepth = abs(viewZ);
-float fogFactor = smoothstep(uFogNear, uFogFar, fogDepth);
+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) {

+ 2 - 2
src/mol-gl/shader/chunks/check-picking-alpha.glsl.ts

@@ -1,6 +1,6 @@
 export default `
-float depth = length(vViewPosition);
-float fogFactor = smoothstep(uFogNear, uFogFar, depth);
+float viewZ = depthToViewZ(uIsOrtho, fragmentDepth, uNear, uFar);
+float fogFactor = smoothstep(uFogNear, uFogFar, abs(viewZ));
 float alpha = (1.0 - fogFactor) * uAlpha;
 if (uAlpha < uPickingAlphaThreshold || alpha < 0.1)
     discard; // ignore so the element below can be picked

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

@@ -10,7 +10,7 @@ export default `
         varying vec4 vOverpaint;
     #endif
 #elif defined(dRenderVariant_pick)
-    #if __VERSION__ != 300
+    #if __VERSION__ == 100
         varying vec4 vColor;
     #else
         flat in vec4 vColor;

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

@@ -12,7 +12,7 @@ export default `
     #endif
 
     #if defined(dColorType_vertex) || defined(dColorType_vertexInstance)
-        #if __VERSION__ != 300
+        #if __VERSION__ == 100
             attribute float aVertex;
         #else
             #define aVertex float(gl_VertexID)
@@ -25,7 +25,7 @@ export default `
         uniform sampler2D tOverpaint;
     #endif
 #elif defined(dRenderVariant_pick)
-    #if __VERSION__ != 300
+    #if __VERSION__ == 100
         varying vec4 vColor;
     #else
         flat out vec4 vColor;

+ 1 - 1
src/mol-gl/shader/chunks/common-clip.glsl.ts

@@ -63,7 +63,7 @@ export default `
         }
     }
 
-    #if __VERSION__ != 300
+    #if __VERSION__ == 100
         // 8-bit
         int bitwiseAnd(int a, int b) {
             int d = 128;

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

@@ -11,7 +11,7 @@ uniform int uGroupCount;
     uniform vec3 uClipObjectScale[dClipObjectCount];
 
     #if defined(dClipping)
-        #if __VERSION__ != 300
+        #if __VERSION__ == 100
             varying float vClipping;
         #else
             flat in float vClipping;
@@ -21,7 +21,7 @@ uniform int uGroupCount;
 
 uniform vec3 uHighlightColor;
 uniform vec3 uSelectColor;
-#if __VERSION__ != 300
+#if __VERSION__ == 100
     varying float vMarker;
 #else
     flat in float vMarker;

+ 2 - 2
src/mol-gl/shader/chunks/common-vert-params.glsl.ts

@@ -18,7 +18,7 @@ uniform vec4 uInvariantBoundingSphere;
     #if defined(dClipping)
         uniform vec2 uClippingTexDim;
         uniform sampler2D tClipping;
-        #if __VERSION__ != 300
+        #if __VERSION__ == 100
             varying float vClipping;
         #else
             flat out float vClipping;
@@ -28,7 +28,7 @@ uniform vec4 uInvariantBoundingSphere;
 
 uniform vec2 uMarkerTexDim;
 uniform sampler2D tMarker;
-#if __VERSION__ != 300
+#if __VERSION__ == 100
     varying float vMarker;
 #else
     flat out float vMarker;

+ 5 - 1
src/mol-gl/shader/chunks/common.glsl.ts

@@ -102,7 +102,11 @@ float orthographicDepthToViewZ(const in float linearClipZ, const in float near,
     return linearClipZ * (near - far) - near;
 }
 
-#if __VERSION__ != 300
+float depthToViewZ(const in float isOrtho, const in float linearClipZ, const in float near, const in float far) {
+    return isOrtho == 1.0 ? orthographicDepthToViewZ(linearClipZ, near, far) : perspectiveDepthToViewZ(linearClipZ, near, far);
+}
+
+#if __VERSION__ == 100
     // transpose
 
     float transpose(const in float m) {

+ 1 - 2
src/mol-gl/shader/cylinders.frag.ts

@@ -113,6 +113,7 @@ void main() {
     if (gl_FragDepthEXT < 0.0) discard;
     if (gl_FragDepthEXT > 1.0) discard;
 
+    float fragmentDepth = gl_FragDepthEXT;
     #include assign_material_color
 
     #if defined(dRenderVariant_pick)
@@ -131,8 +132,6 @@ void main() {
 
         #include apply_interior_color
         #include apply_marker_color
-
-        float fragmentDepth = gl_FragDepthEXT;
         #include apply_fog
         #include wboit_write
     #endif

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

@@ -14,6 +14,7 @@ precision highp int;
 
 #if dClipObjectCount != 0
     uniform int uClipObjectType[dClipObjectCount];
+    uniform bool uClipObjectInvert[dClipObjectCount];
     uniform vec3 uClipObjectPosition[dClipObjectCount];
     uniform vec4 uClipObjectRotation[dClipObjectCount];
     uniform vec3 uClipObjectScale[dClipObjectCount];
@@ -76,7 +77,7 @@ uniform vec3 uCellDim;
 uniform vec3 uCameraPosition;
 uniform mat4 uCartnToUnit;
 
-#if __VERSION__ == 300
+#if __VERSION__ != 100
     // for webgl1 this is given as a 'define'
     uniform int uMaxSteps;
 #endif

+ 7 - 3
src/mol-gl/shader/image.frag.ts

@@ -10,6 +10,7 @@ precision highp int;
 #include common
 #include read_from_texture
 #include common_frag_params
+#include common_clip
 #include wboit_params
 
 uniform vec2 uImageTexDim;
@@ -88,6 +89,8 @@ varying float vInstance;
 #endif
 
 void main() {
+    #include clip_pixel
+
     #if defined(dInterpolation_cubic)
         vec4 imageData = biCubic(tImageTex, vUv);
     #else
@@ -96,6 +99,9 @@ void main() {
     imageData.a = clamp(imageData.a, 0.0, 1.0);
     if (imageData.a > 0.9) imageData.a = 1.0;
 
+    float fragmentDepth = gl_FragCoord.z;
+    bool interior = false;
+
     #if defined(dRenderVariant_pick)
         if (imageData.a < 0.3)
             discard;
@@ -121,10 +127,8 @@ void main() {
 
         float group = decodeFloatRGB(texture2D(tGroupTex, vUv).rgb);
         float vMarker = readFromTexture(tMarker, vInstance * float(uGroupCount) + group, uMarkerTexDim).a;
-        #include apply_marker_color
 
-        float fragmentDepth = gl_FragCoord.z;
-        bool interior = false;
+        #include apply_marker_color
         #include apply_fog
         #include wboit_write
     #endif

+ 3 - 3
src/mol-gl/shader/lines.frag.ts

@@ -16,6 +16,9 @@ precision highp int;
 
 void main(){
     #include clip_pixel
+
+    bool interior = false;
+    float fragmentDepth = gl_FragCoord.z;
     #include assign_material_color
 
     #if defined(dRenderVariant_pick)
@@ -27,9 +30,6 @@ void main(){
         gl_FragColor = material;
 
         #include apply_marker_color
-
-        float fragmentDepth = gl_FragCoord.z;
-        bool interior = false;
         #include apply_fog
         #include wboit_write
     #endif

+ 1 - 2
src/mol-gl/shader/mesh.frag.ts

@@ -35,6 +35,7 @@ void main() {
         interior = !frontFacing;
     #endif
 
+    float fragmentDepth = gl_FragCoord.z;
     #include assign_material_color
 
     #if defined(dRenderVariant_pick)
@@ -59,8 +60,6 @@ void main() {
 
         #include apply_interior_color
         #include apply_marker_color
-
-        float fragmentDepth = gl_FragCoord.z;
         #include apply_fog
         #include wboit_write
     #endif

+ 3 - 3
src/mol-gl/shader/points.frag.ts

@@ -23,6 +23,9 @@ const float radius = 0.5;
 
 void main(){
     #include clip_pixel
+
+    float fragmentDepth = gl_FragCoord.z;
+    bool interior = false;
     #include assign_material_color
 
     #if defined(dRenderVariant_pick)
@@ -41,9 +44,6 @@ void main(){
         #endif
 
         #include apply_marker_color
-
-        float fragmentDepth = gl_FragCoord.z;
-        bool interior = false;
         #include apply_fog
         #include wboit_write
     #endif

+ 1 - 2
src/mol-gl/shader/spheres.frag.ts

@@ -78,6 +78,7 @@ void main(void){
     if (gl_FragDepthEXT < 0.0) discard;
     if (gl_FragDepthEXT > 1.0) discard;
 
+    float fragmentDepth = gl_FragDepthEXT;
     #include assign_material_color
 
     #if defined(dRenderVariant_pick)
@@ -95,8 +96,6 @@ void main(void){
 
         #include apply_interior_color
         #include apply_marker_color
-
-        float fragmentDepth = gl_FragDepthEXT;
         #include apply_fog
         #include wboit_write
     #endif

+ 3 - 3
src/mol-gl/shader/text.frag.ts

@@ -32,6 +32,9 @@ void main2(){
 
 void main(){
     #include clip_pixel
+
+    float fragmentDepth = gl_FragCoord.z;
+    bool interior = false;
     #include assign_material_color
 
     if (vTexCoord.x > 1.0) {
@@ -65,9 +68,6 @@ void main(){
         gl_FragColor = material;
     #elif defined(dRenderVariant_color)
         #include apply_marker_color
-
-        float fragmentDepth = gl_FragCoord.z;
-        bool interior = false;
         #include apply_fog
         #include wboit_write
     #endif