🧱 Boilerplate : Mint Point

BamgasiJMΒ·2026λ…„ 6μ›” 26일

WebGL

λͺ©λ‘ 보기
1/14
post-thumbnail

πŸ“ 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>
        <!--WebGL λ Œλ”λ§μ„ μœ„ν•œ μΊ”λ²„μŠ€-->
        <canvas id="webgl_canvas" width="512" height="512"></canvas>

        <!--WebGL λ‘œμ§μ„ 담은 슀크립트 파일-->
        <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

/**
 * ============================================================================
 * [WebGL2 Modern Point Rendering]
 * - WebGL 1.0 (attribute, gl_FragColor) -> WebGL 2.0 (in, out, layout)
 * - VAO(Vertex Array Object) 적용
 * ============================================================================
 */

// window.onload : λͺ¨λ“  λ¦¬μ†ŒμŠ€(이미지, CSS λ“±) λ‘œλ“œ μ™„λ£Œ ν›„ μ‹€ν–‰. κ°€μž₯ λŠ¦μ§€λ§Œ κ°€μž₯ μ•ˆμ „ν•¨.
window.onload = function () {
  // 1. μ»¨ν…μŠ€νŠΈ 생성 (WebGL2 λͺ…μ‹œ)
  const canvas = document.getElementById("webgl_canvas");
  const gl = canvas.getContext("webgl2");

  if (!gl) {
    alert("WebGL2λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” ν™˜κ²½μž…λ‹ˆλ‹€.");
    return;
  }

  // --- [2. 셰이더 μ†ŒμŠ€ μ½”λ“œ μ •μ˜ (GLSL 3.00 es)] ---

  // Vertex Shader: 점의 μœ„μΉ˜μ™€ 크기λ₯Ό κ²°μ •
  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; // 점의 크기 μ„€μ •
        }`;

  // Fragment Shader: 점의 색상을 κ²°μ •
  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 색상
        }`;

  // --- [3. 셰이더 컴파일 및 ν”„λ‘œκ·Έλž¨ 생성 ν•¨μˆ˜] ---

  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);

  // --- [4. 버퍼 및 VAO(Vertex Array Object) μ„€μ •] ---

  // 데이터 μ€€λΉ„: 쀑심점 (0.0, 0.0)
  const vertices = new Float32Array([0.0, 0.0]);

  // VAO 생성 및 바인딩 (WebGL2의 핡심: μƒνƒœ μ €μž₯)
  const vao = gl.createVertexArray();
  gl.bindVertexArray(vao);

  // VBO 생성 및 데이터 ν• λ‹Ή
  const vbo = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

  // Vertex Attribute μ„€μ • (layout(location=0)κ³Ό λ§€μΉ­)
  gl.enableVertexAttribArray(0);
  gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);

  // --- [5. λ Œλ”λ§ μ‹€ν–‰] ---

  // 배경색 μ„€μ • (검은색)
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);

  // VAO 바인딩 ν›„ 그리기 λͺ…λ Ή μˆ˜ν–‰
  gl.bindVertexArray(vao);
  // gl.POINTS λͺ¨λ“œλ‘œ 정점 개수(1개)만큼 그리기
  gl.drawArrays(gl.POINTS, 0, 1);
};

profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0개의 λŒ“κΈ€