WebGL์ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ ๊ฐ๋ ์ ์ดํด๋ณด๊ณ , ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ดํดํ๋ฉฐ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ๋ถ๋๋ฝ๊ณ ๋น ๋ฅธ ๋ ๋๋ง์ ์ํ ํจ๊ณผ์ ์ธ ์ ฐ์ด๋ ์ํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
WebGL ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์: ์ฑ๋ฅ์ ์ํ ์ ฐ์ด๋ ์ํ ์ต์ ํ
WebGL์ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ 2D ๋ฐ 3D ๊ทธ๋ํฝ์ ๋ ๋๋งํ๊ธฐ ์ํ ๊ฐ๋ ฅํ API์ ๋๋ค. ๊ทธ๋ฌ๋ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๋ ค๋ฉด ๊ธฐ๋ณธ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ํ ๊น์ ์ดํด์ ์ ฐ์ด๋ ์ํ์ ํจ์จ์ ์ธ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์ด ์ค ์ค์ํ ์ธก๋ฉด ์ค ํ๋๊ฐ ์ ฐ์ด๋ ์ํ ์บ์ฑ์ด๋ผ๊ณ ๋ ์๋ ค์ง ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์์ ๋๋ค. ์ด ๊ธ์์๋ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ๊ฐ๋ ์ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ด๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ค๋ช ํฉ๋๋ค.
WebGL ๋ ๋๋ง ํ์ดํ๋ผ์ธ ์ดํดํ๊ธฐ
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ WebGL ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๊ธฐ๋ณธ ๋จ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ์ดํ๋ผ์ธ์ ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค:
- ์ ์ ์ ฐ์ด๋(Vertex Shader): ์ง์ค๋ฉํธ๋ฆฌ์ ์ ์ ์ ์ฒ๋ฆฌํ์ฌ ๋ชจ๋ธ ๊ณต๊ฐ์์ ํ๋ฉด ๊ณต๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค.
- ๋์คํฐํ(Rasterization): ๋ณํ๋ ์ ์ ์ ํ๋๊ทธ๋จผํธ(์ ์ฌ์ ํฝ์ )๋ก ๋ณํํฉ๋๋ค.
- ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋(Fragment Shader): ์กฐ๋ช , ํ ์ค์ฒ, ์ฌ์ง ์์ฑ๊ณผ ๊ฐ์ ๋ค์ํ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ํ๋๊ทธ๋จผํธ์ ์์์ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ธ๋ ๋ฉ ๋ฐ ์ถ๋ ฅ(Blending and Output): ํ๋๊ทธ๋จผํธ ์์์ ๊ธฐ์กด ํ๋ ์๋ฒํผ ์ฝํ ์ธ ์ ๊ฒฐํฉํ์ฌ ์ต์ข ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ฌํ ๊ฐ ๋จ๊ณ๋ ์ฌ์ฉ ์ค์ธ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ, ํ์ฑ ํ ์ค์ฒ, ์ ฐ์ด๋ ์ ๋ํผ(uniform) ๊ฐ๊ณผ ๊ฐ์ ํน์ ์ํ ๋ณ์์ ์์กดํฉ๋๋ค. ์ด๋ฌํ ์ํ ๋ณ์๋ฅผ ์์ฃผ ๋ณ๊ฒฝํ๋ฉด ์๋นํ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ด๋ ๋ฌด์์ธ๊ฐ?
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ WebGL ๊ตฌํ์ด ์ ฐ์ด๋ ์ ๋ํผ ๋ฐ ๊ธฐํ ์ํ ๋ณ์๋ฅผ ์ค์ ํ๋ ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋๋ค. ์ ๋ํผ ๊ฐ์ ์ค์ ํ๊ฑฐ๋ ํ ์ค์ฒ๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด WebGL ํจ์๋ฅผ ํธ์ถํ๋ฉด, ๊ตฌํ์ ์ ๊ฐ์ด ์ด์ ์ ์ค์ ๋ ๊ฐ๊ณผ ๋์ผํ์ง ํ์ธํฉ๋๋ค. ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ๊ตฌํ์ ์ค์ ์ ๋ฐ์ดํธ ์์ ์ ๊ฑด๋๋ฐ์ด GPU์์ ๋ถํ์ํ ํต์ ์ ํผํ ์ ์์ต๋๋ค. ์ด ์ต์ ํ๋ ๋์ผํ ์ฌ์ง์ ๊ณต์ ํ๋ ๋ง์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๊ฑฐ๋ ์ฒ์ฒํ ๋ณํ๋ ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ ๋๋ฉ์ด์ ํ ๋ ํนํ ํจ๊ณผ์ ์ ๋๋ค.
๊ฐ ์ ๋ํผ๊ณผ ์์ฑ์ ๋ํด ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋ ๊ฐ์ ๊ธฐ์ตํ๋ ๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์ ์ค์ ํ๋ ค๊ณ ํ๋ฉด WebGL์ ์ด๋ฅผ ์ค๋งํธํ๊ฒ ์ธ์ํ๊ณ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ GPU์ ๋ค์ ๋ณด๋ด๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋จ๊ณ๋ฅผ ๊ฑด๋๋๋๋ค. ์ด ๊ฐ๋จํ ์ต์ ํ๋ ํนํ ๋ณต์กํ ์ฅ๋ฉด์์ ๋๋ผ์ธ ์ ๋๋ก ํฐ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ด ์ค์ํ ์ด์
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ด ์ค์ํ ์ฃผ๋ ์ด์ ๋ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ ๋๋ฌธ์ ๋๋ค. ๋ถํ์ํ ์ํ ๋ณ๊ฒฝ์ ํผํจ์ผ๋ก์จ CPU์ GPU ๋ชจ๋์ ์์ ๋ถํ๋ฅผ ์ค์ฌ ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํ๋ ์ ์๋ ํฅ์: ์ค๋ฒํค๋๊ฐ ๊ฐ์ํ๋ฉด ๋ ๋๋ง ์๊ฐ์ด ๋จ์ถ๋์ด ๋ ๋์ ํ๋ ์ ์๋์ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- CPU ์ฌ์ฉ๋ฅ ๊ฐ์: GPU์ ๋ํ ๋ถํ์ํ ํธ์ถ์ด ์ค์ด๋ค์ด CPU ๋ฆฌ์์ค๋ฅผ ๊ฒ์ ๋ก์ง์ด๋ UI ์ ๋ฐ์ดํธ์ ๊ฐ์ ๋ค๋ฅธ ์์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ ๋ ฅ ์๋น ๊ฐ์: GPU ํต์ ์ ์ต์ํํ๋ฉด ์ ๋ ฅ ์๋น๋ฅผ ์ค์ผ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ํนํ ์ค์ํฉ๋๋ค.
๋ณต์กํ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ํ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ๋ ์ค๋ฒํค๋๊ฐ ์ฌ๊ฐํ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ์ดํดํ๊ณ ํ์ฉํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ๋ฐ์์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ์ค์ ์๋ ๋ฐฉ์
WebGL ๊ตฌํ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋์จ์ด์ ์ํํธ์จ์ด ๊ธฐ์ ์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ๊ตฌํํฉ๋๋ค. ์ ํํ ์ธ๋ถ ์ฌํญ์ ํน์ GPU ๋ฐ ๋๋ผ์ด๋ฒ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ธ ์์น์ ๋์ผํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์๋ ๋ฐฉ์์ ๋ํ ๊ฐ๋ตํ ๊ฐ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ํ ์ถ์ : WebGL ๊ตฌํ์ ๋ชจ๋ ์ ฐ์ด๋ ์ ๋ํผ, ํ ์ค์ฒ ๋ฐ ๊ธฐํ ๊ด๋ จ ์ํ ๋ณ์์ ํ์ฌ ๊ฐ์ ๊ธฐ๋กํฉ๋๋ค.
- ๊ฐ ๋น๊ต: ์ํ ๋ณ์๋ฅผ ์ค์ ํ๋ ํจ์(์:
gl.uniform1f(),gl.bindTexture())๋ฅผ ํธ์ถํ๋ฉด ๊ตฌํ์ ์ ๊ฐ์ ์ด์ ์ ์ ์ฅ๋ ๊ฐ๊ณผ ๋น๊ตํฉ๋๋ค. - ์กฐ๊ฑด๋ถ ์ ๋ฐ์ดํธ: ์ ๊ฐ์ด ์ด์ ๊ฐ๊ณผ ๋ค๋ฅด๋ฉด ๊ตฌํ์ GPU ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ด๋ถ ๊ธฐ๋ก์ ์ ๊ฐ์ ์ ์ฅํฉ๋๋ค. ์ ๊ฐ์ด ์ด์ ๊ฐ๊ณผ ๊ฐ์ผ๋ฉด ๊ตฌํ์ ์ ๋ฐ์ดํธ ์์ ์ ๊ฑด๋๋๋๋ค.
์ด ํ๋ก์ธ์ค๋ WebGL ๊ฐ๋ฐ์์๊ฒ ํฌ๋ช ํ๊ฒ ์ด๋ฃจ์ด์ง๋๋ค. ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ๋ช ์์ ์ผ๋ก ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ WebGL ๊ตฌํ์ ์ํด ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ ํ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ WebGL ๊ตฌํ์ ์ํด ์๋์ผ๋ก ์ฒ๋ฆฌ๋์ง๋ง, ๊ทธ ํจ๊ณผ๋ฅผ ๊ทน๋ํํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์์ต๋๋ค. ๋ค์์ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค:
1. ๋ถํ์ํ ์ํ ๋ณ๊ฒฝ ์ต์ํ
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ ๋๋ง ๋ฃจํ์์ ๋ถํ์ํ ์ํ ๋ณ๊ฒฝ ํ์๋ฅผ ์ต์ํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๋์ผํ ์ฌ์ง ์์ฑ์ ๊ณต์ ํ๋ ๊ฐ์ฒด๋ค์ ๊ทธ๋ฃนํํ๊ณ ๋ค๋ฅธ ์ฌ์ง๋ก ์ ํํ๊ธฐ ์ ์ ํจ๊ป ๋ ๋๋งํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์ ฐ์ด๋์ ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด, ๋ถํ์ํ ์ ฐ์ด๋ ๋ฐ ํ ์ค์ฒ ๋ฐ์ธ๋ฉ ํธ์ถ์ ํผํ๊ธฐ ์ํด ๋ชจ๋ ์ฐ์๋ ๋ธ๋ก์ผ๋ก ๋ ๋๋งํ์ธ์.
์์: ๋งค๋ฒ ์ฌ์ง์ ๋ฐ๊พธ๋ฉด์ ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ๋ ๋๋งํ๋ ๋์ :
for (let i = 0; i < objects.length; i++) {
bindMaterial(objects[i].material);
drawObject(objects[i]);
}
๊ฐ์ฒด๋ฅผ ์ฌ์ง๋ณ๋ก ์ ๋ ฌํ๊ณ ๋ฐฐ์น๋ก ๋ ๋๋งํ์ธ์:
const sortedObjects = sortByMaterial(objects);
let currentMaterial = null;
for (let i = 0; i < sortedObjects.length; i++) {
const object = sortedObjects[i];
if (object.material !== currentMaterial) {
bindMaterial(object.material);
currentMaterial = object.material;
}
drawObject(object);
}
์ด ๊ฐ๋จํ ์ ๋ ฌ ๋จ๊ณ๋ ์ฌ์ง ๋ฐ์ธ๋ฉ ํธ์ถ ํ์๋ฅผ ํฌ๊ฒ ์ค์ฌ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์๊ฐ ๋ ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋๋ก ํ ์ ์์ต๋๋ค.
2. ์ ๋ํผ ๋ธ๋ก ์ฌ์ฉ
์ ๋ํผ ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด ๊ด๋ จ ์ ๋ํผ ๋ณ์๋ค์ ๋จ์ผ ๋ธ๋ก์ผ๋ก ๊ทธ๋ฃนํํ๊ณ ๋จ์ผ gl.uniformBlockBinding() ํธ์ถ๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ณ ์ ๋ํผ ๋ณ์๋ฅผ ์ค์ ํ๋ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ผ ์ ์์ผ๋ฉฐ, ํนํ ๋ง์ ์ ๋ํผ์ด ๋จ์ผ ์ฌ์ง๊ณผ ๊ด๋ จ๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ต๋๋ค. *ํ๋ผ๋ฏธํฐ* ์บ์ฑ๊ณผ ์ง์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์ง๋ ์์ง๋ง, ์ ๋ํผ ๋ธ๋ก์ ๋๋ก์ฐ ์ฝ๊ณผ ์ ๋ํผ ์
๋ฐ์ดํธ์ *์*๋ฅผ ์ค์ฌ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋๋จธ์ง ํธ์ถ์์ ํ๋ผ๋ฏธํฐ ์บ์๊ฐ ๋ ํจ์จ์ ์ผ๋ก ์๋ํ๋๋ก ํฉ๋๋ค.
์์: ์ ฐ์ด๋์์ ์ ๋ํผ ๋ธ๋ก ์ ์:
layout(std140) uniform MaterialBlock {
vec3 diffuseColor;
vec3 specularColor;
float shininess;
};
JavaScript ์ฝ๋์์ ๋ธ๋ก ์ ๋ฐ์ดํธ:
const materialData = new Float32Array([
0.8, 0.2, 0.2, // diffuseColor
0.5, 0.5, 0.5, // specularColor
32.0 // shininess
]);
gl.bindBuffer(gl.UNIFORM_BUFFER, materialBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, materialData, gl.DYNAMIC_DRAW);
gl.bindBufferBase(gl.UNIFORM_BUFFER, materialBlockBindingPoint, materialBuffer);
3. ๋ฐฐ์น ๋ ๋๋ง
๋ฐฐ์น ๋ ๋๋ง์ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋จ์ผ ์ ์ ๋ฒํผ๋ก ๊ฒฐํฉํ๊ณ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋ ๋๋งํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๋๋ก์ฐ ์ฝ๊ณผ ๊ด๋ จ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ GPU๊ฐ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํฉ๋๋ค. ์ ์คํ ์ฌ์ง ๊ด๋ฆฌ์ ๊ฒฐํฉํ๋ฉด ๋ฐฐ์น ๋ ๋๋ง์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์: ๋์ผํ ์ฌ์ง์ ๊ฐ์ง ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋จ์ผ ์ ์ ๋ฐฐ์ด ๊ฐ์ฒด(VAO) ๋ฐ ์ธ๋ฑ์ค ๋ฒํผ๋ก ๊ฒฐํฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋จ์ผ gl.drawElements() ํธ์ถ๋ก ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ์ฌ ์ํ ๋ณ๊ฒฝ ๋ฐ ๋๋ก์ฐ ์ฝ ํ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ฐฐ์นญ์ ๊ตฌํํ๋ ค๋ฉด ์ ์คํ ๊ณํ์ด ํ์ํ์ง๋ง, ์ฑ๋ฅ ๋ฉด์์์ ์ด์ ์ ํนํ ๋น์ทํ ๊ฐ์ฒด๊ฐ ๋ง์ ์ฅ๋ฉด์์ ์๋นํ ์ ์์ต๋๋ค. Three.js ๋ฐ Babylon.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐฐ์นญ์ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ํ๋ก์ธ์ค๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
4. ํ๋กํ์ผ๋ง ๋ฐ ์ต์ ํ
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ์๋์ง ํ์ธํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ ์ํ ๋ณ๊ฒฝ์ด ์ฑ๋ฅ ๋ณ๋ชฉ์ ์ผ์ผํค๋ ์์ญ์ ์๋ณํ๋ ๊ฒ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ถ์ํ๊ณ ๊ฐ์ฅ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์๋ณํ์ธ์. Chrome DevTools(์ฑ๋ฅ ํญ) ๋ฐ Firefox ๊ฐ๋ฐ์ ๋๊ตฌ๋ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ GPU ํ๋์ ๋ถ์ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๋๋ก์ฐ ์ฝ ์, ์ํ ๋ณ๊ฒฝ ๋น๋, ์ ์ ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์์ ์์๋๋ ์๊ฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ธ์. ๋ณ๋ชฉ ํ์์ ์๋ณํ ํ์๋ ํด๋น ํน์ ์์ญ์ ์ต์ ํํ๋ ๋ฐ ์ง์คํ ์ ์์ต๋๋ค.
5. ์ค๋ณต ์ ๋ํผ ์ ๋ฐ์ดํธ ํผํ๊ธฐ
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์๊ฐ ์๋๋ผ๋ ๋งค ํ๋ ์๋ง๋ค ๋ถํ์ํ๊ฒ ๋์ผํ ์ ๋ํผ ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ ์ฌ์ ํ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ ๋ํผ์ ๊ฐ์ด ์ค์ ๋ก ๋ณ๊ฒฝ๋ ๋๋ง ์ ๋ฐ์ดํธํ์ธ์. ์๋ฅผ ๋ค์ด, ์กฐ๋ช ์ ์์น๊ฐ ์์ง์ด์ง ์์๋ค๋ฉด ์์น ๋ฐ์ดํฐ๋ฅผ ์ ฐ์ด๋์ ๋ค์ ๋ณด๋ด์ง ๋ง์ธ์.
์์:
let lastLightPosition = null;
function render() {
const currentLightPosition = getLightPosition();
if (currentLightPosition !== lastLightPosition) {
gl.uniform3fv(lightPositionUniform, currentLightPosition);
lastLightPosition = currentLightPosition;
}
// ... ๋๋จธ์ง ๋ ๋๋ง ์ฝ๋
}
6. ์ธ์คํด์ค ๋ ๋๋ง ์ฌ์ฉ
์ธ์คํด์ค ๋ ๋๋ง์ ์ฌ์ฉํ๋ฉด ๋จ์ผ ๋๋ก์ฐ ์ฝ์ ์ฌ์ฉํ์ฌ ๋์ผํ ์ง์ค๋ฉํธ๋ฆฌ์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ์์ฑ(์: ์์น, ํ์ , ํฌ๊ธฐ)์ผ๋ก ๊ทธ๋ฆด ์ ์์ต๋๋ค. ์ด๋ ์ฒ์ ๋๋ฌด๋ ์๋ฎฌ๋ ์ด์ ์ ์ ์์ ๊ฐ์ด ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋๋์ผ๋ก ๋ ๋๋งํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค. ์ธ์คํด์ฑ์ ๋๋ก์ฐ ์ฝ๊ณผ ์ํ ๋ณ๊ฒฝ์ ๊ทน์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ์ ์ ์์ฑ์ ํตํด ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์๋ํฉ๋๋ค.
์์: ๊ฐ ๋๋ฌด๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ๋์ , ๋จ์ผ ๋๋ฌด ๋ชจ๋ธ์ ์ ์ํ ๋ค์ ์ธ์คํด์ค ๋ ๋๋ง์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์์น์ ์ฌ๋ฌ ๋๋ฌด ์ธ์คํด์ค๋ฅผ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
7. ๊ณ ๋น๋ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ํผ ๋์ ๊ณ ๋ ค
์ ๋ํผ์ ๋ง์ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ์ ์ ํฉํ์ง๋ง, ์ ์ ๋ณ ์ ๋๋ฉ์ด์ ๋ฐ์ดํฐ์ ๊ฐ์ด ๋น ๋ฅด๊ฒ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ฐ์ด๋์ ์ ๋ฌํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ์ ์ ์์ฑ์ด๋ ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ ์ ์์ฑ์ ์ ์ ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ํด ์ค๊ณ๋์์ผ๋ฉฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ ๋ํผ๋ณด๋ค ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค. ํ ์ค์ฒ๋ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ ฐ์ด๋์์ ์ํ๋งํ ์ ์์ด ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ฌํ๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ ๋ฐ ์์
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ด ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ฑ๋ฅ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ๋ช ๊ฐ์ง ์ค์ ์ ์ธ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ๋์ผํ ๊ฐ์ฒด๊ฐ ๋ง์ ์ฅ๋ฉด ๋ ๋๋ง
์์ฒ ๊ฐ์ ๋์ผํ ํ๋ธ๊ฐ ๊ฐ๊ฐ ๊ณ ์ ํ ์์น์ ๋ฐฉํฅ์ ๊ฐ์ง ์ฅ๋ฉด์ ์๊ฐํด ๋ณด์ธ์. ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ด ์๋ค๋ฉด ๊ฐ ํ๋ธ๋ ๋ณ๋์ ๋๋ก์ฐ ์ฝ๊ณผ ์์ฒด ์ ๋ํผ ์ ๋ฐ์ดํธ ์ธํธ๋ฅผ ํ์๋ก ํ ๊ฒ์ ๋๋ค. ์ด๋ ๋ง์ ์์ ์ํ ๋ณ๊ฒฝ๊ณผ ๋ฎ์ ์ฑ๋ฅ์ ์ด๋ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ๊ณผ ์ธ์คํด์ค ๋ ๋๋ง์ ์ฌ์ฉํ๋ฉด, ํ๋ธ๋ฅผ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋ ๋๋งํ ์ ์์ผ๋ฉฐ ๊ฐ ํ๋ธ์ ์์น์ ๋ฐฉํฅ์ ์ธ์คํด์ค ์์ฑ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
2. ๋ณต์กํ ๋ชจ๋ธ ์ ๋๋ฉ์ด์
๋ณต์กํ ๋ชจ๋ธ์ ์ ๋๋ฉ์ด์ ํ๋ ๊ฒ์ ์ข ์ข ๋งค ํ๋ ์๋ง๋ค ๋ง์ ์์ ์ ๋ํผ ๋ณ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋ชจ๋ธ์ ์ ๋๋ฉ์ด์ ์ด ๋น๊ต์ ๋ถ๋๋ฝ๋ค๋ฉด, ์ด๋ฌํ ์ ๋ํผ ๋ณ์ ์ค ๋ค์๋ ํ๋ ์๋ง๋ค ์ฝ๊ฐ๋ง ๋ณ๊ฒฝ๋ ๊ฒ์ ๋๋ค. ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ์ฌ์ฉํ๋ฉด WebGL ๊ตฌํ์ ๋ณ๊ฒฝ๋์ง ์์ ์ ๋ํผ ์ ๋ฐ์ดํธ๋ฅผ ๊ฑด๋๋ฐ์ด ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
3. ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ: ์งํ ๋ ๋๋ง
์งํ ๋ ๋๋ง์ ์ข ์ข ํ๊ฒฝ์ ํํํ๊ธฐ ์ํด ๋ง์ ์์ ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ํจ์จ์ ์ธ ์งํ ๋ ๋๋ง ๊ธฐ์ ์ ๋ํ ์ผ ์์ค(LOD)๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ฉ๋ฆฌ ์๋ ์ผ๊ฐํ์ ์๋ฅผ ์ค์ ๋๋ค. ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ ๋ฐ ์ ์คํ ์ฌ์ง ๊ด๋ฆฌ์ ๊ฒฐํฉํ๋ฉด ์ด๋ฌํ ๊ธฐ์ ์ ์ ์ฌ์ ์ฅ์น์์๋ ๋ถ๋๋ฝ๊ณ ์ฌ์ค์ ์ธ ์งํ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค.
4. ๊ธ๋ก๋ฒ ์์: ๊ฐ์ ๋ฐ๋ฌผ๊ด ํฌ์ด
์ ์ธ๊ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ์ ๋ฐ๋ฌผ๊ด ํฌ์ด๋ฅผ ์์ํด ๋ณด์ธ์. ๊ฐ ์ ์๋ฌผ์ ๋ค๋ฅธ ์ ฐ์ด๋์ ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ผ๋ก ์ต์ ํํ๋ฉด ์ฌ์ฉ์์ ์ฅ์น๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ๊ด๊ณ์์ด ๋ถ๋๋ฌ์ด ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์์ฐ์ ๋ฏธ๋ฆฌ ๋ก๋ํ๊ณ ์ ์๋ฌผ ๊ฐ ์ ํ ์ ์ํ ๋ณ๊ฒฝ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ํํ๊ณ ๋ชฐ์ ๊ฐ ์๋ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ํ๊ณ
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ๊ฐ์น ์๋ ์ต์ ํ ๊ธฐ์ ์ด์ง๋ง, ๋ง๋ฅ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค. ์์๋์ด์ผ ํ ๋ช ๊ฐ์ง ํ๊ณ๊ฐ ์์ต๋๋ค:
- ๋๋ผ์ด๋ฒ๋ณ ๋์: ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ์ ํํ ๋์์ GPU ๋๋ผ์ด๋ฒ ๋ฐ ์ด์ ์ฒด์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด๋ ํ ํ๋ซํผ์์ ์ ์๋ํ๋ ์ฑ๋ฅ ์ต์ ํ๊ฐ ๋ค๋ฅธ ํ๋ซํผ์์๋ ๊ทธ๋ค์ง ํจ๊ณผ์ ์ด์ง ์์ ์ ์์์ ์๋ฏธํฉ๋๋ค.
- ๋ณต์กํ ์ํ ๋ณ๊ฒฝ: ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ์ํ ๋ณ๊ฒฝ์ด ๋น๊ต์ ๋๋ฌผ ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ ๋๋ค. ๋ค๋ฅธ ์ ฐ์ด๋, ํ ์ค์ฒ, ๋ ๋๋ง ์ํ ์ฌ์ด๋ฅผ ์ง์์ ์ผ๋ก ์ ํํ๋ ๊ฒฝ์ฐ ์บ์ฑ์ ์ด์ ์ด ์ ํ๋ ์ ์์ต๋๋ค.
- ์์ ์ ๋ํผ ์ ๋ฐ์ดํธ: ๋งค์ฐ ์์ ์ ๋ํผ ์ ๋ฐ์ดํธ(์: ๋จ์ผ float ๊ฐ)์ ๊ฒฝ์ฐ ์บ์๋ฅผ ํ์ธํ๋ ์ค๋ฒํค๋๊ฐ ์ ๋ฐ์ดํธ ์์ ์ ๊ฑด๋๋ฐ๋ ์ด์ ๋ณด๋ค ํด ์ ์์ต๋๋ค.
ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ๋์ด: ๊ธฐํ WebGL ์ต์ ํ ๊ธฐ์
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ WebGL ์ฑ๋ฅ ์ต์ ํ ํผ์ฆ์ ํ ์กฐ๊ฐ์ ๋ถ๊ณผํฉ๋๋ค. ๊ณ ๋ คํด์ผ ํ ๋ค๋ฅธ ์ค์ํ ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํจ์จ์ ์ธ ์ ฐ์ด๋ ์ฝ๋: ๊ณ์ฐ ๋ฐ ํ ์ค์ฒ ์กฐํ ์๋ฅผ ์ต์ํํ๋ ์ต์ ํ๋ ์ ฐ์ด๋ ์ฝ๋๋ฅผ ์์ฑํ์ธ์.
- ํ ์ค์ฒ ์ต์ ํ: ์์ถ ํ ์ค์ฒ์ ๋ฐ๋งต์ ์ฌ์ฉํ์ฌ ํ ์ค์ฒ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ๋ ๋๋ง ์ฑ๋ฅ์ ํฅ์์ํค์ธ์.
- ์ง์ค๋ฉํธ๋ฆฌ ์ต์ ํ: ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ๋ํ ์ผ ์์ค(LOD)๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ ๋๋ง๋๋ ์ผ๊ฐํ ์๋ฅผ ์ค์ด์ธ์.
- ์คํด๋ฃจ์ ์ปฌ๋ง: ๋ค๋ฅธ ๊ฐ์ฒด ๋ค์ ์จ๊ฒจ์ง ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ์ง ๋ง์ธ์.
- ๋น๋๊ธฐ ๋ก๋ฉ: ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ์์ฐ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ์ธ์.
๊ฒฐ๋ก
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๊ฐ๋ ฅํ ์ต์ ํ ๊ธฐ์ ์ ๋๋ค. ์ด ๊ธ์์ ์ค๋ช ํ ์๋ ๋ฐฉ์๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํ๊ณ ๋ฐ๋ฅด๋ฉด, ๋ ๋ถ๋๋ฝ๊ณ , ๋น ๋ฅด๋ฉฐ, ๋ฐ์์ฑ์ด ์ข์ ์น ๊ธฐ๋ฐ ๊ทธ๋ํฝ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ด๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ , ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ฉฐ, ๋ถํ์ํ ์ํ ๋ณ๊ฒฝ์ ์ต์ํํ๋ ๋ฐ ์ง์คํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๋ค๋ฅธ ์ต์ ํ ๊ธฐ์ ๊ณผ ๊ฒฐํฉํ๋ฉด, ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ WebGL๋ก ๊ฐ๋ฅํ ๊ฒ์ ํ๊ณ๋ฅผ ๋ฐ์ด๋๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ฐ๋ ๊ณผ ๊ธฐ์ ์ ์ ์ฉํจ์ผ๋ก์จ ์ ์ธ๊ณ์ ๊ฐ๋ฐ์๋ค์ ๋์ ๊ณ ๊ฐ์ ํ๋์จ์ด๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ๊ด๊ณ์์ด ๋ ํจ์จ์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ์ํ ์ต์ ํ๋ ๊ด๋ฒ์ํ ์ฅ์น์ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ณ ๋ คํ๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์บ์ฑ์ ๊ทธ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ์ค์ํ ๋๊ตฌ์ ๋๋ค.