瀏覽代碼

fix temporal multi-sample flicker, enable by default

Alexander Rose 3 年之前
父節點
當前提交
2135f76441
共有 3 個文件被更改,包括 12 次插入3 次删除
  1. 3 0
      CHANGELOG.md
  2. 5 1
      src/mol-canvas3d/canvas3d.ts
  3. 4 2
      src/mol-canvas3d/passes/multi-sample.ts

+ 3 - 0
CHANGELOG.md

@@ -6,6 +6,9 @@ Note that since we don't clearly distinguish between a public and private interf
 
 ## [Unreleased]
 
+- Enable temporal multi-sampling by default
+    - Fix flickering during marking with camera at rest
+
 ## [v3.0.0-dev.5] - 2021-12-16
 
 - Fix initial camera reset not triggering for some entries.

+ 5 - 1
src/mol-canvas3d/canvas3d.ts

@@ -395,7 +395,11 @@ namespace Canvas3D {
                 }
 
                 if (MultiSamplePass.isEnabled(p.multiSample)) {
-                    multiSampleHelper.render(renderer, cam, scene, helper, true, p.transparentBackground, p);
+                    if (!cameraChanged) {
+                        while(!multiSampleHelper.render(renderer, cam, scene, helper, true, p.transparentBackground, p));
+                    } else {
+                        multiSampleHelper.render(renderer, cam, scene, helper, true, p.transparentBackground, p);
+                    }
                 } else {
                     passes.draw.render(renderer, cam, scene, helper, true, p.transparentBackground, p.postprocessing, p.marking);
                 }

+ 4 - 2
src/mol-canvas3d/passes/multi-sample.ts

@@ -50,8 +50,8 @@ function getComposeRenderable(ctx: WebGLContext, colorTexture: Texture): Compose
 }
 
 export const MultiSampleParams = {
-    mode: PD.Select('off', [['off', 'Off'], ['on', 'On'], ['temporal', 'Temporal']]),
-    sampleLevel: PD.Numeric(2, { min: 0, max: 5, step: 1 }),
+    mode: PD.Select('temporal', [['off', 'Off'], ['on', 'On'], ['temporal', 'Temporal']]),
+    sampleLevel: PD.Numeric(2, { min: 0, max: 5, step: 1 }, { description: 'Take level^2 samples.' }),
 };
 export type MultiSampleProps = PD.Values<typeof MultiSampleParams>
 
@@ -324,8 +324,10 @@ export class MultiSampleHelper {
         return props.mode === 'temporal' ? this.sampleIndex !== -2 : false;
     }
 
+    /** Return `true` while more samples are needed */
     render(renderer: Renderer, camera: Camera | StereoCamera, scene: Scene, helper: Helper, toDrawingBuffer: boolean, transparentBackground: boolean, props: Props) {
         this.sampleIndex = this.multiSamplePass.render(this.sampleIndex, renderer, camera, scene, helper, toDrawingBuffer, transparentBackground, props);
+        return this.sampleIndex < 0;
     }
 
     constructor(private multiSamplePass: MultiSamplePass) {