Skip to content

Instantly share code, notes, and snippets.

@FireyFly
Created July 9, 2011 15:08
Show Gist options
  • Save FireyFly/1073645 to your computer and use it in GitHub Desktop.
Save FireyFly/1073645 to your computer and use it in GitHub Desktop.
initGL = (canvas) ->
gl = canvas.getContext 'experimental-webgl'
gl.viewportWidth = canvas.width
gl.viewportHeight = canvas.height
if not gl
throw new Error "Could not initialise WebGL :("
gl
shaders =
"fragment": """
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vColor;
void main(void) {
// gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
// gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
gl_FragColor = vColor;
}
"""
"vertex": """
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying vec4 vColor;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
}
"""
getShader = (gl, type) ->
shaderConst = (
"fragment" : gl.FRAGMENT_SHADER
"vertex" : gl.VERTEX_SHADER
)[type]
shader = gl.createShader shaderConst
gl.shaderSource shader, shaders[type]
gl.compileShader shader
if not gl.getShaderParameter shader, gl.COMPILE_STATUS
throw new Error gl.getShaderInfoLog shader
shader
mvMatrix = mat4.create()
pMatrix = mat4.create()
init = ->
canvas = document.getElementById 'canvas'
gl = initGL canvas
# ------ Initialise shaders ------
fragmentShader = getShader gl, "fragment"
vertexShader = getShader gl, "vertex"
prog = gl.createProgram()
gl.attachShader prog, vertexShader
gl.attachShader prog, fragmentShader
gl.linkProgram prog
if not gl.getProgramParameter prog, gl.LINK_STATUS
throw new Error "Could not initialise shaders"
gl.useProgram prog
prog.vertexPositionAttribute = gl.getAttribLocation prog, "aVertexPosition"
gl.enableVertexAttribArray prog.vertexPositionAttribute
prog.vertexColorAttribute = gl.getAttribLocation prog, "aVertexColor"
gl.enableVertexAttribArray prog.vertexColorAttribute
prog.pMatrixUniform = gl.getUniformLocation prog, "uPMatrix"
prog.mvMatrixUniform = gl.getUniformLocation prog, "uMVMatrix"
shaderProg = prog
#shaderProg = initShaders gl
# ------ Create buffers ------
# --- Triangle ---
trianglePosBuf = gl.createBuffer()
gl.bindBuffer gl.ARRAY_BUFFER, trianglePosBuf
vertices = [
0.0, 1.0, 0.0
-1.0, -1.0, 0.0
1.0, -1.0, 0.0
]
gl.bufferData gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW
# --- Triangle (color) ---
triangleColorBuf = gl.createBuffer()
gl.bindBuffer gl.ARRAY_BUFFER, triangleColorBuf
colors = [
1.0, 0.0, 0.0, 1.0
0.0, 1.0, 0.0, 1.0
0.0, 0.0, 1.0, 1.0
]
gl.bufferData gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW
# Assign the buffers
buffers = triangle:
position : trianglePosBuf
color : triangleColorBuf
length : 3
# ------ Prepare rendering ------
gl.clearColor 0.0, 0.0, 0.0, 1.0
gl.enable gl.DEPTH_TEST
# ------ Render scene ------
gl.viewport 0, 0, gl.viewportWidth, gl.viewportHeight
gl.clear gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT
mat4.perspective 45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix
mat4.identity mvMatrix
setMatrixUniforms = ->
gl.uniformMatrix4fv shaderProg.pMatrixUniform, false, pMatrix
gl.uniformMatrix4fv shaderProg.mvMatrixUniform, false, mvMatrix
# Draw triangle
# Note: 3 & 4 is the width of the matrix in the buffer.
mat4.translate mvMatrix, [-1.5, 0.0, -7.0]
gl.bindBuffer gl.ARRAY_BUFFER, buffers.triangle.position
gl.vertexAttribPointer shaderProg.vertexPositionAttribute,
3, gl.FLOAT, false, 0, 0
gl.bindBuffer gl.ARRAY_BUFFER, buffers.triangle.color
gl.vertexAttribPointer shaderProg.vertexColorAttribute,
4, gl.FLOAT, false, 0, 0
setMatrixUniforms()
gl.drawArrays gl.TRIANGLES, 0, buffers.triangle.length
window.addEventListener 'load', init, false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment