μμ΄λ 리μμ€ λ°μΈλ© μ΅μ νλ‘ WebGL μ±λ₯μ κ·ΉλννμΈμ. UBO, λ°°μΉ, ν μ€μ² μνλΌμ€, κ·Έλ¦¬κ³ κΈλ‘λ² μ ν리μΌμ΄μ μ μν ν¨μ¨μ μΈ μν κ΄λ¦¬μ λν΄ μμ보μΈμ.
WebGL μμ΄λ 리μμ€ λ°μΈλ© λ§μ€ν°νκΈ°: μ΅κ³ μ±λ₯ μ΅μ νλ₯Ό μν μ λ΅
νκΈ°μ°¨κ³ λμμμ΄ μ§ννλ μΉ κΈ°λ° κ·Έλν½ νκ²½μμ WebGLμ ν΅μ¬ κΈ°μ λ‘ μ리 μ‘κ³ μμΌλ©°, μ μΈκ³ κ°λ°μλ€μ΄ λΈλΌμ°μ λ΄μμ μ§μ λλκ³ μνΈμμ©μ μΈ 3D κ²½νμ λ§λ€ μ μλλ‘ μ§μν©λλ€. λͺ°μ ν κ²μ νκ²½κ³Ό 볡μ‘ν κ³Όνμ μκ°νλΆν° λμ λ°μ΄ν° λμ보λμ λ§€λ ₯μ μΈ μ μμκ±°λ μ ν ꡬμ±κΈ°μ μ΄λ₯΄κΈ°κΉμ§ WebGLμ λ₯λ ₯μ μ§μ μΌλ‘ νμ μ μ λλ€. νμ§λ§ κ·Έ μ μ¬λ ₯μ μ΅λν λ°ννλ κ², νΉν 볡μ‘ν κΈλ‘λ² μ ν리μΌμ΄μ μ κ²½μ°, μ’ μ’ κ°κ³Όλλ μΈ‘λ©΄μΈ ν¨μ¨μ μΈ μμ΄λ 리μμ€ λ°μΈλ© λ° κ΄λ¦¬μ κ²°μ μ μΌλ‘ λ¬λ € μμ΅λλ€.
WebGL μ ν리μΌμ΄μ μ΄ GPUμ λ©λͺ¨λ¦¬ λ° μ²λ¦¬ μ₯μΉμ μνΈμμ©νλ λ°©μμ μ΅μ ννλ κ²μ λ¨μν κ³ κΈ κΈ°μ μ΄ μλλλ€. λ€μν μ₯μΉμ λ€νΈμν¬ μ‘°κ±΄μμ λΆλλ½κ³ λμ νλ μλ₯ μ κ²½νμ μ 곡νκΈ° μν κΈ°λ³Έμ μΈ μꡬ μ¬νμ λλ€. μ΅μ νλμ§ μμ 리μμ€ μ²λ¦¬λ κ°λ ₯ν νλμ¨μ΄μ μκ΄μμ΄ μ±λ₯ λ³λͺ© νμ, νλ μ λλ‘, κ·Έλ¦¬κ³ μ€λ§μ€λ¬μ΄ μ¬μ©μ κ²½νμΌλ‘ λΉ λ₯΄κ² μ΄μ΄μ§ μ μμ΅λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λμμλ WebGL μμ΄λ 리μμ€ λ°μΈλ©μ 볡μ‘μ±μ κΉμ΄ νκ³ λ€μ΄, κΈ°λ³Έ λ©μ»€λμ¦μ νꡬνκ³ , μΌλ°μ μΈ ν¨μ μ μλ³νλ©°, μ ν리μΌμ΄μ μ μ±λ₯μ μλ‘μ΄ μ°¨μμΌλ‘ λμ΄μ¬λ¦΄ κ³ κΈ μ λ΅μ 곡κ°ν κ²μ λλ€.
WebGL 리μμ€ λ°μΈλ© μ΄ν΄νκΈ°: ν΅μ¬ κ°λ
ν΅μ¬μ μΌλ‘ WebGLμ μν λ¨Έμ λͺ¨λΈμμ μλνλ©°, GPUμ 그리기 λͺ λ Ήμ λ΄λ¦¬κΈ° μ μ μ μ μ€μ κ³Ό 리μμ€κ° ꡬμ±λ©λλ€. "리μμ€ λ°μΈλ©"μ μ ν리μΌμ΄μ μ λ°μ΄ν°(μ μ , ν μ€μ², μ λνΌ κ°)λ₯Ό GPUμ μμ΄λ νλ‘κ·Έλ¨μ μ°κ²°νμ¬ λ λλ§μ μ¬μ©ν μ μκ² λ§λλ κ³Όμ μ μλ―Έν©λλ€. μ΄κ²μ JavaScript λ‘μ§κ³Ό μ μμ€ κ·Έλν½ νμ΄νλΌμΈ κ°μ μ€μν μ μμ λλ€.
WebGLμμ "리μμ€"λ 무μμΈκ°?
WebGLμμ 리μμ€μ λν΄ μ΄μΌκΈ°ν λ, μ°λ¦¬λ μ£Όλ‘ GPUκ° μ₯λ©΄μ λ λλ§νλ λ° νμν λͺ κ°μ§ μ£Όμ λ°μ΄ν° λ° κ°μ²΄ μ νμ μ§μΉν©λλ€:
- λ²νΌ κ°μ²΄(VBO, IBO): μ μ λ°μ΄ν°(μμΉ, λ²μ , UV, μμ)μ μΈλ±μ€ λ°μ΄ν°(μΌκ°ν μ°κ²°μ± μ μ)λ₯Ό μ μ₯ν©λλ€.
- ν μ€μ² κ°μ²΄: μμ΄λκ° νλ©΄μ μΉ νκΈ° μν΄ μνλ§νλ μ΄λ―Έμ§ λ°μ΄ν°(WebGL2μμλ 2D, νλΈ λ§΅, 3D ν μ€μ²)λ₯Ό 보μ ν©λλ€.
- νλ‘κ·Έλ¨ κ°μ²΄: μ§μ€λ©νΈλ¦¬κ° μ²λ¦¬λκ³ μμΉ λλ λ°©μμ μ μνλ μ»΄νμΌλκ³ λ§ν¬λ μ μ λ° νλκ·Έλ¨ΌνΈ μμ΄λμ λλ€.
- μ λνΌ λ³μ: λ¨μΌ λλ‘μ° μ½μ λͺ¨λ μ μ λλ νλκ·Έλ¨ΌνΈμ κ±Έμ³ μΌμ ν λ¨μΌ κ° λλ μμ κ° λ°°μ΄μ λλ€(μ: λ³ν νλ ¬, μ‘°λͺ μμΉ, μ¬μ§ μμ±).
- μνλ¬ κ°μ²΄(WebGL2): ν μ€μ² νλΌλ―Έν°(νν°λ§, λν)λ₯Ό ν μ€μ² λ°μ΄ν° μ체μμ λΆλ¦¬νμ¬ λ μ μ°νκ³ ν¨μ¨μ μΈ ν μ€μ² μν κ΄λ¦¬λ₯Ό κ°λ₯νκ² ν©λλ€.
- μ λνΌ λ²νΌ κ°μ²΄(UBO)(WebGL2): μ λνΌ λ³μ λͺ¨μμ μ μ₯νλλ‘ μ€κ³λ νΉμ λ²νΌ κ°μ²΄λ‘, λ ν¨μ¨μ μΌλ‘ μ λ°μ΄νΈνκ³ λ°μΈλ©ν μ μκ² ν©λλ€.
WebGL μν λ¨Έμ κ³Ό λ°μΈλ©
WebGLμ λͺ¨λ μμ
μ μ’
μ’
μ μ μν λ¨Έμ μ μμ νλ κ²μ ν¬ν¨ν©λλ€. μλ₯Ό λ€μ΄, μ μ μμ± ν¬μΈν°λ₯Ό μ§μ νκ±°λ ν
μ€μ²λ₯Ό λ°μΈλ©νκΈ° μ μ, λ¨Όμ ν΄λΉ λ²νΌ λλ ν
μ€μ² κ°μ²΄λ₯Ό μν λ¨Έμ μ νΉμ λμ μ§μ μ "λ°μΈλ©"ν΄μΌ ν©λλ€. μ΄λ κ² νλ©΄ νμ μμ
μ μν νμ± κ°μ²΄κ° λ©λλ€. μλ₯Ό λ€μ΄, gl.bindBuffer(gl.ARRAY_BUFFER, myVBO);λ myVBOλ₯Ό νμ¬ νμ± μ μ λ²νΌλ‘ λ§λλλ€. μ΄νμ gl.vertexAttribPointerμ κ°μ νΈμΆμ myVBOμ λν΄ μλν©λλ€.
μ§κ΄μ μ΄κΈ΄ νμ§λ§, μ΄ μν κΈ°λ° μ κ·Ό λ°©μμ νμ± λ¦¬μμ€(λ€λ₯Έ ν μ€μ², μλ‘μ΄ μμ΄λ νλ‘κ·Έλ¨, λλ λ€λ₯Έ μ μ λ²νΌ μΈνΈ)λ₯Ό μ νν λλ§λ€ GPU λλΌμ΄λ²κ° λ΄λΆ μνλ₯Ό μ λ°μ΄νΈν΄μΌ ν¨μ μλ―Έν©λλ€. μ΄λ¬ν μν λ³κ²½μ κ°λ³μ μΌλ‘λ μ¬μν΄ λ³΄μ΄μ§λ§, λΉ λ₯΄κ² λμ λμ΄ νΉν λ§μ κ³ μ κ°μ²΄λ μ¬μ§μ΄ μλ 볡μ‘ν μ₯λ©΄μμ μλΉν μ±λ₯ μ€λ²ν€λκ° λ μ μμ΅λλ€. μ΄ λ©μ»€λμ¦μ μ΄ν΄νλ κ²μ΄ μ΅μ νμ 첫걸μμ λλ€.
λ¨μν λ°μΈλ©μ μ±λ₯ λΉμ©
μμμ μΈ μ΅μ ν μμ΄λ 무μ¬μ½ μ±λ₯μ μ ν΄νλ ν¨ν΄μ λΉ μ§κΈ° μ½μ΅λλ€. λ°μΈλ©κ³Ό κ΄λ ¨λ μ±λ₯ μ νμ μ£Όλ μμΈμ λ€μκ³Ό κ°μ΅λλ€:
- κ³Όλν μν λ³κ²½:
gl.bindBuffer,gl.bindTexture,gl.useProgramμ νΈμΆνκ±°λ κ°λ³ μ λνΌμ μ€μ ν λλ§λ€ WebGL μνλ₯Ό μμ νκ² λ©λλ€. μ΄λ¬ν λ³κ²½μ 무λ£κ° μλλλ€. λΈλΌμ°μ μ WebGL ꡬνκ³Ό κΈ°λ³Έ κ·Έλν½ λλΌμ΄λ²κ° μ μνλ₯Ό κ²μ¦νκ³ μ μ©νλ©΄μ CPU μ€λ²ν€λλ₯Ό μ λ°ν©λλ€. - CPU-GPU ν΅μ μ€λ²ν€λ: μ λνΌ κ°μ΄λ λ²νΌ λ°μ΄ν°λ₯Ό μμ£Ό μ λ°μ΄νΈνλ©΄ CPUμ GPU κ°μ λ§μ μμ λ°μ΄ν° μ μ‘μ΄ λ°μν μ μμ΅λλ€. μ΅μ GPUλ λ§€μ° λΉ λ₯΄μ§λ§, CPUμ GPU κ°μ ν΅μ μ±λμ νΉν λ§μ μκ³ λ 립μ μΈ μ μ‘μ λν΄ μ§μ° μκ°μ μ λ°νλ κ²½μ°κ° λ§μ΅λλ€.
- λλΌμ΄λ² κ²μ¦ λ° μ΅μ ν μ₯λ²½: κ·Έλν½ λλΌμ΄λ²λ κ³ λλ‘ μ΅μ νλμ΄ μμ§λ§ μ νμ±λ 보μ₯ν΄μΌ ν©λλ€. λΉλ²ν μν λ³κ²½μ λλΌμ΄λ²κ° λ λλ§ λͺ λ Ήμ μ΅μ ννλ λ₯λ ₯μ λ°©ν΄νμ¬ GPUμμ λ ν¨μ¨μ μΈ μ€ν κ²½λ‘λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
μμ² κ°μ λ€μν μ ν λͺ¨λΈμ νμνλ κΈλ‘λ² μ μμκ±°λ νλ«νΌμ μμν΄ λ³΄μΈμ. κ° λͺ¨λΈμλ κ³ μ ν ν μ€μ²μ μ¬μ§μ΄ μμ΅λλ€. λ§μ½ κ° λͺ¨λΈμ΄ λͺ¨λ 리μμ€(μμ΄λ νλ‘κ·Έλ¨, μ¬λ¬ ν μ€μ², λ€μν λ²νΌ λ° μμ κ°μ μ λνΌ)λ₯Ό μμ ν λ€μ λ°μΈλ©νλλ‘ νΈλ¦¬κ±°νλ€λ©΄, μ ν리μΌμ΄μ μ λ©μΆ°λ²λ¦΄ κ²μ λλ€. μ΄ μλ리μ€λ μ λ΅μ μΈ λ¦¬μμ€ κ΄λ¦¬μ μ€μν νμμ±μ κ°μ‘°ν©λλ€.
WebGLμ ν΅μ¬ 리μμ€ λ°μΈλ© λ©μ»€λμ¦: μ¬μΈ΅ λΆμ
WebGLμμ 리μμ€κ° λ°μΈλ©λκ³ μ‘°μλλ μ£Όμ λ°©μμ κ²ν νλ©° μ±λ₯μ λ―ΈμΉλ μν₯μ κ°μ‘°ν΄ λ³΄κ² μ΅λλ€.
μ λνΌκ³Ό μ λνΌ λΈλ‘(UBO)
μ λνΌμ λλ‘μ° μ½λ§λ€ λ³κ²½ν μ μλ μμ΄λ νλ‘κ·Έλ¨ λ΄μ μ μ λ³μμ λλ€. μΌλ°μ μΌλ‘ κ°μ²΄μ λͺ¨λ μ μ μ΄λ νλκ·Έλ¨ΌνΈμ κ±Έμ³ μΌμ νμ§λ§ κ°μ²΄λ§λ€ λλ νλ μλ§λ€ λ¬λΌμ§λ λ°μ΄ν°(μ: λͺ¨λΈ νλ ¬, μΉ΄λ©λΌ μμΉ, μ‘°λͺ μμ)μ μ¬μ©λ©λλ€.
-
κ°λ³ μ λνΌ: WebGL1μμλ
gl.uniform1f,gl.uniform3fv,gl.uniformMatrix4fvμ κ°μ ν¨μλ₯Ό μ¬μ©νμ¬ μ λνΌμ νλμ© μ€μ ν©λλ€. μ΄λ¬ν κ° νΈμΆμ μ’ μ’ CPU-GPU λ°μ΄ν° μ μ‘κ³Ό μν λ³κ²½μΌλ‘ λ³νλ©λλ€. μμ κ°μ μ λνΌμ΄ μλ 볡μ‘ν μμ΄λμ κ²½μ°, μ΄λ μλΉν μ€λ²ν€λλ₯Ό λ°μμν¬ μ μμ΅λλ€.μμ: λͺ¨λ κ°μ²΄μ λν΄ λ³ν νλ ¬κ³Ό μμμ μ λ°μ΄νΈ:
gl.uniformMatrix4fv(locationMatrix, false, matrixData); gl.uniform3fv(locationColor, colorData);νλ μλΉ μλ°± κ°μ κ°μ²΄μ λν΄ μ΄ μμ μ μννλ©΄ λμ λ©λλ€. -
WebGL2: μ λνΌ λ²νΌ κ°μ²΄(UBO): WebGL2μμ λμ
λ μ€μν μ΅μ νμΈ UBOλ₯Ό μ¬μ©νλ©΄ μ¬λ¬ μ λνΌ λ³μλ₯Ό λ¨μΌ λ²νΌ κ°μ²΄λ‘ κ·Έλ£Ήνν μ μμ΅λλ€. μ΄ λ²νΌλ νΉμ λ°μΈλ© μ§μ μ λ°μΈλ©λκ³ μ 체μ μΌλ‘ μ
λ°μ΄νΈλ μ μμ΅λλ€. λ§μ κ°λ³ μ λνΌ νΈμΆ λμ , UBOλ₯Ό λ°μΈλ©νκΈ° μν ν λ²μ νΈμΆκ³Ό λ°μ΄ν°λ₯Ό μ
λ°μ΄νΈνκΈ° μν ν λ²μ νΈμΆλ§ νλ©΄ λ©λλ€.
μ₯μ : μν λ³κ²½μ΄ μ€κ³ λ°μ΄ν° μ μ‘μ΄ λ ν¨μ¨μ μ λλ€. UBOλ λν μ¬λ¬ μμ΄λ νλ‘κ·Έλ¨μμ μ λνΌ λ°μ΄ν°λ₯Ό 곡μ ν μ μκ² νμ¬ μ€λ³΅ λ°μ΄ν° μ λ‘λλ₯Ό μ€μ λλ€. νΉν μ 체 μ₯λ©΄μ΄λ λ λ ν¨μ€μ λν΄ μ’ μ’ μΌμ ν μΉ΄λ©λΌ νλ ¬(λ·°, νλ‘μ μ )μ΄λ μ‘°λͺ νλΌλ―Έν°μ κ°μ "μ μ" μ λνΌμ ν¨κ³Όμ μ λλ€.
UBO λ°μΈλ©: λ²νΌλ₯Ό μμ±νκ³ , μ λνΌ λ°μ΄ν°λ‘ μ±μ΄ λ€μ,
gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, uboBuffer);λ°gl.uniformBlockBinding(program, uniformBlockIndex, bindingPoint);λ₯Ό μ¬μ©νμ¬ μμ΄λμ μ μ WebGL 컨ν μ€νΈμ νΉμ λ°μΈλ© μ§μ κ³Ό μ°κ²°νλ κ³Όμ μ ν¬ν¨ν©λλ€.
μ μ λ²νΌ κ°μ²΄(VBO)μ μΈλ±μ€ λ²νΌ κ°μ²΄(IBO)
VBOλ μ μ μμ±(μμΉ, λ²μ λ±)μ μ μ₯νκ³ IBOλ μ μ μ΄ κ·Έλ €μ§λ μμλ₯Ό μ μνλ μΈλ±μ€λ₯Ό μ μ₯ν©λλ€. μ΄λ€μ λͺ¨λ μ§μ€λ©νΈλ¦¬λ₯Ό λ λλ§νλ λ° κΈ°λ³Έμ μ λλ€.
-
λ°μΈλ©: VBOλ
gl.ARRAY_BUFFERμ, IBOλgl.ELEMENT_ARRAY_BUFFERμgl.bindBufferλ₯Ό μ¬μ©νμ¬ λ°μΈλ©λ©λλ€. VBOλ₯Ό λ°μΈλ©ν ν,gl.vertexAttribPointerλ₯Ό μ¬μ©νμ¬ ν΄λΉ λ²νΌμ λ°μ΄ν°κ° μ μ μμ΄λμ μμ±μ μ΄λ»κ² λ§€νλλμ§ μ€λͺ νκ³ ,gl.enableVertexAttribArrayλ₯Ό μ¬μ©νμ¬ ν΄λΉ μμ±μ νμ±νν©λλ€.μ±λ₯ μν₯: νμ± VBO λλ IBOλ₯Ό μμ£Ό μ ννλ©΄ λ°μΈλ© λΉμ©μ΄ λ°μν©λλ€. κ°κ° κ³ μ ν VBO/IBOλ₯Ό κ°μ§ μκ³ λ³κ°μ λ©μλ₯Ό λ§μ΄ λ λλ§νλ κ²½μ°, μ΄λ¬ν λΉλ²ν λ°μΈλ©μ΄ λ³λͺ© νμμ΄ λ μ μμ΅λλ€. μ§μ€λ©νΈλ¦¬λ₯Ό λ μ κ³ λ ν° λ²νΌλ‘ ν΅ν©νλ κ²μ΄ μ’ μ’ ν΅μ¬ μ΅μ νμ λλ€.
ν μ€μ²μ μνλ¬
ν μ€μ²λ νλ©΄μ μκ°μ λν μΌμ μ 곡ν©λλ€. ν¨μ¨μ μΈ ν μ€μ² κ΄λ¦¬λ μ¬μ€μ μΈ λ λλ§μ λ§€μ° μ€μν©λλ€.
-
ν
μ€μ² μ λ: GPUμλ ν
μ€μ²λ₯Ό λ°μΈλ©ν μ μλ μ¬λ‘―κ³Ό κ°μ μ νλ μμ ν
μ€μ² μ λμ΄ μμ΅λλ€. ν
μ€μ²λ₯Ό μ¬μ©νλ €λ©΄ λ¨Όμ ν
μ€μ² μ λμ νμ±ννκ³ (μ:
gl.activeTexture(gl.TEXTURE0);), κ·Έλ° λ€μ ν μ€μ²λ₯Ό ν΄λΉ μ λμ λ°μΈλ©νκ³ (gl.bindTexture(gl.TEXTURE_2D, myTexture);), λ§μ§λ§μΌλ‘ μμ΄λμκ² μ΄λ€ μ λμμ μνλ§ν μ§ μλ €μ€λλ€(μ λ 0μ κ²½μ°gl.uniform1i(samplerUniformLocation, 0);).μ±λ₯ μν₯: κ°
gl.activeTextureλ°gl.bindTextureνΈμΆμ μν λ³κ²½μ λλ€. μ΄λ¬ν μ νμ μ΅μννλ κ²μ΄ νμμ μ λλ€. κ³ μ ν ν μ€μ²κ° λ§μ 볡μ‘ν μ₯λ©΄μ κ²½μ° μ΄κ²μ΄ μ£Όμ κ³Όμ κ° λ μ μμ΅λλ€. -
μνλ¬(WebGL2): WebGL2μμ μνλ¬ κ°μ²΄λ ν
μ€μ² νλΌλ―Έν°(νν°λ§, λν λͺ¨λ λ±)λ₯Ό ν
μ€μ² λ°μ΄ν° μ체μμ λΆλ¦¬ν©λλ€. μ¦, λ€λ₯Έ νλΌλ―Έν°λ₯Ό κ°μ§ μ¬λ¬ μνλ¬ κ°μ²΄λ₯Ό λ§λ€κ³
gl.bindSampler(textureUnit, mySampler);λ₯Ό μ¬μ©νμ¬ ν μ€μ² μ λμ λ 립μ μΌλ‘ λ°μΈλ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ ν μ€μ² μ체λ₯Ό λ€μ λ°μΈλ©νκ±°λgl.texParameteriλ₯Ό λ°λ³΅μ μΌλ‘ νΈμΆν νμ μμ΄ λ¨μΌ ν μ€μ²λ₯Ό λ€λ₯Έ νλΌλ―Έν°λ‘ μνλ§ν μ μμ΅λλ€.μ΄μ : νλΌλ―Έν°λ§ μ‘°μ ν΄μΌ ν λ ν μ€μ² μν λ³κ²½μ μ€μ¬μ£Όλ©°, νΉν λνΌλ μ °μ΄λ©μ΄λ νμ²λ¦¬ ν¨κ³Όμ κ°μ΄ λμΌν ν μ€μ²κ° λ€λ₯΄κ² μνλ§λ μ μλ κΈ°μ μ μ μ©ν©λλ€.
μμ΄λ νλ‘κ·Έλ¨
μμ΄λ νλ‘κ·Έλ¨(μ»΄νμΌλ μ μ λ° νλκ·Έλ¨ΌνΈ μμ΄λ)μ κ°μ²΄μ λν μ 체 λ λλ§ λ‘μ§μ μ μν©λλ€.
-
λ°μΈλ©:
gl.useProgram(myProgram);λ₯Ό μ¬μ©νμ¬ νμ± μμ΄λ νλ‘κ·Έλ¨μ μ νν©λλ€. λͺ¨λ νμ λλ‘μ° μ½μ λ€λ₯Έ νλ‘κ·Έλ¨μ΄ λ°μΈλ©λ λκΉμ§ μ΄ νλ‘κ·Έλ¨μ μ¬μ©ν©λλ€.μ±λ₯ μν₯: μμ΄λ νλ‘κ·Έλ¨μ μ ννλ κ²μ κ°μ₯ λΉμ©μ΄ λ§μ΄ λλ μν λ³κ²½ μ€ νλμ λλ€. GPUλ μ’ μ’ νμ΄νλΌμΈμ μΌλΆλ₯Ό μ¬κ΅¬μ±ν΄μΌ νλ―λ‘ μλΉν μ§μ°μ΄ λ°μν μ μμ΅λλ€. λ°λΌμ νλ‘κ·Έλ¨ μ νμ μ΅μννλ μ λ΅μ μ΅μ νμ λ§€μ° ν¨κ³Όμ μ λλ€.
WebGL 리μμ€ κ΄λ¦¬λ₯Ό μν κ³ κΈ μ΅μ ν μ λ΅
κΈ°λ³Έ λ©μ»€λμ¦κ³Ό κ·Έ μ±λ₯ λΉμ©μ μ΄ν΄νμΌλ―λ‘, WebGL μ ν리μΌμ΄μ μ ν¨μ¨μ±μ κ·Ήμ μΌλ‘ ν₯μμν€λ κ³ κΈ κΈ°μ μ μ΄ν΄λ³΄κ² μ΅λλ€.
1. λ°°μΉμ μΈμ€ν΄μ±: λλ‘μ° μ½ μ€λ²ν€λ μ€μ΄κΈ°
λλ‘μ° μ½(gl.drawArrays λλ gl.drawElements)μ μλ μ’
μ’
WebGL μ ν리μΌμ΄μ
μμ κ°μ₯ ν° λ³λͺ© νμμ
λλ€. κ° λλ‘μ° μ½μ CPU-GPU ν΅μ , λλΌμ΄λ² κ²μ¦ λ° μν λ³κ²½μΌλ‘ μΈν κ³ μ μ€λ²ν€λλ₯Ό μλ°ν©λλ€. λλ‘μ° μ½μ μ€μ΄λ κ²μ΄ κ°μ₯ μ€μν©λλ€.
- κ³Όλν λλ‘μ° μ½μ λ¬Έμ μ : μμ² κ°μ κ°λ³ λλ¬΄κ° μλ μ²μ λ λλ§νλ€κ³ μμν΄ λ³΄μΈμ. κ° λλ¬΄κ° λ³λμ λλ‘μ° μ½μ΄λΌλ©΄, CPUλ GPUκ° λ λλ§νλ λ° μ°λ μκ°λ³΄λ€ GPUμ λͺ λ Ήμ μ€λΉνλ λ° λ λ§μ μκ°μ μλΉν μ μμ΅λλ€.
-
μ§μ€λ©νΈλ¦¬ λ°°μΉ: μ¬λ¬ κ°μ μμ λ©μλ₯Ό νλμ λ ν° λ²νΌ κ°μ²΄λ‘ κ²°ν©νλ κ²μ ν¬ν¨ν©λλ€. 100κ°μ μμ νλΈλ₯Ό 100κ°μ κ°λ³ λλ‘μ° μ½λ‘ 그리λ λμ , μ μ λ°μ΄ν°λ₯Ό νλμ ν° λ²νΌλ‘ λ³ν©νκ³ λ¨μΌ λλ‘μ° μ½λ‘ 그립λλ€. μ΄λ₯Ό μν΄μλ μμ΄λμμ λ³νμ μ‘°μ νκ±°λ λ³ν©λ κ°μ²΄λ₯Ό ꡬλ³νκΈ° μν΄ μΆκ° μμ±μ μ¬μ©ν΄μΌ ν©λλ€.
μ μ©: μ μ λ°°κ²½ μμ, λ¨μΌ μ λλ©μ΄μ μν°ν°λ₯Ό μν λ³ν©λ μΊλ¦ν° ννΈ.
-
λ¨Έν°λ¦¬μΌ λ°°μΉ: λμ μ₯λ©΄μ λ μ€μ©μ μΈ μ κ·Ό λ°©μμ
λλ€. λμΌν λ¨Έν°λ¦¬μΌ(μ¦, λμΌν μμ΄λ νλ‘κ·Έλ¨, ν
μ€μ² λ° λ λλ§ μν)μ 곡μ νλ κ°μ²΄λ₯Ό κ·Έλ£Ήννκ³ ν¨κ» λ λλ§ν©λλ€. μ΄λ κ² νλ©΄ λΉμ©μ΄ λ§μ΄ λλ μμ΄λ λ° ν
μ€μ² μ νμ μ΅μνν μ μμ΅λλ€.
νλ‘μΈμ€: μ₯λ©΄μ κ°μ²΄λ₯Ό λ¨Έν°λ¦¬μΌμ΄λ μμ΄λ νλ‘κ·Έλ¨λ³λ‘ μ λ ¬ν λ€μ, 첫 λ²μ§Έ λ¨Έν°λ¦¬μΌμ λͺ¨λ κ°μ²΄λ₯Ό λ λλ§νκ³ , κ·Έ λ€μ λ λ²μ§Έ λ¨Έν°λ¦¬μΌμ λͺ¨λ κ°μ²΄λ₯Ό λ λλ§νλ μμΌλ‘ μ§νν©λλ€. μ΄λ κ² νλ©΄ μμ΄λλ ν μ€μ²κ° ν λ² λ°μΈλ©λλ©΄ κ°λ₯ν ν λ§μ λλ‘μ° μ½μ μ¬μ¬μ©λ μ μμ΅λλ€.
-
νλμ¨μ΄ μΈμ€ν΄μ±(WebGL2): λμΌνκ±°λ λ§€μ° μ μ¬ν κ°μ²΄λ₯Ό λ€λ₯Έ μμ±(μμΉ, ν¬κΈ°, μμ)μΌλ‘ λ§μ΄ λ λλ§νλ λ° μΈμ€ν΄μ±μ λ§€μ° κ°λ ₯ν©λλ€. κ° κ°μ²΄μ λ°μ΄ν°λ₯Ό κ°λ³μ μΌλ‘ 보λ΄λ λμ , κΈ°λ³Έ μ§μ€λ©νΈλ¦¬λ₯Ό ν λ² λ³΄λ΄κ³ μΈμ€ν΄μ€λ³ λ°μ΄ν°(μ: κ° μΈμ€ν΄μ€μ λν λ³ν νλ ¬)μ μμ λ°°μ΄μ μμ±μΌλ‘ μ 곡ν©λλ€.
μλ λ°©μ: μ§μ€λ©νΈλ¦¬ λ²νΌλ₯Ό νμμ²λΌ μ€μ ν©λλ€. κ·Έλ° λ€μ μΈμ€ν΄μ€λ§λ€ λ³κ²½λλ μμ±μ λν΄
gl.vertexAttribDivisor(attributeLocation, 1);μ μ¬μ©ν©λλ€(λλ λ μμ£Ό μ λ°μ΄νΈνλ €λ©΄ λ λμ μ μ μ¬μ©). μ΄λ WebGLμ μ μ λΉ ν λ²μ΄ μλ μΈμ€ν΄μ€λΉ ν λ² μ΄ μμ±μ μ§ννλλ‘ μ§μν©λλ€. λλ‘μ° μ½μgl.drawArraysInstanced(mode, first, count, instanceCount);λλgl.drawElementsInstanced(mode, count, type, offset, instanceCount);κ° λ©λλ€.μμ: νν°ν΄ μμ€ν (λΉ, λ, λΆ), κ΅°μ€ μΊλ¦ν°, νμ΄λ κ½λ°, μμ² κ°μ UI μμ. μ΄ κΈ°μ μ ν¨μ¨μ± λλ¬Έμ κ³ μ±λ₯ κ·Έλν½μ€μμ μ μΈκ³μ μΌλ‘ μ±νλμμ΅λλ€.
2. μ λνΌ λ²νΌ κ°μ²΄(UBO) ν¨κ³Όμ μΌλ‘ νμ©νκΈ° (WebGL2)
UBOλ WebGL2μμ μ λνΌ κ΄λ¦¬λ₯Ό μν κ²μ 체μΈμ μ λλ€. κ·Έ νμ λ§μ μ λνΌμ λ¨μΌ GPU λ²νΌμ ν¨ν€μ§νμ¬ λ°μΈλ© λ° μ λ°μ΄νΈ λΉμ©μ μ΅μννλ λ₯λ ₯μ μμ΅λλ€.
-
UBO ꡬ쑰ν: μ
λ°μ΄νΈ λΉλμ λ²μμ λ°λΌ μ λνΌμ λ
Όλ¦¬μ λΈλ‘μΌλ‘ ꡬμ±ν©λλ€:
- μ₯λ©΄λ³ UBO: μ μ μ‘°λͺ λ°©ν₯, μ£Όλ³ μμ, μκ°κ³Ό κ°μ΄ κ±°μ λ³κ²½λμ§ μλ μ λνΌμ ν¬ν¨ν©λλ€. νλ μλΉ ν λ² λ°μΈλ©ν©λλ€.
- λ·°λ³ UBO: λ·° λ° νλ‘μ μ νλ ¬κ³Ό κ°μ μΉ΄λ©λΌ κ΄λ ¨ λ°μ΄ν°λ₯Ό μν κ²μ λλ€. μΉ΄λ©λΌ λλ λ·°λΉ ν λ² μ λ°μ΄νΈν©λλ€(μ: λΆν νλ©΄ λ λλ§ λλ λ°μ¬ νλ‘λΈκ° μλ κ²½μ°).
- λ¨Έν°λ¦¬μΌλ³ UBO: λ¨Έν°λ¦¬μΌ κ³ μ μ μμ±(μμ, κ΄ν, ν μ€μ² μ€μΌμΌ)μ μν κ²μ λλ€. λ¨Έν°λ¦¬μΌμ μ νν λ μ λ°μ΄νΈν©λλ€.
- κ°μ²΄λ³ UBO(κ°λ³ κ°μ²΄ λ³νμλ λ μΌλ°μ ): κ°λ₯νμ§λ§, κ°λ³ κ°μ²΄ λ³νμ μΈμ€ν΄μ±μ΄λ λͺ¨λΈ νλ ¬μ κ°λ¨ν μ λνΌμΌλ‘ μ λ¬νλ κ²μ΄ λ μ’μ΅λλ€. UBOλ λͺ¨λ λ¨μΌ κ°μ²΄μ λν΄ μμ£Ό λ³κ²½λλ κ³ μ ν λ°μ΄ν°μ μ¬μ©λ κ²½μ° μ€λ²ν€λκ° μκΈ° λλ¬Έμ λλ€.
-
UBO μ
λ°μ΄νΈ: UBOλ₯Ό λ€μ μμ±νλ λμ ,
gl.bufferSubData(gl.UNIFORM_BUFFER, offset, data);λ₯Ό μ¬μ©νμ¬ λ²νΌμ νΉμ λΆλΆμ μ λ°μ΄νΈν©λλ€. μ΄λ κ² νλ©΄ λ©λͺ¨λ¦¬ μ¬ν λΉ λ° μ 체 λ²νΌ μ μ‘μ μ€λ²ν€λλ₯Ό νΌνκ³ μ λ°μ΄νΈλ₯Ό λ§€μ° ν¨μ¨μ μΌλ‘ λ§λλλ€.λͺ¨λ² μ¬λ‘: UBO μ λ ¬ μꡬ μ¬ν(
gl.getProgramParameter(program, gl.UNIFORM_BLOCK_DATA_SIZE);λ°gl.getProgramParameter(program, gl.UNIFORM_BLOCK_BINDING);μ΄ λμμ΄ λ¨)μ μ μνμμμ€. JavaScript λ°μ΄ν° ꡬ쑰(μ:Float32Array)λ₯Ό GPUμ μμ λ μ΄μμκ³Ό μΌμΉνλλ‘ ν¨λ©νμ¬ μκΈ°μΉ μμ λ°μ΄ν° μ΄λμ λ°©μ§νμμμ€.
3. ν μ€μ² μνλΌμ€μ λ°°μ΄: μ€λ§νΈν ν μ€μ² κ΄λ¦¬
ν μ€μ² λ°μΈλ©μ μ΅μννλ κ²μ μν₯λ ₯μ΄ ν° μ΅μ νμ λλ€. ν μ€μ²λ μ’ μ’ κ°μ²΄μ μκ°μ μ 체μ±μ μ μνλ©°, μ΄λ₯Ό μμ£Ό μ ννλ κ²μ λΉμ©μ΄ λ§μ΄ λλλ€.
-
ν
μ€μ² μνλΌμ€: μ¬λ¬ κ°μ μμ ν
μ€μ²(μ: μμ΄μ½, μ§ν ν¨μΉ, μΊλ¦ν° λν
μΌ)λ₯Ό νλμ λ ν° ν
μ€μ² μ΄λ―Έμ§λ‘ κ²°ν©ν©λλ€. κ·Έλ° λ€μ μμ΄λμμ μνλΌμ€μ μνλ λΆλΆμ μνλ§νκΈ° μν΄ μ¬λ°λ₯Έ UV μ’νλ₯Ό κ³μ°ν©λλ€. μ΄λ νλμ ν° ν
μ€μ²λ§ λ°μΈλ©νμ¬
gl.bindTextureνΈμΆμ λν μ€μ΄λ κ²μ μλ―Έν©λλ€.μ΄μ : ν μ€μ² λ°μΈλ© κ°μ, GPU μΊμ μ§μμ± ν₯μ, μ μ¬μ μΌλ‘ λ λΉ λ₯Έ λ‘λ©(λ§μ μμ ν μ€μ² λ νλμ ν° ν μ€μ²). μ μ©: UI μμ, κ²μ μ€νλΌμ΄νΈ μνΈ, κ΄λν νκ²½μ νκ²½ λν μΌ, λ¨μΌ λ¨Έν°λ¦¬μΌμ λ€μν νλ©΄ μμ± λ§€ν.
-
ν
μ€μ² λ°°μ΄(WebGL2): WebGL2μμ μ¬μ©ν μ μλ ν¨μ¬ λ κ°λ ₯ν κΈ°μ μΈ ν
μ€μ² λ°°μ΄μ λμΌν ν¬κΈ°μ νμμ μ¬λ¬ 2D ν
μ€μ²λ₯Ό λ¨μΌ ν
μ€μ² κ°μ²΄ λ΄μ μ μ₯ν μ μκ² ν΄μ€λλ€. κ·Έλ° λ€μ μΆκ° ν
μ€μ² μ’νλ₯Ό μ¬μ©νμ¬ μμ΄λμμ μ΄ λ°°μ΄μ κ°λ³ "λ μ΄μ΄"μ μ‘μΈμ€ν μ μμ΅λλ€.
λ μ΄μ΄ μ‘μΈμ€: GLSLμμλ
sampler2DArrayμ κ°μ μνλ¬λ₯Ό μ¬μ©νκ³texture(myTextureArray, vec3(uv.x, uv.y, layerIndex));λ‘ μ‘μΈμ€ν©λλ€. μ₯μ : μνλΌμ€μ κ΄λ ¨λ 볡μ‘ν UV μ’ν μ¬λ§€νμ νμμ±μ μ κ±°νκ³ , ν μ€μ² μΈνΈλ₯Ό κ΄λ¦¬νλ λ κΉλν λ°©λ²μ μ 곡νλ©°, μμ΄λμμ λμ ν μ€μ² μ ν(μ: κ°μ²΄ IDλ₯Ό κΈ°λ°μΌλ‘ λ€λ₯Έ λ¨Έν°λ¦¬μΌ ν μ€μ² μ ν)μ νμν©λλ€. μ§ν λ λλ§, λ°μΉΌ μμ€ν λλ κ°μ²΄ λ³νμ μ΄μμ μ λλ€.
4. μꡬ λ²νΌ λ§€ν(WebGLμ κ°λ )
WebGLμ μΌλΆ λ°μ€ν¬ν± GL APIμ²λΌ λͺ μμ μΈ "μꡬ λ§€ν λ²νΌ"λ₯Ό λ ΈμΆνμ§ μμ§λ§, μ§μμ μΈ μ¬ν λΉ μμ΄ GPU λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ λ°μ΄νΈνλ κΈ°λ³Έ κ°λ μ λ§€μ° μ€μν©λλ€.
-
gl.bufferDataμ΅μν: μ΄ νΈμΆμ μ’ μ’ GPU λ©λͺ¨λ¦¬λ₯Ό μ¬ν λΉνκ³ μ 체 λ°μ΄ν°λ₯Ό 볡μ¬ν¨μ μλ―Έν©λλ€. μμ£Ό λ³κ²½λλ λμ λ°μ΄ν°μ κ²½μ°, κ°λ₯νλ€λ©΄ μλ‘μ΄ λ μμ ν¬κΈ°λ‘gl.bufferDataλ₯Ό νΈμΆνλ κ²μ νΌνμμμ€. λμ , ν λ²μ μΆ©λΆν ν° λ²νΌλ₯Ό ν λΉνκ³ (μ:gl.STATIC_DRAWλλgl.DYNAMIC_DRAWμ¬μ© ννΈ, λΉλ‘ ννΈλ μ’ μ’ κΆκ³ μ¬νμ΄μ§λ§) μ λ°μ΄νΈμλgl.bufferSubDataλ₯Ό μ¬μ©νμμμ€.gl.bufferSubDataνλͺ νκ² μ¬μ©νκΈ°: μ΄ ν¨μλ κΈ°μ‘΄ λ²νΌμ νμ μμμ μ λ°μ΄νΈν©λλ€. λΆλΆ μ λ°μ΄νΈμ κ²½μ° μ¬ν λΉμ νΌνλ―λ‘ μΌλ°μ μΌλ‘gl.bufferDataλ³΄λ€ ν¨μ¨μ μ λλ€. κ·Έλ¬λ GPUκ° νμ¬ μ λ°μ΄νΈνλ €λ λ²νΌλ₯Ό μ¬μ© μ€μΈ κ²½μ°, λΉλ²ν μμgl.bufferSubDataνΈμΆμ μ¬μ ν CPU-GPU λκΈ°ν μ§μ°μ μ΄λν μ μμ΅λλ€. - λμ λ°μ΄ν°λ₯Ό μν "λλΈ λ²νΌλ§" λλ "λ§ λ²νΌ": λ§€μ° λμ μΈ λ°μ΄ν°(μ: λ§€ νλ μ λ³κ²½λλ νν°ν΄ μμΉ)μ κ²½μ°, λ κ° μ΄μμ λ²νΌλ₯Ό ν λΉνλ μ λ΅μ κ³ λ €νμμμ€. GPUκ° ν λ²νΌμμ 그리λ λμ λ€λ₯Έ λ²νΌλ₯Ό μ λ°μ΄νΈν©λλ€. GPUκ° λλλ©΄ λ²νΌλ₯Ό κ΅μ²΄ν©λλ€. μ΄λ κ² νλ©΄ GPUλ₯Ό μ§μ°μν€μ§ μκ³ μ§μμ μΈ λ°μ΄ν° μ λ°μ΄νΈκ° κ°λ₯ν©λλ€. "λ§ λ²νΌ"λ μ¬λ¬ λ²νΌλ₯Ό μνμΌλ‘ κ°μ§κ³ κ³μ μννλ©΄μ μ΄λ₯Ό νμ₯ν©λλ€.
5. μμ΄λ νλ‘κ·Έλ¨ κ΄λ¦¬ λ° μμ΄
μμ μΈκΈνλ―μ΄, μμ΄λ νλ‘κ·Έλ¨μ μ ννλ κ²μ λΉμ©μ΄ λ§μ΄ λλλ€. μ§λ₯μ μΈ μμ΄λ κ΄λ¦¬λ μλΉν μ΄λμ κ°μ Έμ¬ μ μμ΅λλ€.
-
νλ‘κ·Έλ¨ μ ν μ΅μν: κ°μ₯ κ°λ¨νκ³ ν¨κ³Όμ μΈ μ λ΅μ λ λλ§ ν¨μ€λ₯Ό μμ΄λ νλ‘κ·Έλ¨λ³λ‘ ꡬμ±νλ κ²μ
λλ€. νλ‘κ·Έλ¨ Aλ₯Ό μ¬μ©νλ λͺ¨λ κ°μ²΄λ₯Ό λ λλ§ν λ€μ, νλ‘κ·Έλ¨ Bλ₯Ό μ¬μ©νλ λͺ¨λ κ°μ²΄λ₯Ό λ λλ§νλ μμΌλ‘ μ§νν©λλ€. μ΄ λ¨Έν°λ¦¬μΌ κΈ°λ° μ λ ¬μ λͺ¨λ κ²¬κ³ ν λ λλ¬μμ 첫 λ²μ§Έ λ¨κ³κ° λ μ μμ΅λλ€.
μ€μ©μ μΈ μ: κΈλ‘λ² κ±΄μΆ μκ°ν νλ«νΌμλ μλ§μ 건물 μ νμ΄ μμ μ μμ΅λλ€. κ° κ±΄λ¬Όλ§λ€ μμ΄λλ₯Ό μ ννλ λμ , 'λ²½λ' μμ΄λλ₯Ό μ¬μ©νλ λͺ¨λ 건물μ μ λ ¬ν λ€μ, 'μ 리' μμ΄λλ₯Ό μ¬μ©νλ λͺ¨λ 건물μ μ λ ¬νλ μμΌλ‘ μ§νν©λλ€.
-
μμ΄λ μμ΄ λ μ‘°κ±΄λΆ μ λνΌ: λλ‘λ λ¨μΌ μμ΄λκ° μ½κ° λ€λ₯Έ λ λλ§ κ²½λ‘(μ: λ
Έλ© λ§€ν μ 무, λ€λ₯Έ μ‘°λͺ
λͺ¨λΈ)λ₯Ό μ²λ¦¬ν΄μΌ ν μ μμ΅λλ€. λ κ°μ§ μ£Όμ μ κ·Ό λ°©μμ΄ μμ΅λλ€:
-
μ‘°κ±΄λΆ μ λνΌμ μ¬μ©ν νλμ κ±°λ μμ΄λ: μ λνΌ νλκ·Έ(μ:
uniform int hasNormalMap;)μ GLSLifλ¬Έμ μ¬μ©νμ¬ λ‘μ§μ λΆκΈ°νλ λ¨μΌμ 볡μ‘ν μμ΄λμ λλ€. μ΄λ νλ‘κ·Έλ¨ μ νμ νΌνμ§λ§, λ μ΅μ νλ μμ΄λ μ»΄νμΌ(GPUκ° λͺ¨λ κ°λ₯ν κ²½λ‘μ λν΄ μ»΄νμΌν΄μΌ νλ―λ‘)κ³Ό μ μ¬μ μΌλ‘ λ λ§μ μ λνΌ μ λ°μ΄νΈλ‘ μ΄μ΄μ§ μ μμ΅λλ€. -
μμ΄λ μμ΄: λ°νμ λλ μ»΄νμΌ νμμ μ¬λ¬ νΉνλ μμ΄λ νλ‘κ·Έλ¨(μ:
shader_PBR_NoNormalMap,shader_PBR_WithNormalMap)μ μμ±ν©λλ€. μ΄λ κ΄λ¦¬ν μμ΄λ νλ‘κ·Έλ¨μ΄ λ λ§μμ§κ³ μ λ ¬λμ§ μμΌλ©΄ νλ‘κ·Έλ¨ μ νμ΄ λ λ§μμ§μ§λ§, κ° νλ‘κ·Έλ¨μ νΉμ μμ μ κ³ λλ‘ μ΅μ νλμ΄ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ κ³ κΈ μμ§μμ μΌλ°μ μ λλ€.
κ· ν μ‘κΈ°: μ΅μ μ μ κ·Ό λ°©μμ μ’ μ’ νμ΄λΈλ¦¬λ μ λ΅μ μμ΅λλ€. μμ£Ό λ³κ²½λλ μ¬μν λ³νμλ μ λνΌμ μ¬μ©νμμμ€. μλΉν λ€λ₯Έ λ λλ§ λ‘μ§μλ λ³λμ μμ΄λ μμ΄μ μμ±νμμμ€. νλ‘νμΌλ§μ νΉμ μ ν리μΌμ΄μ λ° λμ νλμ¨μ΄μ κ°μ₯ μ ν©ν κ· νμ κ²°μ νλ λ° ν΅μ¬μ λλ€.
-
μ‘°κ±΄λΆ μ λνΌμ μ¬μ©ν νλμ κ±°λ μμ΄λ: μ λνΌ νλκ·Έ(μ:
6. μ§μ° λ°μΈλ©κ³Ό μν μΊμ±
μν λ¨Έμ μ΄ μ΄λ―Έ μ¬λ°λ₯΄κ² ꡬμ±λμ΄ μλ€λ©΄ λ§μ WebGL μμ μ΄ μ€λ³΅λ©λλ€. ν μ€μ²κ° μ΄λ―Έ νμ± ν μ€μ² μ λμ λ°μΈλ©λμ΄ μλ€λ©΄ μ λ€μ λ°μΈλ©ν΄μΌ ν κΉμ?
-
μ§μ° λ°μΈλ©: WebGL νΈμΆ μ£Όμμ λνΌλ₯Ό ꡬννμ¬ λμ 리μμ€κ° νμ¬ λ°μΈλ©λ 리μμ€μ λ€λ₯Έ κ²½μ°μλ§ λ°μΈλ© λͺ
λ Ήμ λ΄λ¦¬λλ‘ ν©λλ€. μλ₯Ό λ€μ΄,
gl.bindTexture(gl.TEXTURE_2D, newTexture);λ₯Ό νΈμΆνκΈ° μ μnewTextureκ° νμ± ν μ€μ² μ λμgl.TEXTURE_2Dμ μ΄λ―Έ νμ¬ λ°μΈλ©λ ν μ€μ²μΈμ§ νμΈν©λλ€. -
μλμ° μν μ μ§: μ§μ° λ°μΈλ©μ ν¨κ³Όμ μΌλ‘ ꡬννλ €λ©΄ "μλμ° μν"λ₯Ό μ μ§ν΄μΌ ν©λλ€. μ΄λ μ ν리μΌμ΄μ
μ΄ μΈμνλ WebGL 컨ν
μ€νΈμ νμ¬ μνλ₯Ό λ―Έλ¬λ§νλ JavaScript κ°μ²΄μ
λλ€. νμ¬ λ°μΈλ©λ νλ‘κ·Έλ¨, νμ± ν
μ€μ² μ λ, κ° μ λμ λ°μΈλ©λ ν
μ€μ² λ±μ μ μ₯ν©λλ€. λ°μΈλ© λͺ
λ Ήμ λ΄λ¦΄ λλ§λ€ μ΄ μλμ° μνλ₯Ό μ
λ°μ΄νΈν©λλ€. λͺ
λ Ήμ λ΄λ¦¬κΈ° μ μ μνλ μνμ μλμ° μνλ₯Ό λΉκ΅ν©λλ€.
μ£Όμ: ν¨κ³Όμ μ΄κΈ΄ νμ§λ§, ν¬κ΄μ μΈ μλμ° μνλ₯Ό κ΄λ¦¬νλ©΄ λ λλ§ νμ΄νλΌμΈμ 볡μ‘μ±μ΄ μΆκ°λ μ μμ΅λλ€. κ°μ₯ λΉμ©μ΄ λ§μ΄ λλ μν λ³κ²½(νλ‘κ·Έλ¨, ν μ€μ², UBO)μ λ¨Όμ μ§μ€νμμμ€. νμ¬ GL μνλ₯Ό 쿼리νκΈ° μν΄
gl.getParameterλ₯Ό μμ£Ό μ¬μ©νλ κ²μ νΌνμμμ€. μ΄λ¬ν νΈμΆ μ체λ CPU-GPU λκΈ°νλ‘ μΈν΄ μλΉν μ€λ²ν€λλ₯Ό μ λ°ν μ μκΈ° λλ¬Έμ λλ€.
μ€μ©μ μΈ κ΅¬ν κ³ λ € μ¬ν λ° λꡬ
μ΄λ‘ μ μ§μμ λμ΄, μ€μ μ μΈ μ μ©κ³Ό μ§μμ μΈ νκ°λ μ€μ μ±λ₯ ν₯μμ νμμ μ λλ€.
WebGL μ ν리μΌμ΄μ νλ‘νμΌλ§
μΈ‘μ νμ§ μλ κ²μ μ΅μ νν μ μμ΅λλ€. νλ‘νμΌλ§μ μ€μ λ³λͺ© νμμ μλ³νλ λ° μ€μν©λλ€:
-
λΈλΌμ°μ κ°λ°μ λꡬ: λͺ¨λ μ£Όμ λΈλΌμ°μ λ κ°λ ₯ν κ°λ°μ λꡬλ₯Ό μ 곡ν©λλ€. WebGLμ κ²½μ°, μ±λ₯, λ©λͺ¨λ¦¬ λ° μ’
μ’
μ μ© WebGL κ²μ¬κΈ°μ κ΄λ ¨λ μΉμ
μ μ°Ύμ보μμμ€. μλ₯Ό λ€μ΄, Chromeμ DevToolsλ CPU μ¬μ©λ, GPU νλ, JavaScript μ€ν λ° WebGL νΈμΆ νμ΄λ°μ 보μ¬μ£Όλ νλ μλ³ νλμ κΈ°λ‘ν μ μλ "Performance" νμ μ 곡ν©λλ€. Firefoxλ μ μ© WebGL ν¨λμ ν¬ν¨ν νλ₯ν λꡬλ₯Ό μ 곡ν©λλ€.
λ³λͺ© νμ μλ³: νΉμ WebGL νΈμΆμμ κΈ΄ μ§μ μκ°(μ: λ§μ μμ
gl.uniform...νΈμΆ, λΉλ²νgl.useProgramλλ κ΄λ²μνgl.bufferData)μ μ°Ύμ보μμμ€. WebGL νΈμΆμ ν΄λΉνλ λμ CPU μ¬μ©λμ μ’ μ’ κ³Όλν μν λ³κ²½μ΄λ CPU μΈ‘ λ°μ΄ν° μ€λΉλ₯Ό λνλ λλ€. - GPU νμμ€ν¬ν 쿼리(WebGL2 EXT_DISJOINT_TIMER_QUERY_WEBGL2): λ μ νν GPU μΈ‘ νμ΄λ°μ μν΄ WebGL2λ νΉμ λͺ λ Ήμ μ€ννλ λ° GPUκ° μλΉν μ€μ μκ°μ 쿼리νλ νμ₯μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ CPU μ€λ²ν€λμ μ§μ ν GPU λ³λͺ© νμμ ꡬλ³ν μ μμ΅λλ€.
μ¬λ°λ₯Έ λ°μ΄ν° ꡬ쑰 μ ν
WebGLμ© λ°μ΄ν°λ₯Ό μ€λΉνλ JavaScript μ½λμ ν¨μ¨μ±λ μ€μν μν μ ν©λλ€:
-
νμ
λ°°μ΄(
Float32Array,Uint16Arrayλ±): WebGL λ°μ΄ν°μλ νμ νμ λ°°μ΄μ μ¬μ©νμμμ€. μ΄λ λ€μ΄ν°λΈ C++ νμ μ μ§μ λ§€νλμ΄ μΆκ° λ³ν μ€λ²ν€λ μμ΄ ν¨μ¨μ μΈ λ©λͺ¨λ¦¬ μ μ‘κ³Ό GPUμ μ§μ μ κ·Όμ κ°λ₯νκ² ν©λλ€. - λ°μ΄ν° ν¨μ¨μ μΌλ‘ ν¨νΉνκΈ°: κ΄λ ¨ λ°μ΄ν°λ₯Ό κ·Έλ£Ήννμμμ€. μλ₯Ό λ€μ΄, μμΉ, λ²μ λ° UVμ λν΄ λ³λμ λ²νΌλ₯Ό μ¬μ©νλ λμ , λ λλ§ λ‘μ§μ λ¨μννκ³ λ°μΈλ© νΈμΆμ μ€μΈλ€λ©΄ λ¨μΌ VBOλ‘ μΈν°λ¦¬λΈνλ κ²μ κ³ λ €νμμμ€(λ¨, μ΄λ νΈλ μ΄λμ€νμ΄λ©°, λ€λ₯Έ μμ±μ΄ λ€λ₯Έ λ¨κ³μμ μ‘μΈμ€λλ κ²½μ° λ³λμ λ²νΌκ° μΊμ μ§μμ±μ λ μ’μ μ μμ΅λλ€). UBOμ κ²½μ°, λ°μ΄ν°λ₯Ό λ¨λ¨ν ν¨νΉνλ λ²νΌ ν¬κΈ°λ₯Ό μ΅μννκ³ μΊμ ννΈλ₯Ό ν₯μμν€κΈ° μν΄ μ λ ¬ κ·μΉμ μ€μνμμμ€.
νλ μμν¬ λ° λΌμ΄λΈλ¬λ¦¬
μ μΈκ³μ λ§μ κ°λ°μλ€μ΄ Three.js, Babylon.js, PlayCanvas λλ CesiumJSμ κ°μ WebGL λΌμ΄λΈλ¬λ¦¬ λ° νλ μμν¬λ₯Ό νμ©ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μ μμ€ WebGL APIμ λ§μ λΆλΆμ μΆμννκ³ μ’ μ’ μ¬κΈ°μ λ Όμλ λ§μ μ΅μ ν μ λ΅(λ°°μΉ, μΈμ€ν΄μ±, UBO κ΄λ¦¬)μ λ΄λΆμ μΌλ‘ ꡬνν©λλ€.
- λ΄λΆ λ©μ»€λμ¦ μ΄ν΄: νλ μμν¬λ₯Ό μ¬μ©ν λμλ λ΄λΆ 리μμ€ κ΄λ¦¬ λ°©μμ μ΄ν΄νλ κ²μ΄ μ μ΅ν©λλ€. μ΄ μ§μμ νλ μμν¬μ κΈ°λ₯μ λ ν¨κ³Όμ μΌλ‘ μ¬μ©νκ³ , μ΅μ νλ₯Ό 무ν¨νν μ μλ ν¨ν΄μ νΌνλ©°, μ±λ₯ λ¬Έμ λ₯Ό λ λ₯μνκ² λλ²κΉ ν μ μλλ‘ ν©λλ€. μλ₯Ό λ€μ΄, Three.jsκ° κ°μ²΄λ₯Ό λ¨Έν°λ¦¬μΌλ³λ‘ κ·Έλ£Ήννλ λ°©μμ μ΄ν΄νλ©΄ μ΅μ μ λ λλ§ μ±λ₯μ μν΄ μ¬ κ·Έλνλ₯Ό ꡬμ±νλ λ° λμμ΄ λ μ μμ΅λλ€.
- μ¬μ©μ μ μ λ° νμ₯μ±: λ§€μ° νΉνλ μ ν리μΌμ΄μ μ κ²½μ°, μ¬μ©μ μ μλκ³ λ―ΈμΈ μ‘°μ λ μ΅μ νλ₯Ό ꡬννκΈ° μν΄ νλ μμν¬μ λ λλ§ νμ΄νλΌμΈ μΌλΆλ₯Ό νμ₯νκ±°λ μ¬μ§μ΄ μ°νν΄μΌ ν μλ μμ΅λλ€.
λ―Έλ μ λ§: WebGPUμ 리μμ€ λ°μΈλ©μ λ―Έλ
WebGLμ΄ κ³μν΄μ κ°λ ₯νκ³ λ리 μ§μλλ APIμ΄μ§λ§, μ°¨μΈλ μΉ κ·Έλν½μΈ WebGPUλ μ΄λ―Έ λ€κ°μ€κ³ μμ΅λλ€. WebGPUλ Vulkan, Metal λ° DirectX 12μμ ν° μκ°μ λ°μ ν¨μ¬ λ λͺ μμ μ΄κ³ νλμ μΈ APIλ₯Ό μ 곡ν©λλ€.
- λͺ μμ λ°μΈλ© λͺ¨λΈ: WebGPUλ WebGLμ μ묡μ μΈ μν λ¨Έμ μμ λ²μ΄λ "λ°μΈλ κ·Έλ£Ή"κ³Ό "νμ΄νλΌμΈ"κ³Ό κ°μ κ°λ μ μ¬μ©νλ λ λͺ μμ μΈ λ°μΈλ© λͺ¨λΈλ‘ μ΄λν©λλ€. μ΄λ κ°λ°μμκ² λ¦¬μμ€ ν λΉ λ° λ°μΈλ©μ λν ν¨μ¬ λ μΈλ°ν μ μ΄κΆμ μ 곡νλ©°, μ’ μ’ νλ GPUμμ λ λμ μ±λ₯κ³Ό μμΈ‘ κ°λ₯ν λμμΌλ‘ μ΄μ΄μ§λλ€.
- κ°λ μ μ ν: WebGLμμ λ°°μ΄ λ§μ μ΅μ ν μμΉ(μν λ³κ²½ μ΅μν, λ°°μΉ, ν¨μ¨μ μΈ λ°μ΄ν° λ μ΄μμ, μ€λ§νΈν 리μμ€ κ΅¬μ±)μ λ€λ₯Έ APIλ₯Ό ν΅ν΄ ννλκΈ°λ νμ§λ§ WebGPUμμλ λ§€μ° μ€μνκ² λ¨μ κ²μ λλ€. WebGLμ 리μμ€ κ΄λ¦¬ κ³Όμ λ₯Ό μ΄ν΄νλ κ²μ WebGPUλ‘ μ ννκ³ νμν μ±κ³Όλ₯Ό λ΄κΈ° μν κ°λ ₯ν κΈ°λ°μ μ 곡ν©λλ€.
κ²°λ‘ : μ΅κ³ μ±λ₯μ μν WebGL 리μμ€ κ΄λ¦¬ λ§μ€ν°νκΈ°
ν¨μ¨μ μΈ WebGL μμ΄λ 리μμ€ λ°μΈλ©μ μ¬μν μμ μ μλμ§λ§, κ³ μ±λ₯μ λ°μμ± μκ³ μκ°μ μΌλ‘ λ§€λ ₯μ μΈ μΉ μ ν리μΌμ΄μ μ λ§λλ λ° μμ΄ κ·Έ μλ¬μ νμμ μ λλ€. μ±κ°ν¬λ₯΄μμ μΈν°λν°λΈ λ°μ΄ν° μκ°νλ₯Ό μ 곡νλ μ€ννΈμ λΆν° λ² λ₯Όλ¦°μμ 건μΆμ κ²½μ΄λ‘μμ μ 보μ΄λ λμμΈ νμ¬μ μ΄λ₯΄κΈ°κΉμ§, μ λμ μ΄κ³ κ³ νμ§μ κ·Έλν½μ λν μμλ 보νΈμ μ λλ€. μ΄ κ°μ΄λμμ μ€λͺ ν μ λ΅, μ¦ UBO λ° μΈμ€ν΄μ±κ³Ό κ°μ WebGL2 κΈ°λ₯μ μμ©νκ³ , λ°°μΉ λ° ν μ€μ² μνλΌμ€λ₯Ό ν΅ν΄ 리μμ€λ₯Ό κΌΌκΌΌνκ² κ΅¬μ±νλ©°, νμ μν μ΅μνλ₯Ό μ°μ μν¨μΌλ‘μ¨ μλΉν μ±λ₯ ν₯μμ μ΄λμ΄λΌ μ μμ΅λλ€.
μ΅μ νλ λ°λ³΅μ μΈ κ³Όμ μμ κΈ°μ΅νμμμ€. κΈ°λ³Έμ λν νμ€ν μ΄ν΄λ‘ μμνκ³ , μ μ§μ μΌλ‘ κ°μ μ¬νμ ꡬννλ©°, λ€μν νλμ¨μ΄ λ° λΈλΌμ°μ νκ²½μμ μ격ν νλ‘νμΌλ§μ ν΅ν΄ λ³κ²½ μ¬νμ νμ κ²μ¦νμμμ€. λͺ©νλ λ¨μν μ ν리μΌμ΄μ μ μ€νμν€λ κ²μ΄ μλλΌ, κ·Έκ²μ΄ λΉμνλλ‘ λ§λ€μ΄ μ μΈκ³ μ¬μ©μλ€μκ² μ₯μΉλ μμΉμ κ΄κ³μμ΄ νμν μκ°μ κ²½νμ μ 곡νλ κ²μ λλ€. μ΄λ¬ν κΈ°μ μ λ°μλ€μ΄λ©΄ μΉμμ μ€μκ° 3Dλ‘ κ°λ₯ν κ²μ νκ³λ₯Ό λ°μ΄λμ μ€λΉκ° μ λμ΄ μμ κ²μ λλ€.