Skip to content

Instantly share code, notes, and snippets.

@gre
Last active September 4, 2015 22:14
Show Gist options
  • Save gre/c604caccb652f62113a9 to your computer and use it in GitHub Desktop.
Save gre/c604caccb652f62113a9 to your computer and use it in GitHub Desktop.
minimal survival kit WebGL code for doing JS13K stuff with multiple shaders and a canvas2d
// DISCLAIMER: this example is not complete. just showing some synthax
var laserShader = glCreateShader( STATIC_VERT, LASER_FRAG);
gl.uniform2f(glUniformLocation(laserShader, "dim"), W, H);
var laserFbo = glCreateFBO();
var textureGame = glCreateTexture();
gl.viewport(0, 0, W, H);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
glSetTexture(textureGame, canvas);
glBindFBO(laserFbo);
glBindShader(laserShader);
gl.uniform1i(glUniformLocation(laserShader, "t"), glBindTexture(textureGame, 0));
gl.drawArrays(gl.TRIANGLES, 0, 6);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
glBindShader(gameShader);
gl.uniform1i(glUniformLocation(gameShader, "g"), glBindTexture(glGetFBOTexture(laserFbo), 0));
gl.uniform1i(glUniformLocation(gameShader, "r"), glBindTexture(glGetFBOTexture(persistenceFbo), 1));
gl.uniform1i(glUniformLocation(gameShader, "b"), glBindTexture(glGetFBOTexture(fbo2), 2));
gl.uniform1i(glUniformLocation(gameShader, "l"), glBindTexture(glGetFBOTexture(glareFbo), 3));
gl.uniform1i(glUniformLocation(gameShader, "e"), glBindTexture(glGetFBOTexture(playerFbo), 4));
gl.drawArrays(gl.TRIANGLES, 0, 6);
/* global gl, W, H */
function glCreateShader (vert, frag) {
var handle, type = gl.VERTEX_SHADER, src = vert;
handle = gl.createShader(type);
gl.shaderSource(handle, src);
gl.compileShader(handle);
var vertex = handle;
type = gl.FRAGMENT_SHADER;
src = frag;
handle = gl.createShader(type);
gl.shaderSource(handle, src);
gl.compileShader(handle);
var fragment = handle;
var program = gl.createProgram();
gl.attachShader(program, vertex);
gl.attachShader(program, fragment);
gl.linkProgram(program);
gl.useProgram(program);
var p = gl.getAttribLocation(program, "p");
gl.enableVertexAttribArray(p);
gl.vertexAttribPointer(p, 2, gl.FLOAT, false, 0, 0);
return [program];
}
function glBindShader (shader) {
gl.useProgram(shader[0]);
}
function glUniformLocation(shader, name) {
return shader[name] || (shader[name] = gl.getUniformLocation(shader[0], name));
}
function glCreateTexture () {
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
return tex;
}
function glSetTexture (t, value) {
gl.bindTexture(gl.TEXTURE_2D, t);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, value);
}
function glBindTexture (t, unit) {
gl.activeTexture(gl.TEXTURE0 + unit);
gl.bindTexture(gl.TEXTURE_2D, t);
return unit;
}
function glCreateFBO () {
var handle = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, handle);
var color = glCreateTexture();
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, W, H, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, color, 0);
return [handle, color];
}
function glBindFBO (fbo) {
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo[0]);
}
function glGetFBOTexture (fbo) {
return fbo[1];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment