Skip to content

Instantly share code, notes, and snippets.

@mcmire
Created November 3, 2011 03:31
Show Gist options
  • Save mcmire/1335705 to your computer and use it in GitHub Desktop.
Save mcmire/1335705 to your computer and use it in GitHub Desktop.
webgl stuff
# Much of this was borrowed from:
# http://blogoben.wordpress.com/
mc = {}
gl = null
$canvas = null
_initGL = ->
canvas = $canvas[0]
gl = null
err = null
try
gl = canvas.getContext('experimental-webgl')
catch e
err = e
unless gl
throw new Error("Couldn't create WebGL context" + (if err ": #{err}" else ""))
gl.viewportWidth = canvas.width
gl.viewportHeight = canvas.height
gl.clearColor(0.0, 0.0, 0.5, 1.0); # Set clear color to black, fully opaque
# gl.enable(gl.DEPTH_TEST); # Enable depth testing
# gl.depthFunc(gl.LEQUAL); # Near things obscure far things
# gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); # Clear the color as well as the depth buffer.
gl.clear(gl.COLOR_BUFFER_BIT)
return gl
# Return a white color for any position
_createFragmentShader = ->
fshader = gl.createShader(gl.FRAGMENT_SHADER)
code = """
void main(void) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
"""
gl.shaderSource(fshader, code)
gl.compileShader(fshader)
unless gl.getShaderParameter(fshader, gl.COMPILE_STATUS)
throw new Error("Error during fragment shader compilation:\n" + gl.getShaderInfoLog(fshader))
return fshader
_createVertexShader = ->
vshader = gl.createShader(gl.VERTEX_SHADER)
code = """
attribute vec2 ppos;
void main(void) {
gl_Position = vec4(ppos.x, ppos.y, 0.0, 1.0);
}
"""
gl.shaderSource(vshader, code);
gl.compileShader(vshader)
unless gl.getShaderParameter(vshader, gl.COMPILE_STATUS)
throw new Error("Error during vertex shader compilation:\n" + gl.getShaderInfoLog(vshader))
return vshader
_createProgram = (fshader, vshader) ->
program = gl.createProgram()
gl.attachShader(program, fshader)
gl.attachShader(program, vshader)
gl.linkProgram(program)
unless gl.getProgramParameter(program, gl.LINK_STATUS)
throw new Error("Error during program linking:\n" + gl.getProgramInfoLog(program))
gl.validateProgram(program)
unless gl.getProgramParameter(program, gl.VALIDATE_STATUS)
throw new Error("Error during program validation:\n" + gl.getProgramInfoLog(program))
gl.useProgram(program)
return program
_getVertexShaderAttr = (program) ->
vattrib = gl.getAttribLocation(program, 'ppos');
if vattrib == -1
throw new Error('Error during attribute address retrieval')
gl.enableVertexAttribArray(vattrib)
return vattrib
_addVerticesToVertexShader = (vattrib, arr) ->
# Initialize the vertex buffer and set as current one
vbuffer = gl.createBuffer()
gl.bindBuffer(gl.ARRAY_BUFFER, vbuffer)
# Put vertices to buffer and link it to attribute variable 'ppos'
vertices = new Float32Array(arr);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
gl.vertexAttribPointer(vattrib, 2, gl.FLOAT, false, 0, 0);
_draw = ->
gl.drawArrays(gl.TRIANGLES, 0, 3);
gl.flush()
mc.init = ->
$canvas = $('#canvas')
_isRunning = false
gl = _initGL()
fshader = _createFragmentShader()
vshader = _createVertexShader()
program = _createProgram(fshader, vshader)
vattrib = _getVertexShaderAttr(program)
# Default camera is centered at (0,0,0) with size of 2
# So this will fill the whole viewport
_addVerticesToVertexShader(vattrib, [0.0, 0.5, -0.5, -0.5, 0.5, -0.5])
_draw()
mc.init()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment