Merge pull request #506 from twpayne/refactor-webgl-shaders
Refactor WebGL shaders
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
//! NAMESPACE=ol.renderer.webgl.map
|
||||
//! NAMESPACE=ol.renderer.webgl.map.shader.Color
|
||||
//! CLASS=ol.renderer.webgl.map.shader.Color
|
||||
|
||||
|
||||
//! COMMON
|
||||
97
src/ol/renderer/webgl/webglmapcolorshader.js
Normal file
97
src/ol/renderer/webgl/webglmapcolorshader.js
Normal file
@@ -0,0 +1,97 @@
|
||||
// This file is automatically generated, do not edit
|
||||
goog.provide('ol.renderer.webgl.map.shader.Color');
|
||||
goog.require('ol.webgl.shader');
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.ColorFragment = function() {
|
||||
goog.base(this, ol.renderer.webgl.map.shader.ColorFragment.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.map.shader.ColorFragment, ol.webgl.shader.Fragment);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorFragment);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.map.shader.Color\n//! CLASS=ol.renderer.webgl.map.shader.Color\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.ColorFragment.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.ColorFragment.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.map.shader.ColorFragment.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.ColorVertex = function() {
|
||||
goog.base(this, ol.renderer.webgl.map.shader.ColorVertex.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.map.shader.ColorVertex, ol.webgl.shader.Vertex);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorVertex);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.map.shader.Color\n//! CLASS=ol.renderer.webgl.map.shader.Color\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.ColorVertex.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.ColorVertex.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.map.shader.ColorVertex.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
* @param {WebGLRenderingContext} gl GL.
|
||||
* @param {WebGLProgram} program Program.
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Color.Locations = function(gl, program) {
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_texCoordMatrix = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_texCoordMatrix' : 'b');
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_projectionMatrix = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_projectionMatrix' : 'c');
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_colorMatrix = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_colorMatrix' : 'd');
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_opacity = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_opacity' : 'e');
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_texture = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_texture' : 'f');
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
this.a_position = gl.getAttribLocation(
|
||||
program, goog.DEBUG ? 'a_position' : 'd');
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
this.a_texCoord = gl.getAttribLocation(
|
||||
program, goog.DEBUG ? 'a_texCoord' : 'e');
|
||||
};
|
||||
30
src/ol/renderer/webgl/webglmapdefault.glsl
Normal file
30
src/ol/renderer/webgl/webglmapdefault.glsl
Normal file
@@ -0,0 +1,30 @@
|
||||
//! NAMESPACE=ol.renderer.webgl.map.shader.Default
|
||||
//! CLASS=ol.renderer.webgl.map.shader.Default
|
||||
|
||||
|
||||
//! 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
|
||||
uniform float u_opacity;
|
||||
uniform sampler2D u_texture;
|
||||
|
||||
void main(void) {
|
||||
vec4 texColor = texture2D(u_texture, v_texCoord);
|
||||
gl_FragColor.rgb = texColor.rgb;
|
||||
gl_FragColor.a = texColor.a * u_opacity;
|
||||
}
|
||||
92
src/ol/renderer/webgl/webglmapdefaultshader.js
Normal file
92
src/ol/renderer/webgl/webglmapdefaultshader.js
Normal file
@@ -0,0 +1,92 @@
|
||||
// This file is automatically generated, do not edit
|
||||
goog.provide('ol.renderer.webgl.map.shader.Default');
|
||||
goog.require('ol.webgl.shader');
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.DefaultFragment = function() {
|
||||
goog.base(this, ol.renderer.webgl.map.shader.DefaultFragment.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.map.shader.DefaultFragment, ol.webgl.shader.Fragment);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultFragment);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.map.shader.Default\n//! CLASS=ol.renderer.webgl.map.shader.Default\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 float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor = texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb = texColor.rgb;\n gl_FragColor.a = texColor.a * u_opacity;\n}\n\n';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform float d;uniform sampler2D e;void main(){vec4 f=texture2D(e,a);gl_FragColor.rgb=f.rgb;gl_FragColor.a=f.a*d;}';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.DefaultFragment.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.DefaultVertex = function() {
|
||||
goog.base(this, ol.renderer.webgl.map.shader.DefaultVertex.SOURCE);
|
||||
};
|
||||
goog.inherits(ol.renderer.webgl.map.shader.DefaultVertex, ol.webgl.shader.Vertex);
|
||||
goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultVertex);
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.map.shader.Default\n//! CLASS=ol.renderer.webgl.map.shader.Default\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.DefaultVertex.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.DefaultVertex.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE :
|
||||
ol.renderer.webgl.map.shader.DefaultVertex.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
* @param {WebGLRenderingContext} gl GL.
|
||||
* @param {WebGLProgram} program Program.
|
||||
*/
|
||||
ol.renderer.webgl.map.shader.Default.Locations = function(gl, program) {
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_texCoordMatrix = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_texCoordMatrix' : 'b');
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_projectionMatrix = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_projectionMatrix' : 'c');
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_opacity = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_opacity' : 'd');
|
||||
/**
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
this.u_texture = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_texture' : 'e');
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
this.a_position = gl.getAttribLocation(
|
||||
program, goog.DEBUG ? 'a_position' : 'd');
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
this.a_texCoord = gl.getAttribLocation(
|
||||
program, goog.DEBUG ? 'a_texCoord' : 'e');
|
||||
};
|
||||
@@ -20,7 +20,8 @@ goog.require('ol.layer.TileLayer');
|
||||
goog.require('ol.renderer.Map');
|
||||
goog.require('ol.renderer.webgl.ImageLayer');
|
||||
goog.require('ol.renderer.webgl.TileLayer');
|
||||
goog.require('ol.renderer.webgl.map.shader');
|
||||
goog.require('ol.renderer.webgl.map.shader.Color');
|
||||
goog.require('ol.renderer.webgl.map.shader.Default');
|
||||
goog.require('ol.structs.Buffer');
|
||||
goog.require('ol.structs.IntegerSet');
|
||||
goog.require('ol.structs.LRUCache');
|
||||
@@ -103,15 +104,15 @@ ol.renderer.webgl.Map = function(container, map) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {{a_position: number,
|
||||
* a_texCoord: number,
|
||||
* u_colorMatrix: WebGLUniformLocation,
|
||||
* u_opacity: WebGLUniformLocation,
|
||||
* u_texture: WebGLUniformLocation,
|
||||
* u_texCoordMatrix: WebGLUniformLocation,
|
||||
* u_projectionMatrix: WebGLUniformLocation}|null}
|
||||
* @type {ol.renderer.webgl.map.shader.Color.Locations}
|
||||
*/
|
||||
this.locations_ = null;
|
||||
this.colorLocations_ = null;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.renderer.webgl.map.shader.Default.Locations}
|
||||
*/
|
||||
this.defaultLocations_ = null;
|
||||
|
||||
/**
|
||||
* @private
|
||||
@@ -200,18 +201,6 @@ ol.renderer.webgl.Map = function(container, map) {
|
||||
*/
|
||||
this.textureCacheFrameMarkerCount_ = 0;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
this.fragmentShader_ = ol.renderer.webgl.map.shader.Fragment.getInstance();
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
this.vertexShader_ = ol.renderer.webgl.map.shader.Vertex.getInstance();
|
||||
|
||||
this.initializeGL_();
|
||||
|
||||
};
|
||||
@@ -468,7 +457,8 @@ ol.renderer.webgl.Map.prototype.getTileTextureQueue = function() {
|
||||
*/
|
||||
ol.renderer.webgl.Map.prototype.handleWebGLContextLost = function(event) {
|
||||
event.preventDefault();
|
||||
this.locations_ = null;
|
||||
this.colorLocations_ = null;
|
||||
this.defaultLocations_ = null;
|
||||
this.bufferCache_ = {};
|
||||
this.shaderCache_ = {};
|
||||
this.programCache_ = {};
|
||||
@@ -560,54 +550,79 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
|
||||
gl.enable(goog.webgl.BLEND);
|
||||
gl.viewport(0, 0, size.width, size.height);
|
||||
|
||||
var program = this.getProgram(this.fragmentShader_, this.vertexShader_);
|
||||
gl.useProgram(program);
|
||||
if (goog.isNull(this.locations_)) {
|
||||
this.locations_ = {
|
||||
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)
|
||||
};
|
||||
}
|
||||
|
||||
this.bindBuffer(goog.webgl.ARRAY_BUFFER, this.arrayBuffer_);
|
||||
|
||||
gl.enableVertexAttribArray(this.locations_.a_position);
|
||||
gl.vertexAttribPointer(
|
||||
this.locations_.a_position, 2, goog.webgl.FLOAT, false, 16, 0);
|
||||
gl.enableVertexAttribArray(this.locations_.a_texCoord);
|
||||
gl.vertexAttribPointer(
|
||||
this.locations_.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8);
|
||||
gl.uniform1i(this.locations_.u_texture, 0);
|
||||
|
||||
var currentProgram = null;
|
||||
var locations;
|
||||
goog.array.forEach(frameState.layersArray, function(layer) {
|
||||
|
||||
var layerState = frameState.layerStates[goog.getUid(layer)];
|
||||
if (!layerState.visible || !layerState.ready) {
|
||||
return;
|
||||
}
|
||||
var useColor =
|
||||
layerState.brightness ||
|
||||
layerState.contrast != 1 ||
|
||||
layerState.hue ||
|
||||
layerState.saturation != 1;
|
||||
|
||||
var fragmentShader, vertexShader;
|
||||
if (useColor) {
|
||||
fragmentShader = ol.renderer.webgl.map.shader.ColorFragment.getInstance();
|
||||
vertexShader = ol.renderer.webgl.map.shader.ColorVertex.getInstance();
|
||||
} else {
|
||||
fragmentShader =
|
||||
ol.renderer.webgl.map.shader.DefaultFragment.getInstance();
|
||||
vertexShader = ol.renderer.webgl.map.shader.DefaultVertex.getInstance();
|
||||
}
|
||||
|
||||
var program = this.getProgram(fragmentShader, vertexShader);
|
||||
if (program != currentProgram) {
|
||||
|
||||
gl.useProgram(program);
|
||||
currentProgram = program;
|
||||
|
||||
if (useColor) {
|
||||
if (goog.isNull(this.colorLocations_)) {
|
||||
locations =
|
||||
new ol.renderer.webgl.map.shader.Color.Locations(gl, program);
|
||||
this.colorLocations_ = locations;
|
||||
} else {
|
||||
locations = this.colorLocations_;
|
||||
}
|
||||
} else {
|
||||
if (goog.isNull(this.defaultLocations_)) {
|
||||
locations =
|
||||
new ol.renderer.webgl.map.shader.Default.Locations(gl, program);
|
||||
this.defaultLocations_ = locations;
|
||||
} else {
|
||||
locations = this.defaultLocations_;
|
||||
}
|
||||
}
|
||||
|
||||
gl.enableVertexAttribArray(locations.a_position);
|
||||
gl.vertexAttribPointer(
|
||||
locations.a_position, 2, goog.webgl.FLOAT, false, 16, 0);
|
||||
gl.enableVertexAttribArray(locations.a_texCoord);
|
||||
gl.vertexAttribPointer(
|
||||
locations.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8);
|
||||
gl.uniform1i(locations.u_texture, 0);
|
||||
|
||||
}
|
||||
|
||||
var layerRenderer = this.getLayerRenderer(layer);
|
||||
gl.uniformMatrix4fv(
|
||||
this.locations_.u_texCoordMatrix, false,
|
||||
layerRenderer.getTexCoordMatrix());
|
||||
gl.uniformMatrix4fv(
|
||||
this.locations_.u_projectionMatrix, false,
|
||||
locations.u_texCoordMatrix, false, layerRenderer.getTexCoordMatrix());
|
||||
gl.uniformMatrix4fv(locations.u_projectionMatrix, false,
|
||||
layerRenderer.getProjectionMatrix());
|
||||
gl.uniformMatrix4fv(
|
||||
this.locations_.u_colorMatrix, false, layerRenderer.getColorMatrix());
|
||||
gl.uniform1f(this.locations_.u_opacity, layer.getOpacity());
|
||||
if (useColor) {
|
||||
gl.uniformMatrix4fv(locations.u_colorMatrix, false,
|
||||
layerRenderer.getColorMatrix());
|
||||
}
|
||||
gl.uniform1f(locations.u_opacity, layer.getOpacity());
|
||||
gl.bindTexture(goog.webgl.TEXTURE_2D, layerRenderer.getTexture());
|
||||
gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4);
|
||||
|
||||
}, this);
|
||||
|
||||
if (!this.renderedVisible_) {
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
// This file is automatically generated, do not edit
|
||||
goog.provide('ol.renderer.webgl.map.shader');
|
||||
goog.require('ol.webgl.shader');
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
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.webgl.shader.Fragment);
|
||||
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.webgl.shader.Vertex}
|
||||
*/
|
||||
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.webgl.shader.Vertex);
|
||||
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';
|
||||
@@ -1,4 +1,5 @@
|
||||
//! NAMESPACE=ol.renderer.webgl.tilelayer
|
||||
//! NAMESPACE=ol.renderer.webgl.tilelayer.shader
|
||||
//! CLASS=ol.renderer.webgl.tilelayer.shader.
|
||||
|
||||
|
||||
//! COMMON
|
||||
|
||||
@@ -46,10 +46,7 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {{a_position: number,
|
||||
* a_texCoord: number,
|
||||
* u_tileOffset: WebGLUniformLocation,
|
||||
* u_texture: WebGLUniformLocation}|null}
|
||||
* @type {ol.renderer.webgl.tilelayer.shader.Locations}
|
||||
*/
|
||||
this.locations_ = null;
|
||||
|
||||
@@ -175,16 +172,8 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
|
||||
this.fragmentShader_, this.vertexShader_);
|
||||
gl.useProgram(program);
|
||||
if (goog.isNull(this.locations_)) {
|
||||
this.locations_ = {
|
||||
a_position: gl.getAttribLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.attribute.a_position),
|
||||
a_texCoord: gl.getAttribLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.attribute.a_texCoord),
|
||||
u_tileOffset: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.uniform.u_tileOffset),
|
||||
u_texture: gl.getUniformLocation(
|
||||
program, ol.renderer.webgl.tilelayer.shader.uniform.u_texture)
|
||||
};
|
||||
this.locations_ =
|
||||
new ol.renderer.webgl.tilelayer.shader.Locations(gl, program);
|
||||
}
|
||||
|
||||
mapRenderer.bindBuffer(goog.webgl.ARRAY_BUFFER, this.arrayBuffer_);
|
||||
|
||||
@@ -14,7 +14,7 @@ goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment);
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.tilelayer\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! FRAGMENT\nuniform sampler2D u_texture;\n\nvoid main(void) {\n gl_FragColor = texture2D(u_texture, v_texCoord);\n}\n\n';
|
||||
ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.tilelayer.shader\n//! CLASS=ol.renderer.webgl.tilelayer.shader.\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! FRAGMENT\nuniform sampler2D u_texture;\n\nvoid main(void) {\n gl_FragColor = texture2D(u_texture, v_texCoord);\n}\n\n';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
@@ -40,7 +40,7 @@ goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex);
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.tilelayer\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! VERTEX\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nuniform vec4 u_tileOffset;\n\nvoid main(void) {\n gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);\n v_texCoord = a_texCoord;\n}\n\n\n';
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.tilelayer.shader\n//! CLASS=ol.renderer.webgl.tilelayer.shader.\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! VERTEX\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nuniform vec4 u_tileOffset;\n\nvoid main(void) {\n gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);\n v_texCoord = a_texCoord;\n}\n\n\n';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
@@ -55,33 +55,28 @@ ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE = goog.DEBUG ?
|
||||
ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE;
|
||||
/**
|
||||
* @constructor
|
||||
* @param {WebGLRenderingContext} gl GL.
|
||||
* @param {WebGLProgram} program Program.
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.uniform = function() {};
|
||||
ol.renderer.webgl.tilelayer.shader.Locations = function(gl, program) {
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.uniform.u_tileOffset =
|
||||
goog.DEBUG ? 'u_tileOffset' : 'b';
|
||||
this.u_tileOffset = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_tileOffset' : 'b');
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.uniform.u_texture =
|
||||
goog.DEBUG ? 'u_texture' : 'c';
|
||||
this.u_texture = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? 'u_texture' : 'c');
|
||||
/**
|
||||
* @constructor
|
||||
* @type {number}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.attribute = function() {};
|
||||
this.a_position = gl.getAttribLocation(
|
||||
program, goog.DEBUG ? 'a_position' : 'c');
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
* @type {number}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.attribute.a_position =
|
||||
goog.DEBUG ? 'a_position' : 'c';
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.renderer.webgl.tilelayer.shader.attribute.a_texCoord =
|
||||
goog.DEBUG ? 'a_texCoord' : 'd';
|
||||
this.a_texCoord = gl.getAttribLocation(
|
||||
program, goog.DEBUG ? 'a_texCoord' : 'd');
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// This file is automatically generated, do not edit
|
||||
goog.provide('{{namespace}}.shader');
|
||||
goog.provide('{{namespace}}');
|
||||
|
||||
goog.require('ol.webgl.shader');
|
||||
|
||||
@@ -9,34 +9,34 @@ goog.require('ol.webgl.shader');
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Fragment}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment = function() {
|
||||
goog.base(this, {{namespace}}.shader.Fragment.SOURCE);
|
||||
{{className}}Fragment = function() {
|
||||
goog.base(this, {{className}}Fragment.SOURCE);
|
||||
};
|
||||
goog.inherits({{namespace}}.shader.Fragment, ol.webgl.shader.Fragment);
|
||||
goog.addSingletonGetter({{namespace}}.shader.Fragment);
|
||||
goog.inherits({{className}}Fragment, ol.webgl.shader.Fragment);
|
||||
goog.addSingletonGetter({{className}}Fragment);
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n{{getOriginalFragmentSource}}';
|
||||
{{className}}Fragment.DEBUG_SOURCE = 'precision mediump float;\n{{getOriginalFragmentSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;{{getFragmentSource}}';
|
||||
{{className}}Fragment.OPTIMIZED_SOURCE = 'precision mediump float;{{getFragmentSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Fragment.SOURCE = goog.DEBUG ?
|
||||
{{namespace}}.shader.Fragment.DEBUG_SOURCE :
|
||||
{{namespace}}.shader.Fragment.OPTIMIZED_SOURCE;
|
||||
{{className}}Fragment.SOURCE = goog.DEBUG ?
|
||||
{{className}}Fragment.DEBUG_SOURCE :
|
||||
{{className}}Fragment.OPTIMIZED_SOURCE;
|
||||
|
||||
|
||||
|
||||
@@ -44,63 +44,57 @@ goog.addSingletonGetter({{namespace}}.shader.Fragment);
|
||||
* @constructor
|
||||
* @extends {ol.webgl.shader.Vertex}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex = function() {
|
||||
goog.base(this, {{namespace}}.shader.Vertex.SOURCE);
|
||||
{{className}}Vertex = function() {
|
||||
goog.base(this, {{className}}Vertex.SOURCE);
|
||||
};
|
||||
goog.inherits({{namespace}}.shader.Vertex, ol.webgl.shader.Vertex);
|
||||
goog.addSingletonGetter({{namespace}}.shader.Vertex);
|
||||
goog.inherits({{className}}Vertex, ol.webgl.shader.Vertex);
|
||||
goog.addSingletonGetter({{className}}Vertex);
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex.DEBUG_SOURCE = '{{getOriginalVertexSource}}';
|
||||
{{className}}Vertex.DEBUG_SOURCE = '{{getOriginalVertexSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex.OPTIMIZED_SOURCE = '{{getVertexSource}}';
|
||||
{{className}}Vertex.OPTIMIZED_SOURCE = '{{getVertexSource}}';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
{{namespace}}.shader.Vertex.SOURCE = goog.DEBUG ?
|
||||
{{namespace}}.shader.Vertex.DEBUG_SOURCE :
|
||||
{{namespace}}.shader.Vertex.OPTIMIZED_SOURCE;
|
||||
{{className}}Vertex.SOURCE = goog.DEBUG ?
|
||||
{{className}}Vertex.DEBUG_SOURCE :
|
||||
{{className}}Vertex.OPTIMIZED_SOURCE;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @param {WebGLRenderingContext} gl GL.
|
||||
* @param {WebGLProgram} program Program.
|
||||
*/
|
||||
{{namespace}}.shader.uniform = function() {};
|
||||
{{namespace}}.Locations = function(gl, program) {
|
||||
{{#getUniforms}}
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
* @type {WebGLUniformLocation}
|
||||
*/
|
||||
{{namespace}}.shader.uniform.{{originalName}} =
|
||||
goog.DEBUG ? '{{originalName}}' : '{{shortName}}';
|
||||
this.{{originalName}} = gl.getUniformLocation(
|
||||
program, goog.DEBUG ? '{{originalName}}' : '{{shortName}}');
|
||||
{{/getUniforms}}
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
{{namespace}}.shader.attribute = function() {};
|
||||
{{#getAttributes}}
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
* @type {number}
|
||||
*/
|
||||
{{namespace}}.shader.attribute.{{originalName}} =
|
||||
goog.DEBUG ? '{{originalName}}' : '{{shortName}}';
|
||||
this.{{originalName}} = gl.getAttribLocation(
|
||||
program, goog.DEBUG ? '{{originalName}}' : '{{shortName}}');
|
||||
{{/getAttributes}}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user