gl.clear(), gl.createBuffer(), gl.bindBuffer()μ κ°μ΄ gl. λ€μ μ€λ μ΄λ¦λ€μ WebGL2 APIκ° μ 곡νλ νμ€ λ©μλ(Methods)μ μμ(Constants)μ
λλ€. WebGL νλ‘κ·Έλλ°μ μ²μ μ νλ©΄ ν¨μμ μμκ° λ€μμ¬ λ³΄μ΄κΈ° μ½μ§λ§, μ΄ λμ μν μ ꡬλΆνλ©΄ WebGLμ μν κΈ°λ°(State Machine) ꡬ쑰λ₯Ό ν¨μ¬ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
gl.clear(), gl.drawArrays()μ²λΌ μλ¬Έμλ‘ μμνλ©° κ΄νΈ ()κ° λΆλ κ²λ€μ WebGL 컨ν
μ€νΈκ° μνν λμμ λνλ΄λ λ©μλμ
λλ€.
λ©μλλ CPUμμ GPUλ‘ μ λ¬λλ λͺ λ Ή(Command)μ΄λΌκ³ λ³Ό μ μμ΅λλ€.
()λ₯Ό κ°μ§λ€.gl.clear(...);
gl.useProgram(...);
gl.bindBuffer(...);
gl.drawArrays(...);
| λ©μλ | μν |
|---|---|
gl.clear() | λ²νΌ μ΄κΈ°ν |
gl.viewport() | λ λλ§ μμ μ€μ |
gl.createBuffer() | λ²νΌ κ°μ²΄ μμ± |
gl.bindBuffer() | λ²νΌ λ°μΈλ© |
gl.bufferData() | λ²νΌ λ°μ΄ν° μ λ‘λ |
gl.createShader() | μ °μ΄λ κ°μ²΄ μμ± |
gl.shaderSource() | μ °μ΄λ μμ€ μ§μ |
gl.compileShader() | μ °μ΄λ μ»΄νμΌ |
gl.createProgram() | νλ‘κ·Έλ¨ κ°μ²΄ μμ± |
gl.linkProgram() | νλ‘κ·Έλ¨ λ§ν¬ |
gl.useProgram() | νλ‘κ·Έλ¨ νμ±ν |
gl.enableVertexAttribArray() | μ μ μμ± νμ±ν |
gl.vertexAttribPointer() | μ μ λ°μ΄ν° νμ μ§μ |
gl.drawArrays() | μ μ λ°μ΄ν° λ λλ§ |
gl.drawElements() | μΈλ±μ€ κΈ°λ° λ λλ§ |
gl.COLOR_BUFFER_BIT, gl.ARRAY_BUFFER, gl.STATIC_DRAWμ²λΌ λͺ¨λ λλ¬Έμλ‘ μμ±λ κ°λ€μ WebGLμ΄ λ―Έλ¦¬ μ μν μμμ
λλ€.
μμλ μ«μκ°μ΄μ§λ§, νλ‘κ·Έλλ¨Έκ° μ΄ν΄νκΈ° μ½λλ‘ μ΄λ¦μ΄ λΆμ΄ μμ΅λλ€.
μλ₯Ό λ€μ΄:
console.log(gl.COLOR_BUFFER_BIT);
μ€μ λ‘λ λ€μκ³Ό κ°μ μ«μκ° μΆλ ₯λ©λλ€.
16384
κ·Έλ¬λ μ½λμμ μ«μλ₯Ό μ§μ μ¬μ©νλ λμ μλ―Έ μλ μ΄λ¦μ μ¬μ©νλ κ²μ΄ κ°λ μ±κ³Ό μ μ§λ³΄μμ± μΈ‘λ©΄μμ ν¨μ¬ μ 리ν©λλ€.
gl.μ λΆμ΄λκ°?const gl = canvas.getContext("webgl2");
glμ WebGL2 λ λλ§ μ»¨ν
μ€νΈ κ°μ²΄μ
λλ€.
μ΄ κ°μ²΄ λ΄λΆμλ μλ°± κ°μ λ©μλμ μμκ° ν¬ν¨λμ΄ μμ΅λλ€.
gl.clear(...)
gl.drawArrays(...)
gl.COLOR_BUFFER_BIT
μ΄λ λͺ¨λ gl κ°μ²΄ λ΄λΆμ μν λ©€λ²μ
λλ€.
κ°μ²΄ μ§ν₯ κ΄μ μμ 보면 λ€μκ³Ό κ°μ΄ μ΄ν΄ν μ μμ΅λλ€.
gl : WebGL2 μμ€ν
clear() : μμ€ν
μ΄ μνν κΈ°λ₯COLOR_BUFFER_BIT : μμ€ν
μ΄ μ 곡νλ μ€μ κ°μ¦,
"WebGL μμ€ν (gl) μμ clear κΈ°λ₯μ νΈμΆνλ€."
λΌλ μλ―Έμ λλ€.
νλ©΄μ μ§μΈ λ μ¬μ©ν λ°°κ²½μμ μ§μ ν©λλ€.
gl.clearColor(0.0, 0.0, 0.0, 1.0);
λ²νΌλ₯Ό μ΄κΈ°νν©λλ€.
gl.clear(gl.COLOR_BUFFER_BIT);
λ λλ§ μμμ μ§μ ν©λλ€.
gl.viewport(0, 0, canvas.width, canvas.height);
GPU λ²νΌ κ°μ²΄λ₯Ό μμ±ν©λλ€.
const buffer = gl.createBuffer();
νμ¬ μμ ν λ²νΌλ₯Ό μ νν©λλ€.
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
λ²νΌμ λ°μ΄ν°λ₯Ό μ λ‘λν©λλ€.
gl.bufferData(
gl.ARRAY_BUFFER,
vertices,
gl.STATIC_DRAW
);
μ °μ΄λ κ°μ²΄λ₯Ό μμ±ν©λλ€.
const shader = gl.createShader(gl.VERTEX_SHADER);
GLSL μ½λλ₯Ό μ λ¬ν©λλ€.
gl.shaderSource(shader, source);
μ °μ΄λλ₯Ό μ»΄νμΌν©λλ€.
gl.compileShader(shader);
μ °μ΄λ νλ‘κ·Έλ¨μ μμ±ν©λλ€.
const program = gl.createProgram();
μ °μ΄λλ₯Ό νλ‘κ·Έλ¨μ μ°κ²°ν©λλ€.
gl.attachShader(program, vertexShader);
μ °μ΄λλ€μ νλμ νλ‘κ·Έλ¨μΌλ‘ λ§ν¬ν©λλ€.
gl.linkProgram(program);
νμ¬ μ¬μ©ν νλ‘κ·Έλ¨μ μ§μ ν©λλ€.
gl.useProgram(program);
μ μ μμ±μ μμΉλ₯Ό κ°μ Έμ΅λλ€.
const positionLoc =
gl.getAttribLocation(program, "aPosition");
μ μ μμ±μ νμ±νν©λλ€.
gl.enableVertexAttribArray(positionLoc);
λ²νΌ λ°μ΄ν°μ ꡬ쑰λ₯Ό μ μν©λλ€.
gl.vertexAttribPointer(
positionLoc,
3,
gl.FLOAT,
false,
0,
0
);
μμ°¨μ μΌλ‘ μ μ μ 그립λλ€.
gl.drawArrays(gl.TRIANGLES, 0, 3);
μΈλ±μ€ λ²νΌλ₯Ό μ¬μ©νμ¬ κ·Έλ¦½λλ€.
gl.drawElements(
gl.TRIANGLES,
indexCount,
gl.UNSIGNED_SHORT,
0
);
| μμ | μλ―Έ |
|---|---|
gl.ARRAY_BUFFER | μ μ λ²νΌ |
gl.ELEMENT_ARRAY_BUFFER | μΈλ±μ€ λ²νΌ |
gl.UNIFORM_BUFFER | Uniform λ²νΌ |
gl.TRANSFORM_FEEDBACK_BUFFER | Transform Feedback λ²νΌ |
| μμ | μλ―Έ |
|---|---|
gl.STATIC_DRAW | ν λ² μ λ‘λ ν μ¬λ¬ λ² μ¬μ© |
gl.DYNAMIC_DRAW | μμ£Ό λ³κ²½ |
gl.STREAM_DRAW | λ§€ νλ μ λ³κ²½ |
| μμ | μλ―Έ |
|---|---|
gl.VERTEX_SHADER | λ²ν μ€ μ °μ΄λ |
gl.FRAGMENT_SHADER | νλκ·Έλ¨ΌνΈ μ °μ΄λ |
| μμ | μλ―Έ |
|---|---|
gl.FLOAT | 32λΉνΈ μ€μ |
gl.INT | μ μ |
gl.UNSIGNED_SHORT | 16λΉνΈ λΆνΈ μλ μ μ |
gl.UNSIGNED_INT | 32λΉνΈ λΆνΈ μλ μ μ |
| μμ | μλ―Έ |
|---|---|
gl.POINTS | μ |
gl.LINES | μ |
gl.LINE_STRIP | μ°κ²°λ μ |
gl.TRIANGLES | μΌκ°ν |
gl.TRIANGLE_STRIP | μΌκ°ν μ€νΈλ¦½ |
gl.TRIANGLE_FAN | μΌκ°ν ν¬ |
| μμ | μλ―Έ |
|---|---|
gl.COLOR_BUFFER_BIT | μμ λ²νΌ |
gl.DEPTH_BUFFER_BIT | κΉμ΄ λ²νΌ |
gl.STENCIL_BUFFER_BIT | μ€ν μ€ λ²νΌ |
μ¬λ¬ κ°λ₯Ό λμμ μ¬μ©ν μλ μμ΅λλ€.
gl.clear(
gl.COLOR_BUFFER_BIT |
gl.DEPTH_BUFFER_BIT
);
| μμ | μλ―Έ |
|---|---|
gl.TEXTURE_3D | 3μ°¨μ ν μ€μ² |
gl.TEXTURE_2D_ARRAY | ν μ€μ² λ°°μ΄ |
gl.RGBA32F | 32λΉνΈ λΆλμμμ ν μ€μ² |
gl.SAMPLER_2D | ν μ€μ² μνλ¬ |
gl.UNIFORM_BUFFER | Uniform Buffer Object |
gl.TRANSFORM_FEEDBACK | Transform Feedback |
gl.DRAW_FRAMEBUFFER | λλ‘μ° νλ μλ²νΌ |
gl.READ_FRAMEBUFFER | μ½κΈ° νλ μλ²νΌ |
| νν | λΆλ₯ | μν |
|---|---|---|
gl.clear() | Method | GPUμ λͺ λ Ήμ μ λ¬ |
gl.createBuffer() | Method | κ°μ²΄ μμ± |
gl.drawArrays() | Method | λ λλ§ μν |
gl.ARRAY_BUFFER | Constant | λ²νΌ μ’ λ₯ μ§μ |
gl.TRIANGLES | Constant | λ λλ§ λ°©μ μ§μ |
gl.FLOAT | Constant | λ°μ΄ν° νμ μ§μ |
gl.COLOR_BUFFER_BIT | Constant | λ²νΌ μ ν |
WebGLμ μν κΈ°λ°(State Machine) APIμ λλ€. λ©μλλ GPUμ μνλ₯Ό λ³κ²½νκ±°λ λͺ λ Ήμ μννλ©°, μμλ κ·Έ λμμ λμκ³Ό λ°©μ, λ°μ΄ν° νμμ μ§μ ν©λλ€. λ°λΌμ λλΆλΆμ WebGL μ½λλ λ€μκ³Ό κ°μ ꡬ쑰λ₯Ό λ°λ³΅νκ² λ©λλ€.
gl.λ©μλ(μμ, μμ, κ°, κ°);
μ¦, λ©μλλ "무μμ ν κ²μΈκ°"λ₯Ό κ²°μ νκ³ , μμλ "μ΄λ»κ² ν κ²μΈκ°"λ₯Ό μ μν©λλ€. μ΄ κ΅¬μ‘°λ₯Ό μ΄ν΄νλ©΄ 볡μ‘ν΄ λ³΄μ΄λ WebGL APIλ μΌκ΄λ ν¨ν΄μΌλ‘ ν΄μν μ μμ΅λλ€.