| Index: canvas-webgl.html
|
| diff --git a/canvas-webgl.html b/canvas-webgl.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8279dade41150574e82391b7e3348a308ef54b81
|
| --- /dev/null
|
| +++ b/canvas-webgl.html
|
| @@ -0,0 +1,126 @@
|
| +<!DOCTYPE html>
|
| +<style>
|
| +canvas {
|
| + border: 5px solid #000;
|
| +}
|
| +</style>
|
| +<canvas id="c" width="200" height="200"></canvas>
|
| +<canvas id="c2" width="100" height="100"></canvas>
|
| +<button onclick="ofc()">ofc</button>
|
| +<script type="text/javascript">
|
| +const VERTEX_SHADER = `
|
| +precision mediump float;
|
| +attribute vec2 VertexPosition;
|
| +attribute vec2 TextureCoord;
|
| +varying highp vec2 uv;
|
| +void main(void) {
|
| + gl_Position = vec4(VertexPosition.xy, 0.0, 1.0);
|
| + uv = TextureCoord;
|
| +}
|
| +`;
|
| +
|
| +const FRAG_SHADER = `
|
| +precision mediump float;
|
| +uniform sampler2D Sampler;
|
| +varying highp vec2 uv;
|
| +void main() {
|
| + gl_FragColor = texture2D(Sampler, uv.xy);
|
| +}
|
| +`;
|
| +
|
| +function shaderProgram(gl, vs, fs) {
|
| + var prog = gl.createProgram();
|
| + var addshader = function(type, source) {
|
| + var s = gl.createShader((type == 'vertex') ?
|
| + gl.VERTEX_SHADER : gl.FRAGMENT_SHADER);
|
| + gl.shaderSource(s, source);
|
| + gl.compileShader(s);
|
| + if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {
|
| + throw "Could not compile "+type+
|
| + " shader:\n\n"+gl.getShaderInfoLog(s);
|
| + }
|
| + gl.attachShader(prog, s);
|
| + };
|
| + addshader('vertex', vs);
|
| + addshader('fragment', fs);
|
| + gl.linkProgram(prog);
|
| + if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
|
| + throw "Could not link the shader program!";
|
| + }
|
| + return prog;
|
| +}
|
| +
|
| +var gl = window.gl = document.getElementById("c").getContext("webgl");
|
| +
|
| +var PROGRAM;
|
| +var VERTEX_BUFFER;
|
| +var TEXTURE;
|
| +
|
| +function setup() {
|
| + PROGRAM = shaderProgram(gl, VERTEX_SHADER, FRAG_SHADER);
|
| + requestAnimationFrame(draw);
|
| + const DATA = [
|
| + -0.5, -0.5, 0, 0,
|
| + -0.5, 0.5, 0, 1,
|
| + 0.5, -0.5, 1, 0,
|
| + 0.5, 0.5, 1, 1,
|
| + ];
|
| +
|
| + VERTEX_BUFFER = gl.createBuffer();
|
| +
|
| + gl.bindBuffer(gl.ARRAY_BUFFER, VERTEX_BUFFER);
|
| + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(DATA), gl.STATIC_DRAW);
|
| +
|
| + TEXTURE = gl.createTexture();
|
| + gl.bindTexture(gl.TEXTURE_2D, TEXTURE);
|
| + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
| + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
| + const data = new Uint8Array([0xFF, 0x00, 0x00, 0xFF]);
|
| + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
|
| +
|
| +}
|
| +setup();
|
| +
|
| +function draw() {
|
| + gl.clearColor(0.8, 0.8, 0.8, 1);
|
| + gl.clear(gl.COLOR_BUFFER_BIT);
|
| +
|
| + gl.useProgram(PROGRAM);
|
| +
|
| + gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
| + gl.blendEquation(gl.FUNC_ADD);
|
| + gl.enable(gl.BLEND);
|
| +
|
| + gl.bindBuffer(gl.ARRAY_BUFFER, VERTEX_BUFFER);
|
| + var a = gl.getAttribLocation(PROGRAM, "VertexPosition");
|
| + gl.enableVertexAttribArray(a);
|
| + gl.vertexAttribPointer(a, 2, gl.FLOAT, false, 4*4, 0);
|
| + a = gl.getAttribLocation(PROGRAM, "TextureCoord");
|
| + gl.enableVertexAttribArray(a);
|
| + gl.vertexAttribPointer(a, 2, gl.FLOAT, false, 4*4, 2*4);
|
| +
|
| + gl.activeTexture(gl.TEXTURE0);
|
| + gl.bindTexture(gl.TEXTURE_2D, TEXTURE);
|
| + gl.uniform1i(gl.getUniformLocation(PROGRAM, "Sampler"), 0);
|
| +
|
| + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
| + requestAnimationFrame(draw);
|
| +}
|
| +
|
| +function ofc() {
|
| + var o = new OffscreenCanvas(100, 100);
|
| + var ctx = o.getContext("2d", {texture: TEXTURE});
|
| + var c2 = document.getElementById("c2").getContext("2d");
|
| +
|
| + var f = function(c) {
|
| + c.fillStyle = "Blue";
|
| + c.fillRect(0, 0, 50, 50);
|
| + }
|
| +
|
| + f(ctx);
|
| + f(c2);
|
| +}
|
| +
|
| +</script>
|
| +</body>
|
| +</html>
|
|
|