diff --git a/src/ol/renderer/webgl/webglmap.glsl b/src/ol/renderer/webgl/webglmap.glsl new file mode 100644 index 0000000000..3c1304efd6 --- /dev/null +++ b/src/ol/renderer/webgl/webglmap.glsl @@ -0,0 +1,31 @@ +//! NAMESPACE=ol.renderer.webgl.map + + +//! COMMON +varying vec2 v_texCoord; + + +//! VERTEX +attribute vec2 a_position; +attribute vec2 a_texCoord; + +uniform mat4 u_texCoordMatrix; +uniform mat4 u_projectionMatrix; + +void main(void) { + gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.); + v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st; +} + + +//! FRAGMENT +// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp +uniform mat4 u_colorMatrix; +uniform float u_opacity; +uniform sampler2D u_texture; + +void main(void) { + vec4 texColor = texture2D(u_texture, v_texCoord); + gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb; + gl_FragColor.a = texColor.a * u_opacity; +} diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js index 11ff3b5a08..3d56eca6e0 100644 --- a/src/ol/renderer/webgl/webglmaprenderer.js +++ b/src/ol/renderer/webgl/webglmaprenderer.js @@ -1,7 +1,6 @@ // FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE) goog.provide('ol.renderer.webgl.Map'); -goog.provide('ol.renderer.webgl.map.shader'); goog.require('goog.array'); goog.require('goog.debug.Logger'); @@ -22,6 +21,7 @@ goog.require('ol.renderer.webgl.FragmentShader'); goog.require('ol.renderer.webgl.ImageLayer'); goog.require('ol.renderer.webgl.TileLayer'); goog.require('ol.renderer.webgl.VertexShader'); +goog.require('ol.renderer.webgl.map.shader'); goog.require('ol.structs.Buffer'); goog.require('ol.structs.IntegerSet'); goog.require('ol.structs.LRUCache'); @@ -50,64 +50,6 @@ ol.renderer.webgl.TextureCacheEntry; -/** - * @constructor - * @extends {ol.renderer.webgl.FragmentShader} - * @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp - */ -ol.renderer.webgl.map.shader.Fragment = function() { - goog.base(this, [ - 'precision mediump float;', - '', - 'uniform mat4 u_colorMatrix;', - 'uniform float u_opacity;', - 'uniform sampler2D u_texture;', - '', - 'varying vec2 v_texCoord;', - '', - 'void main(void) {', - '', - ' vec4 texColor = texture2D(u_texture, v_texCoord);', - ' vec4 color = u_colorMatrix * vec4(texColor.rgb, 1.);', - ' color.a = texColor.a * u_opacity;', - '', - ' gl_FragColor = color;', - '', - '}' - ].join('\n')); -}; -goog.inherits( - ol.renderer.webgl.map.shader.Fragment, ol.renderer.webgl.FragmentShader); -goog.addSingletonGetter(ol.renderer.webgl.map.shader.Fragment); - - - -/** - * @constructor - * @extends {ol.renderer.webgl.VertexShader} - */ -ol.renderer.webgl.map.shader.Vertex = function() { - goog.base(this, [ - 'attribute vec2 a_position;', - 'attribute vec2 a_texCoord;', - '', - 'uniform mat4 u_texCoordMatrix;', - 'uniform mat4 u_projectionMatrix;', - '', - 'varying vec2 v_texCoord;', - '', - 'void main(void) {', - ' gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);', - ' v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;', - '}' - ].join('\n')); -}; -goog.inherits( - ol.renderer.webgl.map.shader.Vertex, ol.renderer.webgl.VertexShader); -goog.addSingletonGetter(ol.renderer.webgl.map.shader.Vertex); - - - /** * @constructor * @extends {ol.renderer.Map} @@ -586,13 +528,20 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { gl.useProgram(program); if (goog.isNull(this.locations_)) { this.locations_ = { - a_position: gl.getAttribLocation(program, 'a_position'), - a_texCoord: gl.getAttribLocation(program, 'a_texCoord'), - u_colorMatrix: gl.getUniformLocation(program, 'u_colorMatrix'), - u_texCoordMatrix: gl.getUniformLocation(program, 'u_texCoordMatrix'), - u_projectionMatrix: gl.getUniformLocation(program, 'u_projectionMatrix'), - u_opacity: gl.getUniformLocation(program, 'u_opacity'), - u_texture: gl.getUniformLocation(program, 'u_texture') + a_position: gl.getAttribLocation( + program, ol.renderer.webgl.map.shader.attribute.a_position), + a_texCoord: gl.getAttribLocation( + program, ol.renderer.webgl.map.shader.attribute.a_texCoord), + u_colorMatrix: gl.getUniformLocation( + program, ol.renderer.webgl.map.shader.uniform.u_colorMatrix), + u_texCoordMatrix: gl.getUniformLocation( + program, ol.renderer.webgl.map.shader.uniform.u_texCoordMatrix), + u_projectionMatrix: gl.getUniformLocation( + program, ol.renderer.webgl.map.shader.uniform.u_projectionMatrix), + u_opacity: gl.getUniformLocation( + program, ol.renderer.webgl.map.shader.uniform.u_opacity), + u_texture: gl.getUniformLocation( + program, ol.renderer.webgl.map.shader.uniform.u_texture) }; } diff --git a/src/ol/renderer/webgl/webglmapshader.js b/src/ol/renderer/webgl/webglmapshader.js new file mode 100644 index 0000000000..29afc21c04 --- /dev/null +++ b/src/ol/renderer/webgl/webglmapshader.js @@ -0,0 +1,105 @@ +goog.provide('ol.renderer.webgl.map.shader'); +goog.require('ol.renderer.webgl.FragmentShader'); +goog.require('ol.renderer.webgl.VertexShader'); +/** + * @constructor + * @extends {ol.renderer.webgl.FragmentShader} + */ +ol.renderer.webgl.map.shader.Fragment = function() { + goog.base(this, ol.renderer.webgl.map.shader.Fragment.SOURCE); +}; +goog.inherits(ol.renderer.webgl.map.shader.Fragment, ol.renderer.webgl.FragmentShader); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.Fragment); +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.map\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! FRAGMENT\n// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp\nuniform mat4 u_colorMatrix;\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor = texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;\n gl_FragColor.a = texColor.a * u_opacity;\n}\n\n'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform mat4 d;uniform float e;uniform sampler2D f;void main(){vec4 g=texture2D(f,a);gl_FragColor.rgb=(d*vec4(g.rgb,1)).rgb;gl_FragColor.a=g.a*e;}'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.Fragment.SOURCE = goog.DEBUG ? + ol.renderer.webgl.map.shader.Fragment.DEBUG_SOURCE : + ol.renderer.webgl.map.shader.Fragment.OPTIMIZED_SOURCE; +/** + * @constructor + * @extends {ol.renderer.webgl.VertexShader} + */ +ol.renderer.webgl.map.shader.Vertex = function() { + goog.base(this, ol.renderer.webgl.map.shader.Vertex.SOURCE); +}; +goog.inherits(ol.renderer.webgl.map.shader.Vertex, ol.renderer.webgl.VertexShader); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.Vertex); +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.Vertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.map\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! VERTEX\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);\n v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.Vertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 d,e;uniform mat4 b,c;void main(){gl_Position=c*vec4(d,0,1);a=(b*vec4(e,0,1)).st;}'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.Vertex.SOURCE = goog.DEBUG ? + ol.renderer.webgl.map.shader.Vertex.DEBUG_SOURCE : + ol.renderer.webgl.map.shader.Vertex.OPTIMIZED_SOURCE; +/** + * @constructor + */ +ol.renderer.webgl.map.shader.uniform = function() {}; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.uniform.u_texCoordMatrix = + goog.DEBUG ? 'u_texCoordMatrix' : 'b'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.uniform.u_projectionMatrix = + goog.DEBUG ? 'u_projectionMatrix' : 'c'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.uniform.u_colorMatrix = + goog.DEBUG ? 'u_colorMatrix' : 'd'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.uniform.u_opacity = + goog.DEBUG ? 'u_opacity' : 'e'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.uniform.u_texture = + goog.DEBUG ? 'u_texture' : 'f'; +/** + * @constructor + */ +ol.renderer.webgl.map.shader.attribute = function() {}; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.attribute.a_position = + goog.DEBUG ? 'a_position' : 'd'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.attribute.a_texCoord = + goog.DEBUG ? 'a_texCoord' : 'e';