
π index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>WebGL2 Modern Point Rendering</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<canvas id="webgl_canvas" width="512" height="512"></canvas>
<script src="point.js" defer></script>
</body>
</html>
π style.css
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
width: 100vw;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #1a1a1a;
overflow: hiddenl
}
#webgl_canvas {
display: block;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
border: 1px solid #333;
background-color: #000;
}
π point.js
window.onload = function () {
const canvas = document.getElementById("webgl_canvas");
const gl = canvas.getContext("webgl2");
if (!gl) {
alert("WebGL2λ₯Ό μ§μνμ§ μλ νκ²½μ
λλ€.");
return;
}
const vsSource = `#version 300 es
layout(location = 0) in vec2 a_position; // attribute λμ in μ¬μ©
void main(void) {
gl_Position = vec4(a_position, 0.0, 1.0);
gl_PointSize = 200.0; // μ μ ν¬κΈ° μ€μ
}`;
const fsSource = `#version 300 es
precision highp float;
out vec4 outColor; // gl_FragColor λμ μ¬μ©μ μ μ μΆλ ₯ λ³μ μ¬μ©
void main(void) {
outColor = vec4(0.0, 0.8, 1.0, 1.0); // Cyan μμ
}`;
function createShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.error("Shader Error:", gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
return null;
}
return shader;
}
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vsSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fsSource);
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.error("Program Link Error:", gl.getProgramInfoLog(program));
}
gl.useProgram(program);
const vertices = new Float32Array([0.0, 0.0]);
const vao = gl.createVertexArray();
gl.bindVertexArray(vao);
const vbo = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.bindVertexArray(vao);
gl.drawArrays(gl.POINTS, 0, 1);
};