浏览代码

combine markingDepth/markingMask shader variants

Alexander Rose 3 年之前
父节点
当前提交
6f13b67bf1

+ 1 - 0
CHANGELOG.md

@@ -12,6 +12,7 @@ Note that since we don't clearly distinguish between a public and private interf
     - Remove dMarkerType shader define (use uMarker as needed)
     - Support to ignore defines depending on the shader variant
     - Combine pickObject/pickInstance/pickGroup shader variants into one
+    - Combine markingDepth/markingMask shader variants into one
     - Correctly set shader define flags for overpaint, transparency, substance, clipping
 
 ## [v3.0.0-dev.6] - 2021-12-19

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

@@ -161,6 +161,7 @@ export const GlobalUniformSchema = {
 
     uRenderWboit: UniformSpec('b'),
     uMarkingDepthTest: UniformSpec('b'),
+    uMarkingType: UniformSpec('i'),
     uPickType: UniformSpec('i'),
 } as const;
 export type GlobalUniformSchema = typeof GlobalUniformSchema

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

@@ -45,6 +45,12 @@ export const enum PickType {
     Group = 3,
 }
 
+export const enum MarkingType {
+    None = 0,
+    Depth = 1,
+    Mask = 2,
+}
+
 interface Renderer {
     readonly stats: RendererStats
     readonly props: Readonly<RendererProps>
@@ -240,6 +246,7 @@ namespace Renderer {
             uRenderWboit: ValueCell.create(false),
             uMarkingDepthTest: ValueCell.create(false),
             uPickType: ValueCell.create(PickType.None),
+            uMarkingType: ValueCell.create(MarkingType.None),
 
             uTransparentBackground: ValueCell.create(false),
 
@@ -438,13 +445,14 @@ namespace Renderer {
             state.depthMask(true);
 
             updateInternal(group, camera, depthTexture, false, false);
+            ValueCell.updateIfChanged(globalUniforms.uMarkingType, MarkingType.Depth);
 
             const { renderables } = group;
             for (let i = 0, il = renderables.length; i < il; ++i) {
                 const r = renderables[i];
 
                 if (r.values.markerAverage.ref.value !== 1) {
-                    renderObject(renderables[i], 'markingDepth');
+                    renderObject(renderables[i], 'marking');
                 }
             }
         };
@@ -455,13 +463,14 @@ namespace Renderer {
             state.depthMask(true);
 
             updateInternal(group, camera, depthTexture, false, !!depthTexture);
+            ValueCell.updateIfChanged(globalUniforms.uMarkingType, MarkingType.Mask);
 
             const { renderables } = group;
             for (let i = 0, il = renderables.length; i < il; ++i) {
                 const r = renderables[i];
 
                 if (r.values.markerAverage.ref.value > 0) {
-                    renderObject(renderables[i], 'markingMask');
+                    renderObject(renderables[i], 'marking');
                 }
             }
         };

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

@@ -36,27 +36,30 @@ export const assign_material_color = `
     #else
         vec4 material = packDepthToRGBA(gl_FragCoord.z);
     #endif
-#elif defined(dRenderVariant_markingDepth)
-    if (marker > 0.0)
-        discard;
-    #ifdef enabledFragDepth
-        vec4 material = packDepthToRGBA(gl_FragDepthEXT);
-    #else
-        vec4 material = packDepthToRGBA(gl_FragCoord.z);
-    #endif
-#elif defined(dRenderVariant_markingMask)
-    if (marker == 0.0)
-        discard;
-    float depthTest = 1.0;
-    if (uMarkingDepthTest) {
-        depthTest = (fragmentDepth >= getDepth(gl_FragCoord.xy / uDrawingBufferSize)) ? 1.0 : 0.0;
+#elif defined(dRenderVariant_marking)
+    vec4 material;
+    if(uMarkingType == 1) {
+        if (marker > 0.0)
+            discard;
+        #ifdef enabledFragDepth
+            material = packDepthToRGBA(gl_FragDepthEXT);
+        #else
+            material = packDepthToRGBA(gl_FragCoord.z);
+        #endif
+    } else {
+        if (marker == 0.0)
+            discard;
+        float depthTest = 1.0;
+        if (uMarkingDepthTest) {
+            depthTest = (fragmentDepth >= getDepth(gl_FragCoord.xy / uDrawingBufferSize)) ? 1.0 : 0.0;
+        }
+        bool isHighlight = intMod(marker, 2.0) > 0.1;
+        float viewZ = depthToViewZ(uIsOrtho, fragmentDepth, uNear, uFar);
+        float fogFactor = smoothstep(uFogNear, uFogFar, abs(viewZ));
+        if (fogFactor == 1.0)
+            discard;
+        material = vec4(0.0, depthTest, isHighlight ? 1.0 : 0.0, 1.0 - fogFactor);
     }
-    bool isHighlight = intMod(marker, 2.0) > 0.1;
-    float viewZ = depthToViewZ(uIsOrtho, fragmentDepth, uNear, uFar);
-    float fogFactor = smoothstep(uFogNear, uFogFar, abs(viewZ));
-    if (fogFactor == 1.0)
-        discard;
-    vec4 material = vec4(0.0, depthTest, isHighlight ? 1.0 : 0.0, 1.0 - fogFactor);
 #endif
 
 // apply screendoor transparency

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

@@ -4,6 +4,7 @@ uniform int uInstanceCount;
 uniform int uGroupCount;
 
 uniform int uPickType;
+uniform int uMarkingType;
 
 #if dClipObjectCount != 0
     uniform int uClipObjectType[dClipObjectCount];

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

@@ -5,10 +5,6 @@ export const common = `
     #define dRenderVariant_color
 #endif
 
-#if defined(dRenderVariant_markingDepth) || defined(dRenderVariant_markingMask)
-    #define dRenderVariant_marking
-#endif
-
 #if defined(dColorType_instance) || defined(dColorType_group) || defined(dColorType_groupInstance) || defined(dColorType_vertex) || defined(dColorType_vertexInstance)
     #define dColorType_texture
 #endif
@@ -211,8 +207,8 @@ float depthToViewZ(const in float isOrtho, const in float linearClipZ, const in
             a20 * b03 - a21 * b01 + a22 * b00) / det;
     }
 
-    #define isNaN(x) ( (x) != (x)    )
-    #define isInf(x) ( (x) == (x)+1. )
+    #define isNaN(x) ((x) != (x))
+    #define isInf(x) ((x) == (x) + 1.0)
 #else
     #define transpose2(m) transpose(m)
     #define transpose3(m) transpose(m)

+ 4 - 4
src/mol-gl/shader/image.frag.ts

@@ -117,16 +117,16 @@ void main() {
         gl_FragColor = packDepthToRGBA(gl_FragCoord.z);
     #elif defined(dRenderVariant_marking)
         float marker = uMarker;
-        if (uMarker == - 1.0) {
+        if (uMarker == -1.0) {
             float group = decodeFloatRGB(texture2D(tGroupTex, vUv).rgb);
             marker = readFromTexture(tMarker, vInstance * float(uGroupCount) + group, uMarkerTexDim).a;
             marker = floor(marker * 255.0 + 0.5); // rounding required to work on some cards on win
         }
-        #if defined(dRenderVariant_markingDepth)
+        if (uMarkingType == 1) {
             if (marker > 0.0 || imageData.a < 0.05)
                 discard;
             gl_FragColor = packDepthToRGBA(gl_FragCoord.z);
-        #elif defined(dRenderVariant_markingMask)
+        } else {
             if (marker == 0.0 || imageData.a < 0.05)
                 discard;
             float depthTest = 1.0;
@@ -135,7 +135,7 @@ void main() {
             }
             bool isHighlight = intMod(marker, 2.0) > 0.1;
             gl_FragColor = vec4(0.0, depthTest, isHighlight ? 1.0 : 0.0, 1.0);
-        #endif
+        }
     #elif defined(dRenderVariant_color)
         if (imageData.a < 0.05)
             discard;

+ 1 - 1
src/mol-gl/webgl/render-item.ts

@@ -49,7 +49,7 @@ export interface RenderItem<T extends string> {
 
 //
 
-const GraphicsRenderVariant = { colorBlended: '', colorWboit: '', pick: '', depth: '', markingDepth: '', markingMask: '' };
+const GraphicsRenderVariant = { colorBlended: '', colorWboit: '', pick: '', depth: '', marking: '' };
 export type GraphicsRenderVariant = keyof typeof GraphicsRenderVariant
 export const GraphicsRenderVariants = Object.keys(GraphicsRenderVariant) as GraphicsRenderVariant[];
 export const GraphicsRenderVariantsBlended = GraphicsRenderVariants.filter(v => v !== 'colorWboit');