From 600e1a4647334c3685b1d599dc3cfe82eb0cf849 Mon Sep 17 00:00:00 2001 From: Olivier Guyot Date: Thu, 31 Oct 2019 13:40:51 +0100 Subject: [PATCH] Webgl points renderer / use a smaller canvas for hit detection render The hit detection render is now done against a canvas with half the width/height of the main render. This still provides sufficient precision while requiring a much smaller memory allocation (especially for retina devices). --- src/ol/renderer/webgl/PointsLayer.js | 7 +++++-- src/ol/webgl/Helper.js | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ol/renderer/webgl/PointsLayer.js b/src/ol/renderer/webgl/PointsLayer.js index f0dbdb7452..811925df7a 100644 --- a/src/ol/renderer/webgl/PointsLayer.js +++ b/src/ol/renderer/webgl/PointsLayer.js @@ -503,7 +503,7 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer { const pixel = applyTransform(frameState.coordinateToPixelTransform, coordinate.slice()); - const data = this.hitRenderTarget_.readPixel(pixel[0], pixel[1]); + const data = this.hitRenderTarget_.readPixel(pixel[0] / 2, pixel[1] / 2); const color = [ data[0] / 255, data[1] / 255, @@ -531,7 +531,10 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer { return; } - this.hitRenderTarget_.setSize(frameState.size); + this.hitRenderTarget_.setSize([ + Math.floor(frameState.size[0] / 2), + Math.floor(frameState.size[1] / 2) + ]); this.helper.useProgram(this.hitProgram_); this.helper.prepareDrawToRenderTarget(frameState, this.hitRenderTarget_, true); diff --git a/src/ol/webgl/Helper.js b/src/ol/webgl/Helper.js index 27434f79ea..cf2ceeab3a 100644 --- a/src/ol/webgl/Helper.js +++ b/src/ol/webgl/Helper.js @@ -456,9 +456,10 @@ class WebGLHelper extends Disposable { */ prepareDrawToRenderTarget(frameState, renderTarget, opt_disableAlphaBlend) { const gl = this.getGL(); + const size = renderTarget.getSize(); gl.bindFramebuffer(gl.FRAMEBUFFER, renderTarget.getFramebuffer()); - gl.viewport(0, 0, frameState.size[0], frameState.size[1]); + gl.viewport(0, 0, size[0], size[1]); gl.bindTexture(gl.TEXTURE_2D, renderTarget.getTexture()); gl.clearColor(0.0, 0.0, 0.0, 0.0); gl.clear(gl.COLOR_BUFFER_BIT);