WebGL - 四角形を描く

こんにちは、Web開発者を目指す皆さん!今日は、WebGLの世界に足を踏み入れて、四角形(略して「quad」)を描く方法を学びます。プログラミングが初めての方でも心配しないでください。私は、多くの学生を助けた経験豊富な先生のように、忍耐強くそれぞれのステップをガイドします。

WebGL - Drawing a Quad

WebGLとは?

四角形を描く前に、まずWebGLとは何かを理解しましょう。WebGL(Web Graphics Library)は、Webブラウザ内で素晴らしい2Dおよび3Dグラフィックスを作成できる強力なJavaScript APIです。まるで魔法の絵の具を持って、Webページに思い思いのイメージを描けるようなものです!

四角形を描く手順

それでは、四角形を描くプロセスを管理可能なステップに分けてみましょう。家を建てることに例えると、基礎から始めて段階的に作業を進める感じです。

ステップ1: HTMLキャンバスの設定

まず、描画するキャンバスが必要です。HTMLでは<canvas>要素を使用します。これが絵を描くためのエaselのようなものです。

<canvas id="myCanvas" width="600" height="400">
あなたのブラウザはHTML5キャンバスタグをサポートしていません。
</canvas>

ステップ2: WebGLコンテキストの初期化

次に、WebGLコンテキストを取得します。これが魔法のWebGL絵の具を手に取るようなものです。

const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl');

if (!gl) {
console.log('WebGLがサポートされていません。experimental-webglにフォールバックします');
gl = canvas.getContext('experimental-webgl');
}

if (!gl) {
alert('あなたのブラウザはWebGLをサポートしていません');
}

ステップ3: ヴァーテックスシェーダーの作成

次に、ヴァーテックスシェーダーを作成します。これはWebGLに四角形の角をどこに描くかを伝えます。

const vertexShaderSource = `
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0.0, 1.0);
}
`;

const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

ステップ4: フラグメントシェーダーの作成

フラグメントシェーダーは、四角形の色を決定します。今回は明るい青色にします!

const fragmentShaderSource = `
precision mediump float;
void main() {
gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}
`;

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

ステップ5: プログラムの作成とシェーダーのリンク

次に、プログラムを作成し、シェーダーをリンクします。これが絵の具とブラシを組み合わせるようなものです。

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

ステップ6: バッファーの作成と頂点データのロード

四角形の角を定義する時がきました!

const positions = [
-0.7, -0.5,
0.7, -0.5,
0.7,  0.5,
-0.7,  0.5
];

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

ステップ7: ポジションバッファーをアトリビュートに接続

WebGLにポジションデータを読み取る方法を伝える必要があります。

const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

ステップ8: 四角形を描画

やっと描画の瞬間です。四角形を描いてみましょう!

gl.useProgram(program);
gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);

四角形を描く例

それでは、すべてを一つの完全な例にまとめてみましょう:

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebGL Quad</title>
</head>
<body>
<canvas id="myCanvas" width="600" height="400">
あなたのブラウザはHTML5キャンバスタグをサポートしていません。
</canvas>

<script>
const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl');

if (!gl) {
alert('あなたのブラウザはWebGLをサポートしていません');
}

const vertexShaderSource = `
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0.0, 1.0);
}
`;

const fragmentShaderSource = `
precision mediump float;
void main() {
gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}
`;

const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

const positions = [
-0.7, -0.5,
0.7, -0.5,
0.7,  0.5,
-0.7,  0.5
];

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

gl.useProgram(program);
gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);
</script>
</body>
</html>

これで、あなた独自のWebGL四角形が完成しました。このHTMLファイルをブラウザで開くと、キャンバス上に美しい青い四角形が表示されるはずです。

結論

初めてのWebGL四角形を描いたお祝いです!今日は多くのことをカバーしました。キャンバスの設定からシェーダーの作成、そして最終的に形を描くまでです。WebGLを学ぶことは絵を描くことと同じで、練習と忍耐が必要です。すぐに理解できない場合も、くじけずに続けてください。実験を続けることで、すぐにWeb上に素晴らしい3Dグラフィックスを作成できるようになるでしょう!

次のレッスンでは、WebGL作品にインタラクティブな要素を追加する方法を探ります。それまで、编程を楽しんでください!

Credits: Image by storyset