WebGL ์ ฐ์ด๋ ๋งค๊ฐ๋ณ์์ ์ฑ๋ฅ ์ํฅ๊ณผ ์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ๊ด๋ จ ์ค๋ฒํค๋๋ฅผ ์ดํด๋ณด์ธ์. WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ํฅ์์ํค๋ ์ต์ ํ ๊ธฐ๋ฒ์ ์์๋ณด์ธ์.
WebGL ์ ฐ์ด๋ ๋งค๊ฐ๋ณ์์ ์ฑ๋ฅ ์ํฅ: ์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ์ค๋ฒํค๋
WebGL์ ์น์ ๊ฐ๋ ฅํ 3D ๊ทธ๋ํฝ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ๋ชฐ์ ๊ฐ ์๊ณ ์๊ฐ์ ์ผ๋ก ๋ฐ์ด๋ ๊ฒฝํ์ ๋ง๋ค ์ ์๊ฒ ํฉ๋๋ค. ๊ทธ๋ฌ๋ WebGL์์ ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๋ ค๋ฉด ๊ธฐ๋ณธ ์ํคํ ์ฒ์ ๋ค์ํ ์ฝ๋ฉ ๋ฐฉ์์ ์ฑ๋ฅ ์ํฅ์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํฉ๋๋ค. ์ข ์ข ๊ฐ๊ณผ๋๋ ์ค์ํ ์ธก๋ฉด ์ค ํ๋๋ ์ ฐ์ด๋ ๋งค๊ฐ๋ณ์์ ์ฑ๋ฅ ์ํฅ๊ณผ ์ด์ ๊ด๋ จ๋ ์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ์ค๋ฒํค๋์ ๋๋ค.
์ ฐ์ด๋ ๋งค๊ฐ๋ณ์ ์ดํดํ๊ธฐ: ์ดํธ๋ฆฌ๋ทฐํธ์ ์ ๋ํผ
์ ฐ์ด๋๋ GPU์์ ์คํ๋๋ ์์ ํ๋ก๊ทธ๋จ์ผ๋ก, ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๋ ๋๋ง๋ ์ง ๊ฒฐ์ ํฉ๋๋ค. ์ ฐ์ด๋๋ ๋ ๊ฐ์ง ์ฃผ์ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ต๋๋ค:
- ์ดํธ๋ฆฌ๋ทฐํธ(Attributes): ์ดํธ๋ฆฌ๋ทฐํธ๋ ์ ์ ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์ ฐ์ด๋์ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์๋ก๋ ์ ์ ์์น, ๋ฒ์ , ํ ์ค์ฒ ์ขํ, ์์ ๋ฑ์ด ์์ต๋๋ค. ๊ฐ ์ ์ ์ ๊ฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํด ๊ณ ์ ํ ๊ฐ์ ๋ฐ์ต๋๋ค.
- ์ ๋ํผ(Uniforms): ์ ๋ํผ์ ์ฃผ์ด์ง ๋๋ก์ฐ ์ฝ์ ๋ํด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์ผ์ ํ๊ฒ ์ ์ง๋๋ ์ ์ญ ๋ณ์์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ณํ ํ๋ ฌ, ์กฐ๋ช ๋งค๊ฐ๋ณ์, ํ ์ค์ฒ ์ํ๋ฌ์ ๊ฐ์ด ๋ชจ๋ ์ ์ ์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ดํธ๋ฆฌ๋ทฐํธ์ ์ ๋ํผ ์ค ์ด๋ค ๊ฒ์ ์ ํํ ์ง๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ ์ ๋ง๋ค ๋ฌ๋ผ์ง๋ ๋ฐ์ดํฐ๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ก ์ ๋ฌํด์ผ ํ๋ฉฐ, ๋๋ก์ฐ ์ฝ ๋ด์ ๋ชจ๋ ์ ์ ์์ ์ผ์ ํ ๋ฐ์ดํฐ๋ ์ ๋ํผ์ผ๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ ์ ํ
์ดํธ๋ฆฌ๋ทฐํธ์ ์ ๋ํผ ๋ชจ๋ ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฃผ์ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- float: ๋จ์ ๋ฐ๋ ๋ถ๋ ์์์ ์.
- vec2, vec3, vec4: 2, 3, 4๊ฐ ๊ตฌ์ฑ ์์์ ๋ถ๋ ์์์ ๋ฒกํฐ.
- mat2, mat3, mat4: 2x2, 3x3, 4x4 ๋ถ๋ ์์์ ํ๋ ฌ.
- int: ์ ์.
- ivec2, ivec3, ivec4: 2, 3, 4๊ฐ ๊ตฌ์ฑ ์์์ ์ ์ ๋ฒกํฐ.
- sampler2D, samplerCube: ํ ์ค์ฒ ์ํ๋ฌ ์ ํ.
๋ฐ์ดํฐ ์ ํ์ ์ ํ ๋ํ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, `int`๋ก ์ถฉ๋ถํ ๊ณณ์ `float`๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, `vec3`๋ก ์ถฉ๋ถํ ๊ณณ์ `vec4`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ํ์ ์ ๋ฐ๋์ ํฌ๊ธฐ๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ์ค๋ฒํค๋: ์จ๊ฒจ์ง ๋น์ฉ
์ฅ๋ฉด์ ๋ ๋๋งํ ๋ WebGL์ ๊ฐ ๋๋ก์ฐ ์ฝ ์ ์ ์ ฐ์ด๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ๋ผ๊ณ ์๋ ค์ง ์ด ๊ณผ์ ์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ฐ์ธ๋ฉํ๊ณ , ์ ๋ํผ ๊ฐ์ ์ค์ ํ๊ณ , ์ดํธ๋ฆฌ๋ทฐํธ ๋ฒํผ๋ฅผ ํ์ฑํํ๊ณ ๋ฐ์ธ๋ฉํ๋ ์์ ์ ํฌํจํฉ๋๋ค. ์ด ์ค๋ฒํค๋๋ ํนํ ๋ง์ ์์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๊ฑฐ๋ ์ ฐ์ด๋ ๋งค๊ฐ๋ณ์๋ฅผ ์์ฃผ ๋ณ๊ฒฝํ ๋ ์๋นํด์ง ์ ์์ต๋๋ค.
์ ฐ์ด๋ ์ํ ๋ณ๊ฒฝ์ ์ฑ๋ฅ ์ํฅ์ ์ฌ๋ฌ ์์ธ์์ ๋น๋กฏ๋ฉ๋๋ค:
- GPU ํ์ดํ๋ผ์ธ ํ๋ฌ์: ์ ฐ์ด๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ข ์ข GPU๊ฐ ๋ด๋ถ ํ์ดํ๋ผ์ธ์ ํ๋ฌ์(flush)ํ๊ฒ ๋๋๋ฐ, ์ด๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋๋ค. ํ์ดํ๋ผ์ธ ํ๋ฌ์๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฐ์์ ์ธ ํ๋ฆ์ ์ค๋จ์์ผ GPU๋ฅผ ์ง์ฐ์ํค๊ณ ์ ์ฒด ์ฒ๋ฆฌ๋์ ๊ฐ์์ํต๋๋ค.
- ๋๋ผ์ด๋ฒ ์ค๋ฒํค๋: WebGL ๊ตฌํ์ ์ค์ ํ๋์จ์ด ์์ ์ ์ํํ๊ธฐ ์ํด ๊ธฐ๋ณธ OpenGL(๋๋ OpenGL ES) ๋๋ผ์ด๋ฒ์ ์์กดํฉ๋๋ค. ์ ฐ์ด๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋๋ผ์ด๋ฒ๋ฅผ ํธ์ถํ๋ ๊ฒ์ ํฌํจํ๋ฉฐ, ์ด๋ ํนํ ๋ณต์กํ ์ฅ๋ฉด์์ ์๋นํ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก: ์ ๋ํผ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ CPU์์ GPU๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ์ ์ก์ ํนํ ํฐ ํ๋ ฌ์ด๋ ํ ์ค์ฒ๋ฅผ ๋ค๋ฃฐ ๋ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. ์ ์ก๋๋ ๋ฐ์ดํฐ ์์ ์ต์ํํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ค์ํฉ๋๋ค.
์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ์ค๋ฒํค๋์ ํฌ๊ธฐ๋ ํน์ ํ๋์จ์ด ๋ฐ ๋๋ผ์ด๋ฒ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด ๊ฐ๋ฐ์๋ ์ด ์ค๋ฒํค๋๋ฅผ ์ํํ๋ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ์ค๋ฒํค๋ ์ต์ํ ์ ๋ต
์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ์ํฅ์ ์ต์ํํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ๋ต์ ๋ช ๊ฐ์ง ์ฃผ์ ์์ญ์ผ๋ก ๋๋ฉ๋๋ค:
1. ์ํ ๋ณ๊ฒฝ ์ค์ด๊ธฐ
์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ํ ๋ณ๊ฒฝ ํ์๋ฅผ ์ต์ํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ธฐ์ ์ ํตํด ๋ฌ์ฑํ ์ ์์ต๋๋ค:
- ๋๋ก์ฐ ์ฝ ๋ฐฐ์น(Batching): ๋์ผํ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ๊ณผ ์ฌ์ง ์์ฑ์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ค์ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๊ทธ๋ฃนํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ฐ์ธ๋ฉํ๊ณ ์ ๋ํผ ๊ฐ์ ์ค์ ํด์ผ ํ๋ ํ์๊ฐ ์ค์ด๋ญ๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์ฌ์ง์ ๊ฐ์ง 100๊ฐ์ ํ๋ธ๊ฐ ์๋ค๋ฉด, 100๋ฒ์ ๊ฐ๋ณ ํธ์ถ ๋์ ๋จ์ผ `gl.drawElements()` ํธ์ถ๋ก ๋ชจ๋ ๋ ๋๋งํฉ๋๋ค.
- ํ ์ค์ฒ ์ํ๋ผ์ค ์ฌ์ฉ: ์ฌ๋ฌ ๊ฐ์ ์์ ํ ์ค์ฒ๋ฅผ ํ ์ค์ฒ ์ํ๋ผ์ค๋ผ๊ณ ํ๋ ํ๋์ ํฐ ํ ์ค์ฒ๋ก ๊ฒฐํฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋จ์ํ ํ ์ค์ฒ ์ขํ๋ฅผ ์กฐ์ ํ์ฌ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋ค๋ฅธ ํ ์ค์ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ UI ์์, ์คํ๋ผ์ดํธ ๋ฐ ๋ง์ ์์ ํ ์ค์ฒ๊ฐ ์๋ ๋ค๋ฅธ ์ํฉ์์ ํนํ ํจ๊ณผ์ ์ ๋๋ค.
- ๋จธํฐ๋ฆฌ์ผ ์ธ์คํด์ฑ: ์ฝ๊ฐ ๋ค๋ฅธ ์ฌ์ง ์์ฑ(์: ๋ค๋ฅธ ์์์ด๋ ํ ์ค์ฒ)์ ๊ฐ์ง ๋ง์ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ ๋จธํฐ๋ฆฌ์ผ ์ธ์คํด์ฑ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ฅผ ํตํด ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋ค๋ฅธ ์ฌ์ง ์์ฑ์ ๊ฐ์ง ๋์ผํ ๊ฐ์ฒด์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ `ANGLE_instanced_arrays`์ ๊ฐ์ ํ์ฅ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์ฌ์ง๋ณ ์ ๋ ฌ: ์ฅ๋ฉด์ ๋ ๋๋งํ ๋, ๋ ๋๋งํ๊ธฐ ์ ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ง ์์ฑ๋ณ๋ก ์ ๋ ฌํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋์ผํ ์ฌ์ง์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ํจ๊ป ๋ ๋๋ง๋์ด ์ํ ๋ณ๊ฒฝ ํ์๊ฐ ์ต์ํ๋ฉ๋๋ค.
2. ์ ๋ํผ ์ ๋ฐ์ดํธ ์ต์ ํ
์ ๋ํผ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์๋นํ ์ค๋ฒํค๋์ ์์ธ์ด ๋ ์ ์์ต๋๋ค. ์ ๋ํผ์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ต์ ํํ๋ฉด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- `uniformMatrix4fv` ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ: ํ๋ ฌ ์ ๋ํผ์ ์ค์ ํ ๋, ํ๋ ฌ์ด ์ด๋ฏธ ์ด ์ฐ์ ์์(WebGL์ ํ์ค)์ธ ๊ฒฝ์ฐ `transpose` ๋งค๊ฐ๋ณ์๋ฅผ `false`๋ก ์ค์ ํ์ฌ `uniformMatrix4fv` ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ถํ์ํ ์ ์น ์ฐ์ฐ์ ํผํ๊ฒ ํด์ค๋๋ค.
- ์ ๋ํผ ์์น ์บ์ฑ: `gl.getUniformLocation()`์ ์ฌ์ฉํ์ฌ ๊ฐ ์ ๋ํผ์ ์์น๋ฅผ ํ ๋ฒ๋ง ๊ฒ์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋น๊ต์ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์๋ ์ด ํจ์์ ๋ฐ๋ณต์ ์ธ ํธ์ถ์ ํผํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก ์ต์ํ: ์ค์ ๋ก ๋ณ๊ฒฝ๋ ๋๋ง ์ ๋ํผ ๊ฐ์ ์ ๋ฐ์ดํธํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก์ ํผํฉ๋๋ค. ์ ๋ํผ์ ์ค์ ํ๊ธฐ ์ ์ ์ ๊ฐ์ด ์ด์ ๊ฐ๊ณผ ๋ค๋ฅธ์ง ํ์ธํฉ๋๋ค.
- ์ ๋ํผ ๋ฒํผ ์ฌ์ฉ (WebGL 2.0): WebGL 2.0์ ์ฌ๋ฌ ์ ๋ํผ ๊ฐ์ ๋จ์ผ ๋ฒํผ ๊ฐ์ฒด๋ก ๊ทธ๋ฃนํํ๊ณ ๋จ์ผ `gl.bufferData()` ํธ์ถ๋ก ์ ๋ฐ์ดํธํ ์ ์๋ ์ ๋ํผ ๋ฒํผ๋ฅผ ๋์ ํ์ต๋๋ค. ์ด๋ ํนํ ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ฌ๋ฌ ์ ๋ํผ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. ์ ๋ํผ ๋ฒํผ๋ ์กฐ๋ช ๋งค๊ฐ๋ณ์ ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ด ๋ง์ ์ ๋ํผ ๊ฐ์ ์์ฃผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ์ํฉ์์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
3. ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ดํฐ ์ต์ ํ
์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํ๋ ๊ฒ ๋ํ ์ฑ๋ฅ์ ์ค์ํฉ๋๋ค.
- ์ธํฐ๋ฆฌ๋ธ๋ ์ ์ ๋ฐ์ดํฐ ์ฌ์ฉ: ๊ด๋ จ ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ดํฐ(์: ์์น, ๋ฒ์ , ํ ์ค์ฒ ์ขํ)๋ฅผ ๋จ์ผ ์ธํฐ๋ฆฌ๋ธ๋ ๋ฒํผ์ ์ ์ฅํฉ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ง์ญ์ฑ์ ํฅ์์ํค๊ณ ํ์ํ ๋ฒํผ ๋ฐ์ธ๋ฉ ์๋ฅผ ์ค์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์์น, ๋ฒ์ , ํ ์ค์ฒ ์ขํ์ ๋ํ ๋ณ๋์ ๋ฒํผ๋ฅผ ๋๋ ๋์ , ์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ธํฐ๋ฆฌ๋ธ๋ ํ์์ผ๋ก ํฌํจํ๋ ๋จ์ผ ๋ฒํผ๋ฅผ ๋ง๋ญ๋๋ค: `[x, y, z, nx, ny, nz, u, v, x, y, z, nx, ny, nz, u, v, ...]`
- ์ ์ ๋ฐฐ์ด ๊ฐ์ฒด (VAO) ์ฌ์ฉ: VAO๋ ๋ฒํผ ๊ฐ์ฒด, ์ดํธ๋ฆฌ๋ทฐํธ ์์น, ๋ฐ์ดํฐ ํ์์ ํฌํจํ์ฌ ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ธ๋ฉ๊ณผ ๊ด๋ จ๋ ์ํ๋ฅผ ์บก์ํํฉ๋๋ค. VAO๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ๋๋ก์ฐ ์ฝ์ ๋ํ ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ธ๋ฉ ์ค์ ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. VAO๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ธ๋ฉ์ ๋ฏธ๋ฆฌ ์ ์ํ ๋ค์ ๊ฐ ๋๋ก์ฐ ์ฝ ์ ์ VAO๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ฏ๋ก, `gl.bindBuffer()`, `gl.vertexAttribPointer()`, `gl.enableVertexAttribArray()`๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค.
- ์ธ์คํด์ค ๋ ๋๋ง ์ฌ์ฉ: ๋์ผํ ๊ฐ์ฒด์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด ์ธ์คํด์ค ๋ ๋๋ง(์: `ANGLE_instanced_arrays` ํ์ฅ ์ฌ์ฉ)์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ ๋๋งํ์ฌ ์ํ ๋ณ๊ฒฝ ๋ฐ ๋๋ก์ฐ ์ฝ ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ์ ์ ๋ฒํผ ๊ฐ์ฒด (VBO) ํ๋ช ํ๊ฒ ๊ณ ๋ คํ๊ธฐ: VBO๋ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ์ ์ ์ง์ค๋ฉํธ๋ฆฌ์ ์ด์์ ์ ๋๋ค. ์ง์ค๋ฉํธ๋ฆฌ๊ฐ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ๊ฒฝ์ฐ, ๊ธฐ์กด VBO๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธ(`gl.bufferSubData` ์ฌ์ฉ)ํ๊ฑฐ๋ ํธ๋์คํผ ํผ๋๋ฐฑ์ ์ฌ์ฉํ์ฌ GPU์์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฑ์ ๋์์ ํ์ํ์ญ์์ค.
4. ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ์ต์ ํ
์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ์์ฒด๋ฅผ ์ต์ ํํ๋ ๊ฒ๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ ฐ์ด๋ ๋ณต์ก๋ ์ค์ด๊ธฐ: ๋ถํ์ํ ๊ณ์ฐ์ ์ ๊ฑฐํ๊ณ ๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ ฐ์ด๋ ์ฝ๋๋ฅผ ๋จ์ํํฉ๋๋ค. ์ ฐ์ด๋๊ฐ ๋ณต์กํ ์๋ก ๋ ๋ง์ ์ฒ๋ฆฌ ์๊ฐ์ด ํ์ํฉ๋๋ค.
- ๋ ๋ฎ์ ์ ๋ฐ๋ ๋ฐ์ดํฐ ์ ํ ์ฌ์ฉ: ๊ฐ๋ฅํ๋ฉด ๋ ๋ฎ์ ์ ๋ฐ๋ ๋ฐ์ดํฐ ์ ํ(์: `mediump` ๋๋ `lowp`)์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ผ๋ถ ์ฅ์น, ํนํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ฌํ ํค์๋๋ก ์ ๊ณต๋๋ ์ค์ ์ ๋ฐ๋๋ ํ๋์จ์ด์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ํ ์ค์ฒ ์กฐํ ์ต์ํ: ํ ์ค์ฒ ์กฐํ๋ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ฑฐ๋ ๋ฐ๋งคํ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์๊ฑฐ๋ฆฌ์ ์๋ ํ ์ค์ฒ์ ํด์๋๋ฅผ ์ค์ฌ ์ ฐ์ด๋ ์ฝ๋์์ ํ ์ค์ฒ ์กฐํ ํ์๋ฅผ ์ต์ํํฉ๋๋ค.
- ์กฐ๊ธฐ Z ๋ฆฌ์ ์ (Early Z Rejection): ์ ฐ์ด๋ ์ฝ๋๊ฐ GPU๊ฐ ์กฐ๊ธฐ Z ๋ฆฌ์ ์ ์ ์ํํ ์ ์๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐํ๋์๋์ง ํ์ธํฉ๋๋ค. ์ด๊ฒ์ GPU๊ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ค๋ฅธ ํ๋๊ทธ๋จผํธ ๋ค์ ์จ๊ฒจ์ง ํ๋๊ทธ๋จผํธ๋ฅผ ํ๊ธฐํ์ฌ ์๋นํ ์ฒ๋ฆฌ ์๊ฐ์ ์ ์ฝํ ์ ์๊ฒ ํ๋ ๊ธฐ์ ์ ๋๋ค. ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ์ฝ๋๊ฐ `gl_FragDepth`๋ฅผ ๊ฐ๋ฅํ ํ ๋ฆ๊ฒ ์์ ํ๋๋ก ์์ฑํ์ญ์์ค.
5. ํ๋กํ์ผ๋ง ๋ฐ ๋๋ฒ๊น
ํ๋กํ์ผ๋ง์ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ ๋ฌธ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ ์คํ ์๊ฐ์ ์ธก์ ํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ ์์ญ์ ์๋ณํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ (Chrome DevTools, Firefox Developer Tools): ์ด ๋๊ตฌ๋ค์ WebGL ํธ์ถ์ ํฌํจํ์ฌ JavaScript ์ฝ๋์ ์คํ ์๊ฐ์ ์ธก์ ํ ์ ์๋ ๋ด์ฅ ํ๋กํ์ผ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- WebGL Insight: WebGL ์ํ ๋ฐ ์ฑ๋ฅ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ ๋ฌธ WebGL ๋๋ฒ๊น ๋๊ตฌ์ ๋๋ค.
- Spector.js: WebGL ๋ช ๋ น์ ์บก์ฒํ๊ณ ๊ฒ์ฌํ ์ ์๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ ๋ฐ ์์
์ด๋ฌํ ๊ฐ๋ ์ ์ค์ ์์ ๋ฅผ ํตํด ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค:
์์ 1: ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์๋ ๊ฐ๋จํ ์ฅ๋ฉด ์ต์ ํ
๊ฐ๊ธฐ ๋ค๋ฅธ ์์์ ๊ฐ์ง 1000๊ฐ์ ํ๋ธ๊ฐ ์๋ ์ฅ๋ฉด์ ์์ํด ๋ณด์ญ์์ค. ๋จ์ํ ๊ตฌํ์ ๊ฐ ํ๋ธ๋ฅผ ๋ณ๋์ ๋๋ก์ฐ ์ฝ๋ก ๋ ๋๋งํ๊ณ ๊ฐ ํธ์ถ ์ ์ ์์ ์ ๋ํผ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ 1000๋ฒ์ ์ ๋ํผ ์ ๋ฐ์ดํธ๋ฅผ ์ด๋ํ์ฌ ์๋นํ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค.
๋์ , ์ฐ๋ฆฌ๋ ๋จธํฐ๋ฆฌ์ผ ์ธ์คํด์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ธ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๋จ์ผ VBO์ ๊ฐ ์ธ์คํด์ค์ ์์์ ํฌํจํ๋ ๋ณ๋์ VBO๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ `ANGLE_instanced_arrays` ํ์ฅ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ 1000๊ฐ์ ํ๋ธ๋ฅผ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋ ๋๋งํ๊ณ ์์ ๋ฐ์ดํฐ๋ฅผ ์ธ์คํด์ค ์ดํธ๋ฆฌ๋ทฐํธ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
์ด๋ ์ ๋ํผ ์ ๋ฐ์ดํธ์ ๋๋ก์ฐ ์ฝ์ ์๋ฅผ ๊ธ๊ฒฉํ ์ค์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
์์ 2: ์งํ ๋ ๋๋ง ์์ง ์ต์ ํ
์งํ ๋ ๋๋ง์ ์ข ์ข ๋ง์ ์์ ์ผ๊ฐํ์ ๋ ๋๋งํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋จ์ํ ๊ตฌํ์ ๊ฐ ์งํ ์ฒญํฌ์ ๋ํด ๋ณ๋์ ๋๋ก์ฐ ์ฝ์ ์ฌ์ฉํ์ฌ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
๋์ , ์ฐ๋ฆฌ๋ ์ง์ค๋ฉํธ๋ฆฌ ํด๋ฆฝ๋งต์ด๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์งํ์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ง์ค๋ฉํธ๋ฆฌ ํด๋ฆฝ๋งต์ ์งํ์ ์ฌ๋ฌ ๋จ๊ณ์ ๋ํ ์ผ(LOD) ๊ณ์ธต์ผ๋ก ๋๋๋๋ค. ์นด๋ฉ๋ผ์ ๊ฐ๊น์ด LOD๋ ๋ ๋์ ๋ํ ์ผ๋ก ๋ ๋๋ง๋๊ณ , ๋ฉ๋ฆฌ ์๋ LOD๋ ๋ ๋ฎ์ ๋ํ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค. ์ด๋ ๋ ๋๋งํด์ผ ํ ์ผ๊ฐํ์ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ๋ํ, ํ๋ฌ์คํ ์ปฌ๋ง๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ณด์ด๋ ์งํ ๋ถ๋ถ๋ง ๋ ๋๋งํ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก, ์ ๋ํผ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ๋ช ๋งค๊ฐ๋ณ์๋ ๋ค๋ฅธ ์ ์ญ ์งํ ์์ฑ์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
์ ์ธ๊ณ์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ ๋ค์ํ ํ๋์จ์ด ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๋งฅ๋ฝ์์ ์ฑ๋ฅ ์ต์ ํ๋ ๋์ฑ ์ค์ํฉ๋๋ค.
- ๊ฐ์ฅ ๋ฎ์ ๊ณตํต ๋ถ๋ชจ๋ฅผ ๋ชฉํ๋ก ํ๊ธฐ: ๋ชจ๋ฐ์ผ ํฐ์ด๋ ๊ตฌํ ์ปดํจํฐ์ ๊ฐ์ ์ ์ฌ์ ์ฅ์น์์๋ ์ํํ๊ฒ ์คํ๋๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋์ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฆ๊ธธ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ์ต์ ์ ๊ณต: ์ฌ์ฉ์๊ฐ ํ๋์จ์ด ์ฑ๋ฅ์ ๋ง๊ฒ ๊ทธ๋ํฝ ์ค์ ์ ์กฐ์ ํ ์ ์๋๋ก ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํด์๋๋ฅผ ์ค์ด๊ฑฐ๋, ํน์ ํจ๊ณผ๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋, ๋ํ ์ผ ์์ค์ ๋ฎ์ถ๋ ์ต์ ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๋ชจ๋ฐ์ผ ์ฅ์น ์ต์ ํ: ๋ชจ๋ฐ์ผ ์ฅ์น๋ ์ฒ๋ฆฌ ๋ฅ๋ ฅ๊ณผ ๋ฐฐํฐ๋ฆฌ ์๋ช ์ด ์ ํ์ ์ ๋๋ค. ์ ํด์๋ ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ๊ณ , ๋๋ก์ฐ ์ฝ ์๋ฅผ ์ค์ด๊ณ , ์ ฐ์ด๋ ๋ณต์ก๋๋ฅผ ์ต์ํํ์ฌ ๋ชจ๋ฐ์ผ ์ฅ์น์ ๋ง๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํฉ๋๋ค.
- ๋ค์ํ ์ฅ์น์์ ํ ์คํธ: ๋ค์ํ ์ฅ์น์ ๋ธ๋ผ์ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ฌ ๋ชจ๋ ํ๊ฒฝ์์ ์ ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
- ์ ์ํ ๋ ๋๋ง ๊ณ ๋ ค: ์ฅ์น์ ์ฑ๋ฅ์ ๋ฐ๋ผ ๊ทธ๋ํฝ ์ค์ ์ ๋์ ์ผ๋ก ์กฐ์ ํ๋ ์ ์ํ ๋ ๋๋ง ๊ธฐ์ ์ ๊ตฌํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ํ๋์จ์ด ๊ตฌ์ฑ์ ๋ง๊ฒ ์๋์ผ๋ก ์ต์ ํ๋ ์ ์์ต๋๋ค.
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN): CDN์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ง๋ฆฌ์ ์ผ๋ก ๊ฐ๊น์ด ์๋ฒ์์ WebGL ์์ (ํ ์ค์ฒ, ๋ชจ๋ธ, ์ ฐ์ด๋)์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํนํ ์ธ๊ณ ๋ค๋ฅธ ์ง์ญ์ ์ฌ์ฉ์๋ค์๊ฒ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค. ์์ ์ ๋น ๋ฅด๊ณ ์์ ์ ์ธ ์ ์ก์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ธ๋ก๋ฒ ์๋ฒ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ถ CDN ์ ๊ณต์ ์ฒด๋ฅผ ์ ํํ์ญ์์ค.
๊ฒฐ๋ก
์ ฐ์ด๋ ๋งค๊ฐ๋ณ์์ ์ ฐ์ด๋ ์ํ ์ฒ๋ฆฌ ์ค๋ฒํค๋์ ์ฑ๋ฅ ์ํฅ์ ์ดํดํ๋ ๊ฒ์ ๊ณ ์ฑ๋ฅ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ธ์์ ์ค๋ช ํ ๊ธฐ์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ด ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋๋ก์ฐ ์ฝ ๋ฐฐ์น, ์ ๋ํผ ์ ๋ฐ์ดํธ ์ต์ ํ, ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ดํฐ์ ํจ์จ์ ์ธ ๊ด๋ฆฌ, ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ์ต์ ํ, ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ธฐ ์ํ ์ฝ๋ ํ๋กํ์ผ๋ง์ ์ฐ์ ์์์ ๋๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์ด๋ฌํ ์์ญ์ ์ง์คํจ์ผ๋ก์จ ๋ค์ํ ์ฅ์น์์ ์ํํ๊ฒ ์คํ๋๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ํ๋ฅญํ ๊ฒฝํ์ ์ ๊ณตํ๋ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
WebGL ๊ธฐ์ ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์ต์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ง์์ ์ผ๋ก ์ป๋ ๊ฒ์ ์น์์ ์ต์ฒจ๋จ 3D ๊ทธ๋ํฝ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ํ์์ ์ ๋๋ค.