On Github Smotko / webgl-talk-cyberpipe
Anže Pečar / @smotko http://smotko.si/ freenode: #psywerx
Source: http://caniuse.com/webgl
Not all graphics cards are fully supported
--ignore-gpu-blacklistNo fillRect function! Instead:
Get WebGL context Setup shaders Create buffer Draw two trianglesvar canvas = document.getElementById("canvas"); var gl = canvas.getContext("experimental-webgl")
<script id="2d-vertex" type="x-shader/x-vertex"> attribute vec2 a_position; void main() { gl_Position = vec4(a_position, 0, 1); } </script> <script id="2d-fragment" type="x-shader/x-fragment"> void main() { gl_FragColor = vec4(0,1,0,1); // green } </script>
var program = gl.createProgram(); var vshader = createShader(vstr, gl.VERTEX_SHADER); var fshader = createShader(fstr, gl.FRAGMENT_SHADER); gl.attachShader(program, vshader); gl.attachShader(program, fshader); gl.linkProgram(program); gl.useProgram(program); // look up where the vertex data needs to go. var positionLocation = gl.getAttribLocation(program, "a_position");
function createShader(str, type) { var shader = gl.createShader(type); gl.shaderSource(shader, str); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { throw gl.getShaderInfoLog(shader); } return shader; }
// Create a buffer and put a single clipspace rectangle in // it (2 triangles) var buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.bufferData( gl.ARRAY_BUFFER, new Float32Array([ -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]), gl.STATIC_DRAW); gl.enableVertexAttribArray(positionLocation); gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLES, 0, 6);
[-1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
With the power of linear algebra!
Perspective Projection:
var view = mat4.frustum(left, right, top, bottom, near, far); var camera = mat4.lookAt([0,0,-3], [0,0,0], [0,1,0]);
gl_Position = view * camera * a_position;
var model = mat4.identity(); mat4.translate(model, [x,y,z]); mat4.rotate(model, angle, [x, y, z]); mat4.scale(model, [x, y, z]);
gl_Position = view * camera * model * a_position;
var texture = gl.createTexture(); texture.image = image; gl.pixelStorei(gl.UNPACK_ALIGNMENT, true); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); gl.generateMipmap(gl.TEXTURE_2D); gl.bindTexture(gl.TEXTURE_2D, null);
uniform sampler2D s_texture; varying vec2 v_uvCoord; gl_FragColor = texture2D(s_texture, v_uvCoord.st);
No easy way to draw text with WebGL
We use a texture sprite:
Can make your life much easier.
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); var geometry = new THREE.CubeGeometry(1,1,1); var material = new THREE.MeshBasicMaterial({color: 0x00ff00}); var cube = new THREE.Mesh(geometry, material); scene.add(cube); camera.position.z = 5; function render() { requestAnimationFrame(render); cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); } render();
[TODO]