From de7a1d8f81df159eecadbf53f8e2e5dcd1775388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 13 Feb 2013 21:50:32 +0100 Subject: [PATCH] Apply transform matrix to text coords With this commit the transform matrix is applied to each texture coordinate, as opposed to each fragment. This leads to less calculation on the GPU. --- src/ol/renderer/webgl/webgllayerrenderer.js | 2 +- src/ol/renderer/webgl/webglmaprenderer.js | 21 ++++++++++--------- .../renderer/webgl/webgltilelayerrenderer.js | 16 +++++++------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/ol/renderer/webgl/webgllayerrenderer.js b/src/ol/renderer/webgl/webgllayerrenderer.js index 3f8f3c2d17..238462410f 100644 --- a/src/ol/renderer/webgl/webgllayerrenderer.js +++ b/src/ol/renderer/webgl/webgllayerrenderer.js @@ -88,7 +88,7 @@ ol.renderer.webgl.Layer.prototype.getMapRenderer = function() { /** * @return {!goog.vec.Mat4.Number} Matrix. */ -ol.renderer.webgl.Layer.prototype.getMatrix = goog.abstractMethod; +ol.renderer.webgl.Layer.prototype.getTexCoordMatrix = goog.abstractMethod; /** diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js index 0af57fa846..7ca920c264 100644 --- a/src/ol/renderer/webgl/webglmaprenderer.js +++ b/src/ol/renderer/webgl/webglmaprenderer.js @@ -48,15 +48,13 @@ ol.renderer.webgl.map.shader.Fragment = function() { '', 'uniform mat4 uColorMatrix;', 'uniform float uOpacity;', - 'uniform mat4 uMatrix;', 'uniform sampler2D uTexture;', '', - 'varying vec2 vTexCoord;', + 'varying vec4 vTexCoord;', '', 'void main(void) {', '', - ' vec4 texCoord = uMatrix * vec4(vTexCoord, 0., 1.);', - ' vec4 texColor = texture2D(uTexture, texCoord.st);', + ' vec4 texColor = texture2D(uTexture, vTexCoord.st);', ' vec4 color = uColorMatrix * vec4(texColor.rgb, 1.);', ' color.a = texColor.a * uOpacity;', '', @@ -80,11 +78,13 @@ ol.renderer.webgl.map.shader.Vertex = function() { 'attribute vec2 aPosition;', 'attribute vec2 aTexCoord;', '', - 'varying vec2 vTexCoord;', + 'uniform mat4 uTexCoordMatrix;', + '', + 'varying vec4 vTexCoord;', '', 'void main(void) {', ' gl_Position = vec4(aPosition, 0., 1.);', - ' vTexCoord = aTexCoord;', + ' vTexCoord = uTexCoordMatrix * vec4(aTexCoord, 0., 1.);', '}' ].join('\n')); }; @@ -157,9 +157,9 @@ ol.renderer.webgl.Map = function(container, map) { * @type {{aPosition: number, * aTexCoord: number, * uColorMatrix: WebGLUniformLocation, - * uMatrix: WebGLUniformLocation, * uOpacity: WebGLUniformLocation, - * uTexture: WebGLUniformLocation}|null} + * uTexture: WebGLUniformLocation, + * uTexCoordMatrix: WebGLUniformLocation}|null} */ this.locations_ = null; @@ -518,7 +518,7 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { aPosition: gl.getAttribLocation(program, 'aPosition'), aTexCoord: gl.getAttribLocation(program, 'aTexCoord'), uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'), - uMatrix: gl.getUniformLocation(program, 'uMatrix'), + uTexCoordMatrix: gl.getUniformLocation(program, 'uTexCoordMatrix'), uOpacity: gl.getUniformLocation(program, 'uOpacity'), uTexture: gl.getUniformLocation(program, 'uTexture') }; @@ -553,7 +553,8 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { } var layerRenderer = this.getLayerRenderer(layer); gl.uniformMatrix4fv( - this.locations_.uMatrix, false, layerRenderer.getMatrix()); + this.locations_.uTexCoordMatrix, false, + layerRenderer.getTexCoordMatrix()); gl.uniformMatrix4fv( this.locations_.uColorMatrix, false, layerRenderer.getColorMatrix()); gl.uniform1f(this.locations_.uOpacity, layer.getOpacity()); diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 27c0cbadab..8f1dab302a 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -139,7 +139,7 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) { * @private * @type {!goog.vec.Mat4.Number} */ - this.matrix_ = goog.vec.Mat4.createNumber(); + this.texCoordMatrix_ = goog.vec.Mat4.createNumber(); /** * @private @@ -224,8 +224,8 @@ ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() { /** * @inheritDoc */ -ol.renderer.webgl.TileLayer.prototype.getMatrix = function() { - return this.matrix_; +ol.renderer.webgl.TileLayer.prototype.getTexCoordMatrix = function() { + return this.texCoordMatrix_; }; @@ -467,21 +467,21 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); this.scheduleExpireCache(frameState, tileSource); - goog.vec.Mat4.makeIdentity(this.matrix_); - goog.vec.Mat4.translate(this.matrix_, + goog.vec.Mat4.makeIdentity(this.texCoordMatrix_); + goog.vec.Mat4.translate(this.texCoordMatrix_, (view2DState.center.x - framebufferExtent.minX) / (framebufferExtent.maxX - framebufferExtent.minX), (view2DState.center.y - framebufferExtent.minY) / (framebufferExtent.maxY - framebufferExtent.minY), 0); - goog.vec.Mat4.rotateZ(this.matrix_, view2DState.rotation); - goog.vec.Mat4.scale(this.matrix_, + goog.vec.Mat4.rotateZ(this.texCoordMatrix_, view2DState.rotation); + goog.vec.Mat4.scale(this.texCoordMatrix_, frameState.size.width * view2DState.resolution / (framebufferExtent.maxX - framebufferExtent.minX), frameState.size.height * view2DState.resolution / (framebufferExtent.maxY - framebufferExtent.minY), 1); - goog.vec.Mat4.translate(this.matrix_, + goog.vec.Mat4.translate(this.texCoordMatrix_, -0.5, -0.5, 0);