Created
July 9, 2011 15:08
-
-
Save FireyFly/1073645 to your computer and use it in GitHub Desktop.
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
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