|
import { createProgram, denullify } from './createProgram' |
|
|
|
const canvasElement = <HTMLCanvasElement> document.getElementById('canvas') |
|
|
|
const gl = getWebGLContext(canvasElement) |
|
|
|
const vs_source = denullify('shader-vs', document.getElementById('shader-vs')).innerText |
|
const fs_source = denullify('shader-fs', document.getElementById('shader-fs')).innerText |
|
const program = createProgram(gl, vs_source, fs_source) |
|
gl.useProgram(program) |
|
|
|
const size = 2.0 |
|
const vertices: number[] = [ |
|
0.0, 0.0, 0.0, // 0 center |
|
-size / 2, -size / 2, 0.0, // 1 lower left |
|
+size / 2, -size / 2, 0.0, // 2 lower right |
|
+size / 2, +size / 2, 0.0, // 3 upper right |
|
-size / 2, +size / 2, 0.0 // 4 upper left |
|
] |
|
const vbo = denullify('createBuffer', gl.createBuffer()) |
|
gl.bindBuffer(gl.ARRAY_BUFFER, vbo) |
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW) |
|
|
|
const indices = [0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1] |
|
const ibo = denullify('createBuffer', gl.createBuffer()) |
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo) |
|
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STREAM_DRAW) |
|
|
|
gl.clearColor(0.5, 0.5, 0.6, 1.0) |
|
gl.clear(gl.COLOR_BUFFER_BIT) |
|
gl.viewport(0, 0, canvasElement.width, canvasElement.height) |
|
|
|
const aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition') |
|
gl.enableVertexAttribArray(aVertexPosition) |
|
gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0) |
|
|
|
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0) |
|
|
|
function getWebGLContext(canvas: HTMLCanvasElement): WebGLRenderingContext { |
|
// Try to grab the standard context. If it fails, fallback to experimental. |
|
const context = canvas.getContext('webgl') || canvas.getContext('experimental-webgl') |
|
if (context) { |
|
return context |
|
} |
|
else { |
|
throw new Error("Unable to initialize WebGL. Your browser may not support it.") |
|
} |
|
} |