WebGL(2D) - 입문편 - 1일차: 선 그리기

계속 피해온 WebGL 공부를 시작했기 때문에
비망록도 겸해, 투고해 나가려고 생각합니다.

목표



WebGL(2D)로 선을 그립니다.

HTML



index.html에 canvas를 설정합니다.

index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <script src="study.js"></script>
    <title>WebGL Study</title>
</head>
<body>
<canvas id="canvas"></canvas>
</body>
</html>

WebGL 시작.



study.js
// canvas
var w = 400;
var h = 400;
var canvas = document.getElementById("canvas");
canvas.width = w;
canvas.height = h;
var gl = canvas.getContext("webgl");

좋아.
이제 WebGL을 사용할 수 있습니다! !

초기화



study.js
// clear
gl.clearColor(1.0, 1.0, 1.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

좌표 세트



canvas에서는 0.0, 0.0 가 좌상이었던 것에 대해 webgl의 좌상의 지점은 -1.0, 1.0 가 된다.
canvas에서는 높이와 가로폭이 지정한 px였지만 webgl은 모두 -1.0에서 1.0의 폭으로 고정된다.
높이와 너비는 실제 px에서 계산하고 계산해야합니다 orz


var w = 400; // 幅 
var h = 400; // 高さ

// 今いる場所 [x=-1.0, y=1.0]
// 向かいたい座標
var x = 250;
var y = 250;

// 計算して算出する
var dx = (x-(w/2))/(w/2); // dx = 0.25
var dy = -(y-(h/2))/(h/2); // dy = -0.25

그리기 전에 다양한 절차가 필요합니다.



1 - 빈 버퍼 객체 생성

study.js
var buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);

2 - 버텍스 (정점) 셰이더

study.js
var vSource = [
    "precision mediump float;",
    "attribute vec2 vertex;",
    "void main(void) {",
        "gl_Position = vec4(vertex, 0.0, 1.0);",
    "}"
].join("\n");

var vShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vShader, vSource);
gl.compileShader(vShader);
gl.getShaderParameter(vShader, gl.COMPILE_STATUS);

3 - 조각 셰이더

study.js
var rgba = [0.0, 0.0, 0.0, 1.0]; // Red, Green, Blue, Alpha
var fSource = [
    "precision mediump float;",
    "void main(void) {",
        "gl_FragColor = vec4("+ rgba.join(",") +");",
    "}"
].join("\n");

var fShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fShader, fSource);
gl.compileShader(fShader);
gl.getShaderParameter(fShader, gl.COMPILE_STATUS);

4 - 프로그램 객체 생성

study.js
var program = gl.createProgram();
gl.attachShader(program, vShader);
gl.attachShader(program, fShader);
gl.linkProgram(program);
gl.getProgramParameter(program, gl.LINK_STATUS);
gl.useProgram(program);

5 - 셰이더 측 변수를 js 측에서 수신

study.js
var vertex = gl.getAttribLocation(program, "vertex");
gl.enableVertexAttribArray(vertex);
gl.vertexAttribPointer(vertex, 2, gl.FLOAT, false, 0, 0);

6 - 좌표 설정

중심점에서 맨 오른쪽 위 지점을 설정
(이번에는 2D이므로 x와 y만으로 그리기)

study.js
// 開始座標
var x = 200; // x座標
var y = 200; // y座標

// 向かいたい座標
var dx = 400; // x座標
var dy = 0; // y座標

// 座標をセット
var vertices = [
    (x-(w/2))/(w/2), ~(y-(h/2))/(h/2),
    (dx-(w/2))/(w/2), ~(dy-(h/2))/(h/2)
];

7 - 그리기

study.js
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);
gl.drawArrays(gl.LINE_STRIP, 0, vertices.length/2);

직선을 쓰는 것인데, 이렇게 코드를 쓰지 않으면 안되는지 orz

하지만 제대로 그려지면 재미 있습니다.

비망록



WebGLStudy

좋은 웹페이지 즐겨찾기