Last active
September 4, 2015 22:14
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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