Skip to content

Commit 85a3830

Browse files
committed
Shader resource creation added to webgl renderer
1 parent d34a325 commit 85a3830

22 files changed

Lines changed: 335 additions & 183 deletions

v3/src/renderer/webgl/WebGLRenderer.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var AAQuadBatch = require('./batches/aaquad/AAQuadBatch');
1313
var SpriteBatch = require('./batches/sprite/SpriteBatch');
1414
var ShapeBatch = require('./batches/shape/ShapeBatch');
1515
var BlendModes = require('../BlendModes');
16+
var Shader = require('./utils/shader/Shader');
1617

1718
var WebGLRenderer = function (game)
1819
{
@@ -52,6 +53,8 @@ var WebGLRenderer = function (game)
5253
this.shapeBatch = null;
5354
this.batch = null;
5455
this.currentTexture2D = null;
56+
this.shaderCache = {};
57+
this.currentShader = null;
5558

5659
this.init();
5760
};
@@ -376,6 +379,73 @@ WebGLRenderer.prototype = {
376379
gl.bindTexture(gl.TEXTURE_2D, this.currentTexture2D);
377380

378381
return dstTexture;
382+
},
383+
384+
createShader: function (shaderName, shaderSources)
385+
{
386+
if (!(shaderName in this.shaderCache))
387+
{
388+
var gl = this.gl;
389+
var program = gl.createProgram();
390+
var vertShader = gl.createShader(gl.VERTEX_SHADER);
391+
var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
392+
var error;
393+
var shader;
394+
395+
gl.shaderSource(vertShader, shaderSources.vert);
396+
gl.shaderSource(fragShader, shaderSources.frag);
397+
398+
gl.compileShader(vertShader);
399+
gl.compileShader(fragShader);
400+
401+
error = gl.getShaderInfoLog(vertShader);
402+
403+
if (error.length > 0)
404+
{
405+
throw new Error('Vertex Shader Compilation Error.\n' + error);
406+
}
407+
408+
error = gl.getShaderInfoLog(fragShader);
409+
410+
if (error.length > 0)
411+
{
412+
throw new Error('Fragment Shader Compilation Error.\n' + error);
413+
}
414+
415+
gl.attachShader(program, vertShader);
416+
gl.attachShader(program, fragShader);
417+
gl.linkProgram(program);
418+
419+
error = gl.getProgramParameter(program, gl.LINK_STATUS);
420+
421+
if (error === 0)
422+
{
423+
error = gl.getProgramInfoLog(program);
424+
425+
throw new Error('Program Linking Error.\n' + error);
426+
}
427+
428+
shader = new Shader(shaderName, gl, program, vertShader, fragShader);
429+
this.shaderCache[shaderName] = shader;
430+
return shader;
431+
}
432+
return this.shaderCache[shaderName];
433+
},
434+
deleteShader: function (shader)
435+
{
436+
var storedShader = this.shaderCache[shader.name]
437+
var gl = this.gl;
438+
if (storedShader !== undefined)
439+
{
440+
delete this.shaderCache;
441+
}
442+
gl.deleteShader(shader.vertexShader);
443+
gl.deleteShader(shader.fragmentShader);
444+
gl.deleteProgram(shader.program);
445+
shader.vertexShader = null;
446+
shader.fragmentShader = null;
447+
shader.program = null;
448+
shader.name = null;
379449
}
380450
};
381451

v3/src/renderer/webgl/batches/aaquad/AAQuadBatch.js

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var CreateAttribDesc = require('../../utils/vao/CreateAttribDesc');
66
var Buffer32 = require('../../utils/buffer/Buffer32');
77
var Buffer16 = require('../../utils/buffer/Buffer16');
88
var VertexArray = require('../../utils/vao/VertexArray');
9+
var UntexturedAndTintedShader = require('../../shaders/UntexturedAndTintedShader');
910

1011
var PHASER_CONST = require('../../../../const');
1112
var CONST = require('./const');
@@ -20,9 +21,7 @@ var AAQuadBatch = function (game, gl, manager)
2021
this.height = game.config.height * game.config.resolution;
2122
this.glContext = gl;
2223
this.maxQuads = null;
23-
this.vertShader = null;
24-
this.fragShader = null;
25-
this.program = null;
24+
this.shader = null;
2625
this.vertexArray = null;
2726
this.indexBufferObject = null;
2827
this.vertexDataBuffer = null;
@@ -61,24 +60,20 @@ AAQuadBatch.prototype = {
6160

6261
var vertexDataBuffer = new Buffer32(CONST.VERTEX_SIZE * CONST.AAQUAD_VERTEX_COUNT * CONST.MAX_AAQUAD);
6362
var indexDataBuffer = new Buffer16(CONST.INDEX_SIZE * CONST.AAQUAD_INDEX_COUNT * CONST.MAX_AAQUAD);
64-
var vertShader = CreateShader(gl, CONST.VERTEX_SHADER_SOURCE, gl.VERTEX_SHADER);
65-
var fragShader = CreateShader(gl, CONST.FRAGMENT_SHADER_SOURCE, gl.FRAGMENT_SHADER);
66-
var program = CreateProgram(gl, vertShader, fragShader);
63+
var shader = this.manager.createShader('UntexturedAndTintedShader', UntexturedAndTintedShader);
6764
var indexBufferObject = CreateBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, gl.STATIC_DRAW, null, indexDataBuffer.getByteCapacity());
6865
var attribArray = [
69-
CreateAttribDesc(gl, program, 'a_position', 2, gl.FLOAT, false, CONST.VERTEX_SIZE, 0),
70-
CreateAttribDesc(gl, program, 'a_color', 4, gl.FLOAT, false, CONST.VERTEX_SIZE, 8)
66+
CreateAttribDesc(gl, shader.program, 'a_position', 2, gl.FLOAT, false, CONST.VERTEX_SIZE, 0),
67+
CreateAttribDesc(gl, shader.program, 'a_color', 4, gl.FLOAT, false, CONST.VERTEX_SIZE, 8)
7168
];
7269
var vertexArray = new VertexArray(CreateBuffer(gl, gl.ARRAY_BUFFER, gl.STREAM_DRAW, null, vertexDataBuffer.getByteCapacity()), attribArray);
73-
var viewMatrixLocation = gl.getUniformLocation(program, 'u_view_matrix');
70+
var viewMatrixLocation = gl.getUniformLocation(shader.program, 'u_view_matrix');
7471
var indexBuffer = indexDataBuffer.uintView;
7572
var max = CONST.MAX_AAQUAD * CONST.AAQUAD_INDEX_COUNT;
7673

7774
this.vertexDataBuffer = vertexDataBuffer;
7875
this.indexDataBuffer = indexDataBuffer;
79-
this.vertShader = vertShader;
80-
this.fragShader = fragShader;
81-
this.program = program;
76+
this.shader = shader;
8277
this.indexBufferObject = indexBufferObject;
8378
this.vertexArray = vertexArray;
8479
this.viewMatrixLocation = viewMatrixLocation;
@@ -150,8 +145,14 @@ AAQuadBatch.prototype = {
150145
{
151146
var gl = this.glContext;
152147

153-
gl.useProgram(this.program);
148+
gl.useProgram(this.shader.program);
154149
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBufferObject);
150+
this.bindVertexAttributes();
151+
},
152+
153+
bindVertexAttributes: function ()
154+
{
155+
var gl = this.glContext;
155156
BindVertexArray(gl, this.vertexArray);
156157
},
157158

@@ -201,9 +202,7 @@ AAQuadBatch.prototype = {
201202

202203
if (gl)
203204
{
204-
gl.deleteShader(this.vertShader);
205-
gl.deleteShader(this.fragShader);
206-
gl.deleteProgram(this.program);
205+
this.manager.deleteShader(this.shader);
207206
gl.deleteBuffer(this.indexBufferObject);
208207
gl.deleteBuffer(this.vertexArray.buffer);
209208
}

v3/src/renderer/webgl/batches/aaquad/FragmentShader.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

v3/src/renderer/webgl/batches/aaquad/VertexShader.js

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
var FragmentShader = require('./FragmentShader');
2-
var VertexShader = require('./VertexShader');
3-
41
var CONST = {
52

63
// VERTEX_SIZE = sizeof(vec2) + sizeof(vec4)
@@ -13,9 +10,6 @@ var CONST = {
1310
AAQUAD_VERTEX_COMPONENT_COUNT: 6,
1411
MAX_AAQUAD: 2000,
1512

16-
VERTEX_SHADER_SOURCE: VertexShader,
17-
FRAGMENT_SHADER_SOURCE: FragmentShader
18-
1913
};
2014

2115
module.exports = CONST;

v3/src/renderer/webgl/batches/blitter/BlitterBatch.js

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var CreateAttribDesc = require('../../utils/vao/CreateAttribDesc');
88
var Buffer32 = require('../../utils/buffer/Buffer32');
99
var Buffer16 = require('../../utils/buffer/Buffer16');
1010
var VertexArray = require('../../utils/vao/VertexArray');
11+
var TexturedAndAlphaShader = require('../../shaders/TexturedAndAlphaShader');
1112

1213
var PHASER_CONST = require('../../../../const');
1314
var CONST = require('./const');
@@ -22,9 +23,7 @@ var BlitterBatch = function (game, gl, manager)
2223
this.height = game.config.height * game.config.resolution;
2324
this.glContext = gl;
2425
this.maxParticles = null;
25-
this.vertShader = null;
26-
this.fragShader = null;
27-
this.program = null;
26+
this.shader = null;
2827
this.vertexArray = null;
2928
this.indexBufferObject = null;
3029
this.vertexDataBuffer = null;
@@ -64,25 +63,21 @@ BlitterBatch.prototype = {
6463

6564
var vertexDataBuffer = new Buffer32(CONST.VERTEX_SIZE * CONST.PARTICLE_VERTEX_COUNT * CONST.MAX_PARTICLES);
6665
var indexDataBuffer = new Buffer16(CONST.INDEX_SIZE * CONST.PARTICLE_INDEX_COUNT * CONST.MAX_PARTICLES);
67-
var vertShader = CreateShader(gl, CONST.VERTEX_SHADER_SOURCE, gl.VERTEX_SHADER);
68-
var fragShader = CreateShader(gl, CONST.FRAGMENT_SHADER_SOURCE, gl.FRAGMENT_SHADER);
69-
var program = CreateProgram(gl, vertShader, fragShader);
66+
var shader = this.manager.createShader('TexturedAndAlphaShader', TexturedAndAlphaShader);
7067
var indexBufferObject = CreateBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, gl.STATIC_DRAW, null, indexDataBuffer.getByteCapacity());
7168
var attribArray = [
72-
CreateAttribDesc(gl, program, 'a_position', 2, gl.FLOAT, false, CONST.VERTEX_SIZE, 0),
73-
CreateAttribDesc(gl, program, 'a_tex_coord', 2, gl.FLOAT, false, CONST.VERTEX_SIZE, 8),
74-
CreateAttribDesc(gl, program, 'a_alpha', 1, gl.FLOAT, false, CONST.VERTEX_SIZE, 16)
69+
CreateAttribDesc(gl, shader.program, 'a_position', 2, gl.FLOAT, false, CONST.VERTEX_SIZE, 0),
70+
CreateAttribDesc(gl, shader.program, 'a_tex_coord', 2, gl.FLOAT, false, CONST.VERTEX_SIZE, 8),
71+
CreateAttribDesc(gl, shader.program, 'a_alpha', 1, gl.FLOAT, false, CONST.VERTEX_SIZE, 16)
7572
];
7673
var vertexArray = new VertexArray(CreateBuffer(gl, gl.ARRAY_BUFFER, gl.STREAM_DRAW, null, vertexDataBuffer.getByteCapacity()), attribArray);
77-
var viewMatrixLocation = gl.getUniformLocation(program, 'u_view_matrix');
74+
var viewMatrixLocation = gl.getUniformLocation(shader.program, 'u_view_matrix');
7875
var indexBuffer = indexDataBuffer.uintView;
7976
var max = CONST.MAX_PARTICLES * CONST.PARTICLE_INDEX_COUNT;
8077

8178
this.vertexDataBuffer = vertexDataBuffer;
8279
this.indexDataBuffer = indexDataBuffer;
83-
this.vertShader = vertShader;
84-
this.fragShader = fragShader;
85-
this.program = program;
80+
this.shader = shader;
8681
this.indexBufferObject = indexBufferObject;
8782
this.vertexArray = vertexArray;
8883
this.viewMatrixLocation = viewMatrixLocation;
@@ -116,8 +111,14 @@ BlitterBatch.prototype = {
116111
{
117112
var gl = this.glContext;
118113

119-
gl.useProgram(this.program);
114+
gl.useProgram(this.shader.program);
120115
gl.clearColor(0, 0, 0, 1);
116+
this.bindVertexAttributes();
117+
},
118+
119+
bindVertexAttributes: function ()
120+
{
121+
var gl = this.glContext;
121122
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBufferObject);
122123
BindVertexArray(gl, this.vertexArray);
123124
},
@@ -168,9 +169,7 @@ BlitterBatch.prototype = {
168169

169170
if (gl)
170171
{
171-
gl.deleteShader(this.vertShader);
172-
gl.deleteShader(this.fragShader);
173-
gl.deleteProgram(this.program);
172+
this.manager.deleteShader(this.shader);
174173
gl.deleteBuffer(this.indexBufferObject);
175174
gl.deleteBuffer(this.vertexArray.buffer);
176175
}

v3/src/renderer/webgl/batches/blitter/FragmentShader.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

v3/src/renderer/webgl/batches/blitter/VertexShader.js

Lines changed: 0 additions & 13 deletions
This file was deleted.

v3/src/renderer/webgl/batches/blitter/const.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
var FragmentShader = require('./FragmentShader');
2-
var VertexShader = require('./VertexShader');
3-
41
var CONST = {
52

63
// VERTEX_SIZE = sizeof(vec2) + sizeof(vec2) + sizeof(float)
@@ -15,9 +12,6 @@ var CONST = {
1512
// Can't be bigger than 10,000 since index are 16-bit
1613
MAX_PARTICLES: 2000,
1714

18-
VERTEX_SHADER_SOURCE: VertexShader,
19-
FRAGMENT_SHADER_SOURCE: FragmentShader
20-
2115
};
2216

2317
module.exports = CONST;

v3/src/renderer/webgl/batches/shape/FragmentShader.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)