Bladeren bron

fix drawing buffer uniform assignment

- fixes issues with texture fetches when size differs from canvas size
Alexander Rose 4 jaren geleden
bovenliggende
commit
dc9af9d8b0
4 gewijzigde bestanden met toevoegingen van 13 en 22 verwijderingen
  1. 7 6
      src/mol-canvas3d/passes/draw.ts
  2. 0 2
      src/mol-canvas3d/passes/image.ts
  3. 1 1
      src/mol-canvas3d/passes/pick.ts
  4. 5 13
      src/mol-gl/renderer.ts

+ 7 - 6
src/mol-canvas3d/passes/draw.ts

@@ -216,11 +216,9 @@ export class DrawPass {
         }
     }
 
-    private _render(renderer: Renderer, camera: ICamera, scene: Scene, helper: Helper, toDrawingBuffer: boolean, transparentBackground: boolean) {
+    private _render(renderer: Renderer, camera: ICamera, scene: Scene, helper: Helper, toDrawingBuffer: boolean) {
         const { x, y, width, height } = camera.viewport;
         renderer.setViewport(x, y, width, height);
-        renderer.setTransparentBackground(transparentBackground);
-        renderer.setDrawingBufferScale(1);
         renderer.update(camera);
 
         if (this.wboitEnabled) {
@@ -246,11 +244,14 @@ export class DrawPass {
     }
 
     render(renderer: Renderer, camera: Camera | StereoCamera, scene: Scene, helper: Helper, toDrawingBuffer: boolean, transparentBackground: boolean) {
+        renderer.setTransparentBackground(transparentBackground);
+        renderer.setDrawingBufferSize(this.colorTarget.getWidth(), this.colorTarget.getHeight());
+
         if (StereoCamera.is(camera)) {
-            this._render(renderer, camera.left, scene, helper, toDrawingBuffer, transparentBackground);
-            this._render(renderer, camera.right, scene, helper, toDrawingBuffer, transparentBackground);
+            this._render(renderer, camera.left, scene, helper, toDrawingBuffer);
+            this._render(renderer, camera.right, scene, helper, toDrawingBuffer);
         } else {
-            this._render(renderer, camera, scene, helper, toDrawingBuffer, transparentBackground);
+            this._render(renderer, camera, scene, helper, toDrawingBuffer);
         }
     }
 }

+ 0 - 2
src/mol-canvas3d/passes/image.ts

@@ -84,8 +84,6 @@ export class ImagePass {
         Viewport.set(this._camera.viewport, 0, 0, this._width, this._height);
         this._camera.update();
 
-        this.renderer.setViewport(0, 0, this._width, this._height);
-
         if (MultiSamplePass.isEnabled(this.props.multiSample)) {
             this.multiSampleHelper.render(this.renderer, this._camera, this.scene, this.helper, false, this.props.transparentBackground, this.props);
             this._colorTarget = this.multiSamplePass.colorTarget;

+ 1 - 1
src/mol-canvas3d/passes/pick.ts

@@ -170,7 +170,7 @@ export class PickHelper {
         const { renderer, scene, helper } = this;
 
         renderer.setTransparentBackground(false);
-        renderer.setDrawingBufferScale(this.pickScale);
+        renderer.setDrawingBufferSize(this.pickPass.objectPickTarget.getWidth(), this.pickPass.objectPickTarget.getHeight());
 
         if (StereoCamera.is(camera)) {
             renderer.setViewport(pickX, pickY, halfPickWidth, pickHeight);

+ 5 - 13
src/mol-gl/renderer.ts

@@ -55,7 +55,7 @@ interface Renderer {
     setProps: (props: Partial<RendererProps>) => void
     setViewport: (x: number, y: number, width: number, height: number) => void
     setTransparentBackground: (value: boolean) => void
-    setDrawingBufferScale: (value: number) => void
+    setDrawingBufferSize: (width: number, height: number) => void
 
     dispose: () => void
 }
@@ -180,7 +180,6 @@ namespace Renderer {
         const bgColor = Color.toVec3Normalized(Vec3(), p.backgroundColor);
 
         let transparentBackground = false;
-        let drawingBufferScale = 1;
 
         const nullDepthTexture = createNullTexture(gl, 'image-depth');
         const sharedTexturesList: Textures = [
@@ -353,15 +352,6 @@ namespace Renderer {
             ValueCell.updateIfChanged(globalUniforms.uFogFar, camera.fogFar);
             ValueCell.updateIfChanged(globalUniforms.uFogNear, camera.fogNear);
             ValueCell.updateIfChanged(globalUniforms.uTransparentBackground, transparentBackground);
-
-            if (gl.drawingBufferWidth * drawingBufferScale !== drawingBufferSize[0] ||
-                gl.drawingBufferHeight * drawingBufferScale !== drawingBufferSize[1]
-            ) {
-                ValueCell.update(globalUniforms.uDrawingBufferSize, Vec2.set(drawingBufferSize,
-                    gl.drawingBufferWidth * drawingBufferScale,
-                    gl.drawingBufferHeight * drawingBufferScale
-                ));
-            }
         };
 
         const updateInternal = (group: Scene.Group, camera: ICamera, depthTexture: Texture | null, renderWboit: boolean) => {
@@ -575,8 +565,10 @@ namespace Renderer {
             setTransparentBackground: (value: boolean) => {
                 transparentBackground = value;
             },
-            setDrawingBufferScale: (value: number) => {
-                drawingBufferScale = value;
+            setDrawingBufferSize: (width: number, height: number) => {
+                if (width !== drawingBufferSize[0] || height !== drawingBufferSize[1]) {
+                    ValueCell.update(globalUniforms.uDrawingBufferSize, Vec2.set(drawingBufferSize, width, height));
+                }
             },
 
             get props() {