From dcda649d9db89d59d9b9a8f80df7e9a5ffd96370 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sat, 16 Jul 2022 12:58:49 -0700 Subject: [PATCH] add colorMarker option to Renderer - disables the highlight and select marker at a shader level - faster rendering of large scenes in some cases. --- CHANGELOG.md | 1 + src/mol-canvas3d/canvas3d.ts | 2 +- src/mol-geo/geometry/base.ts | 1 + src/mol-gl/renderable/schema.ts | 1 + src/mol-gl/renderer.ts | 8 +++++ .../shader/chunks/apply-marker-color.glsl.ts | 18 ++++++----- .../chunks/assign-marker-varying.glsl.ts | 2 +- .../chunks/assign-material-color.glsl.ts | 2 +- .../shader/chunks/common-frag-params.glsl.ts | 14 ++++---- .../shader/chunks/common-vert-params.glsl.ts | 2 +- src/mol-gl/shader/chunks/common.glsl.ts | 4 +++ src/mol-gl/shader/direct-volume.frag.ts | 32 +++++++++++-------- src/mol-gl/shader/spheres.frag.ts | 1 - 13 files changed, 55 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0607d054..0d9bc61ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Note that since we don't clearly distinguish between a public and private interf ## [Unreleased] +- Add ``colorMarker`` option to Renderer. This disables the highlight and select marker at a shader level for faster rendering of large scenes in some cases. - Bind shared textures only once per pass, not for each render item - Fix missing 'material' annotation for some uniforms, causing unnecessary uniform updates - Remove use of ``isnan`` in impostor shaders, not needed and causing slowdown diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 2af6cf0a4..2c20201ff 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -395,7 +395,7 @@ namespace Canvas3D { y > gl.drawingBufferHeight || y + height < 0 ) return false; - const markingUpdated = resolveMarking(); + const markingUpdated = resolveMarking() && (renderer.props.colorMarker || p.marking.enabled); let didRender = false; controls.update(currentTime); diff --git a/src/mol-geo/geometry/base.ts b/src/mol-geo/geometry/base.ts index ca2ba47d8..d17a47077 100644 --- a/src/mol-geo/geometry/base.ts +++ b/src/mol-geo/geometry/base.ts @@ -111,6 +111,7 @@ export namespace BaseGeometry { uRoughness: ValueCell.create(props.material.roughness), uBumpiness: ValueCell.create(props.material.bumpiness), dLightCount: ValueCell.create(1), + dColorMarker: ValueCell.create(true), dClipObjectCount: ValueCell.create(clip.objects.count), dClipVariant: ValueCell.create(clip.variant), diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index 116d56bdf..a364a1cd4 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -270,6 +270,7 @@ export const BaseSchema = { ...ClippingSchema, dLightCount: DefineSpec('number'), + dColorMarker: DefineSpec('boolean'), dClipObjectCount: DefineSpec('number'), dClipVariant: DefineSpec('string', ['instance', 'pixel']), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index 8c6a4710b..259e99e16 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -89,6 +89,7 @@ export const RendererParams = { interiorColorFlag: PD.Boolean(true, { label: 'Use Interior Color' }), interiorColor: PD.Color(Color.fromNormalizedRgb(0.3, 0.3, 0.3)), + colorMarker: PD.Boolean(true, { description: 'Enable color marker' }), highlightColor: PD.Color(Color.fromNormalizedRgb(1.0, 0.4, 0.6)), selectColor: PD.Color(Color.fromNormalizedRgb(0.2, 1.0, 0.1)), highlightStrength: PD.Numeric(0.3, { min: 0.0, max: 1.0, step: 0.1 }), @@ -246,6 +247,10 @@ namespace Renderer { ValueCell.update(r.values.dLightCount, light.count); definesNeedUpdate = true; } + if (r.values.dColorMarker.ref.value !== p.colorMarker) { + ValueCell.update(r.values.dColorMarker, p.colorMarker); + definesNeedUpdate = true; + } if (definesNeedUpdate) r.update(); const program = r.getProgram(variant); @@ -662,6 +667,9 @@ namespace Renderer { ValueCell.update(globalUniforms.uInteriorColor, Color.toVec3Normalized(globalUniforms.uInteriorColor.ref.value, p.interiorColor)); } + if (props.colorMarker !== undefined && props.colorMarker !== p.colorMarker) { + p.colorMarker = props.colorMarker; + } if (props.highlightColor !== undefined && props.highlightColor !== p.highlightColor) { p.highlightColor = props.highlightColor; ValueCell.update(globalUniforms.uHighlightColor, Color.toVec3Normalized(globalUniforms.uHighlightColor.ref.value, p.highlightColor)); diff --git a/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts b/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts index 6f09848c2..2033ca6d9 100644 --- a/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts +++ b/src/mol-gl/shader/chunks/apply-marker-color.glsl.ts @@ -1,11 +1,13 @@ export const apply_marker_color = ` -if (marker > 0.0) { - if ((uMarkerPriority == 1 && marker != 2.0) || (uMarkerPriority != 1 && marker == 1.0)) { - gl_FragColor.rgb = mix(gl_FragColor.rgb, uHighlightColor, uHighlightStrength); - gl_FragColor.a = max(gl_FragColor.a, uHighlightStrength * 0.002); // for direct-volume rendering - } else { - gl_FragColor.rgb = mix(gl_FragColor.rgb, uSelectColor, uSelectStrength); - gl_FragColor.a = max(gl_FragColor.a, uSelectStrength * 0.002); // for direct-volume rendering +#if defined(dColorMarker) + if (marker > 0.0) { + if ((uMarkerPriority == 1 && marker != 2.0) || (uMarkerPriority != 1 && marker == 1.0)) { + gl_FragColor.rgb = mix(gl_FragColor.rgb, uHighlightColor, uHighlightStrength); + gl_FragColor.a = max(gl_FragColor.a, uHighlightStrength * 0.002); // for direct-volume rendering + } else { + gl_FragColor.rgb = mix(gl_FragColor.rgb, uSelectColor, uSelectStrength); + gl_FragColor.a = max(gl_FragColor.a, uSelectStrength * 0.002); // for direct-volume rendering + } } -} +#endif `; \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts b/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts index 361ff36de..2548b2628 100644 --- a/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts +++ b/src/mol-gl/shader/chunks/assign-marker-varying.glsl.ts @@ -1,5 +1,5 @@ export const assign_marker_varying = ` -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) #if defined(dMarkerType_instance) vMarker = readFromTexture(tMarker, aInstance, uMarkerTexDim).a; #elif defined(dMarkerType_groupInstance) diff --git a/src/mol-gl/shader/chunks/assign-material-color.glsl.ts b/src/mol-gl/shader/chunks/assign-material-color.glsl.ts index 0f206270a..267fd7334 100644 --- a/src/mol-gl/shader/chunks/assign-material-color.glsl.ts +++ b/src/mol-gl/shader/chunks/assign-material-color.glsl.ts @@ -1,5 +1,5 @@ export const assign_material_color = ` -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) float marker = uMarker; if (uMarker == -1.0) { marker = floor(vMarker * 255.0 + 0.5); // rounding required to work on some cards on win diff --git a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts index 877d86636..3f49073d4 100644 --- a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts @@ -22,13 +22,15 @@ uniform int uMarkingType; #endif #endif -uniform vec3 uHighlightColor; -uniform vec3 uSelectColor; -uniform float uHighlightStrength; -uniform float uSelectStrength; -uniform int uMarkerPriority; +#if defined(dColorMarker) + uniform vec3 uHighlightColor; + uniform vec3 uSelectColor; + uniform float uHighlightStrength; + uniform float uSelectStrength; + uniform int uMarkerPriority; +#endif -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) uniform float uMarker; #if __VERSION__ == 100 varying float vMarker; diff --git a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts index b4e3e2c50..a0175b56a 100644 --- a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts @@ -29,7 +29,7 @@ uniform int uPickType; #endif #endif -#if defined(dRenderVariant_color) || defined(dRenderVariant_marking) +#if defined(dNeedsMarker) uniform float uMarker; uniform vec2 uMarkerTexDim; uniform sampler2D tMarker; diff --git a/src/mol-gl/shader/chunks/common.glsl.ts b/src/mol-gl/shader/chunks/common.glsl.ts index 785decd34..0df48939f 100644 --- a/src/mol-gl/shader/chunks/common.glsl.ts +++ b/src/mol-gl/shader/chunks/common.glsl.ts @@ -17,6 +17,10 @@ export const common = ` #define dColorType_varying #endif +#if (defined(dRenderVariant_color) && defined(dColorMarker)) || defined(dRenderVariant_marking) + #define dNeedsMarker +#endif + #define MaskAll 0 #define MaskOpaque 1 #define MaskTransparent 2 diff --git a/src/mol-gl/shader/direct-volume.frag.ts b/src/mol-gl/shader/direct-volume.frag.ts index a6e73a7f3..fd0f3af26 100644 --- a/src/mol-gl/shader/direct-volume.frag.ts +++ b/src/mol-gl/shader/direct-volume.frag.ts @@ -50,15 +50,17 @@ uniform int uVertexCount; uniform int uInstanceCount; uniform int uGroupCount; -uniform vec3 uHighlightColor; -uniform vec3 uSelectColor; -uniform float uHighlightStrength; -uniform float uSelectStrength; -uniform int uMarkerPriority; - -uniform float uMarker; -uniform vec2 uMarkerTexDim; -uniform sampler2D tMarker; +#if defined(dColorMarker) + uniform vec3 uHighlightColor; + uniform vec3 uSelectColor; + uniform float uHighlightStrength; + uniform float uSelectStrength; + uniform int uMarkerPriority; + + uniform float uMarker; + uniform vec2 uMarkerTexDim; + uniform sampler2D tMarker; +#endif uniform float uMetalness; uniform float uRoughness; @@ -304,11 +306,13 @@ vec4 raymarch(vec3 startLoc, vec3 step, vec3 rayDir) { gl_FragColor.a = material.a * uAlpha * uTransferScale; - float marker = uMarker; - if (uMarker == -1.0) { - 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(dColorMarker) + float marker = uMarker; + if (uMarker == -1.0) { + 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 + } + #endif #include apply_marker_color preFogAlphaBlended = (1.0 - preFogAlphaBlended) * gl_FragColor.a + preFogAlphaBlended; diff --git a/src/mol-gl/shader/spheres.frag.ts b/src/mol-gl/shader/spheres.frag.ts index e4f2e39e8..cf8f8a990 100644 --- a/src/mol-gl/shader/spheres.frag.ts +++ b/src/mol-gl/shader/spheres.frag.ts @@ -48,7 +48,6 @@ bool Impostor(out vec3 cameraPos, out vec3 cameraNormal){ cameraPos = rayDirection * negT + rayOrigin; - if (calcDepth(cameraPos) <= 0.0) { cameraPos = rayDirection * posT + rayOrigin; interior = true; -- GitLab