計算機科学のブログ

マルチメディアを学ぶ WebGL、ダブルバッファリング、画像、形式、ビットマップ

ハンズオンJavaScript (あんどうやすし(著)、オライリー・ジャパン)の15章(マルチメディアを学ぶ)、15.9(練習問題)の15-4の解答を求めてみる。

コード

let jscanvas = document.querySelector('#jscanvas'),
    offscreen = new OffscreenCanvas(jscanvas.width, jscanvas.height),
    gl = offscreen.getContext('webgl'),
    vertices = [
        -0.5, 0.5,
        -0.5, -0.5,
        0.5, -0.5
    ],
    vertexBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, null);

let vertexCode = `
  attribute vec2 coordinates;
  void main(void) {
    gl_Position = vec4(coordinates, 0., 1.);
  }
`,
    vertexShader = gl.createShader(gl.VERTEX_SHADER);

gl.shaderSource(vertexShader, vertexCode);
gl.compileShader(vertexShader);

let fragmentCode = `
  void main(void) {
      gl_FragColor = vec4(1., 1., 1., 1.);
  }
`,
    fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);

gl.shaderSource(fragmentShader, fragmentCode);
gl.compileShader(fragmentShader);

let shaderProgram = gl.createProgram();

gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram);

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);

let coordinates = gl.getAttribLocation(shaderProgram, 'coordinates');

gl.vertexAttribPointer(coordinates, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(coordinates);

gl.clearColor(0., 0., 0., 1.);
gl.enable(gl.DEPTH_TEST);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.viewport(0, 0, jscanvas.width, jscanvas.height);
gl.drawArrays(gl.TRIANGLES, 0, 3);

let ctx = jscanvas.getContext('bitmaprenderer'),
    bitmap = offscreen.transferToImageBitmap();

ctx.transferFromImageBitmap(bitmap);