Merge pull request #506 from twpayne/refactor-webgl-shaders

Refactor WebGL shaders
This commit is contained in:
Tom Payne
2013-04-08 11:11:47 -07:00
10 changed files with 359 additions and 250 deletions

View File

@@ -1,4 +1,5 @@
//! NAMESPACE=ol.renderer.webgl.map
//! NAMESPACE=ol.renderer.webgl.map.shader.Color
//! CLASS=ol.renderer.webgl.map.shader.Color
//! COMMON

View 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');
};

View 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;
}

View 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');
};

View File

@@ -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_) {

View File

@@ -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';

View File

@@ -1,4 +1,5 @@
//! NAMESPACE=ol.renderer.webgl.tilelayer
//! NAMESPACE=ol.renderer.webgl.tilelayer.shader
//! CLASS=ol.renderer.webgl.tilelayer.shader.
//! COMMON

View File

@@ -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_);

View File

@@ -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');
};

View File

@@ -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}}
};