1 Getting started 1 OpenGL - JJhuk/LearnOpenGL GitHub Wiki
LearnOpenGL - OpenGL
url: https://learnopengl.com/Getting-started/OpenGL ์์ฑ์ผ: 2020๋ 12์ 20์ผ ์ค์ 1:32
์ฐ๋ฆฌ์ ์ฌํ์ ์์ํ๊ธฐ ์ด์ ์, ๋จผ์ OpenGL์ด ์ ํํ๊ฒ ๋ฌด์์ธ์ง ์ ์ํด์ผํด. OpenGL์ ์ฃผ๋ก ๊ทธ๋ํฝ๊ณผ ์ด๋ฏธ์ง๋ฅผ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ API(Application Programming Interface) ์ ๋๋ค. ํ์ง๋ง OpenGL ์์ฒด๋ API๊ฐ ์๋๋ผ Khronos Group ์์ ๊ฐ๋ฐ ๋ฐ ์ ์ง/๊ด๋ฆฌ ํ๋ ์ฌ์์ผ ๋ฟ์ ๋๋ค.
OpenGL ์ฌ์์ ๊ฐ ํจ์์ ๊ฒฐ๊ณผ / ์ถ๋ ฅ์ด ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ์ํ๋์ด์ผ ํ๋์ง ์ ํํ ์ง์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์์ด ๊ธฐ๋ฅ์ด ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๋ฃจ์ ์ ์ฐพ๋ ๊ฒ์ ์ด ์ฌ์์ ๊ตฌํํ๋ ๊ฐ๋ฐ์์ ๋ชซ์ ๋๋ค. OpenGL ์ฌ์์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์ ๊ฐ๋ฐ ๋ OpenGL ๋ฒ์ ์ ํด๋น ๊ฒฐ๊ณผ๊ฐ ์ฌ์์ ์ค์ํ๋ ํ ๋ค๋ฅธ ๊ตฌํ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ค์ OpenGL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ๋ ์ฌ๋๋ค์ ๊ทธ๋ํฝ ์นด๋ ์ ์กฐ์ ์ฒด์ ๋๋ค. ๊ตฌ์ ํ ๊ทธ๋ํฝ์นด๋๋ ํด๋น ์นด๋ (์๋ฆฌ์ฆ) ์ฉ์ผ๋ก ํน๋ณํ ๊ฐ๋ฐ ๋ OpenGL ๋ฒ์ ์ธ ํน์ ๋ฒ์ ์ OpenGL์ ์ง์ํฉ๋๋ค. Apple ์์คํ ์ ์ฌ์ฉํ ๋ OpenGL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Apple ์์ฒด์์ ์ ์ง/๊ด๋ฆฌํ๋ฉฐ Linux์์๋ ๊ทธ๋ํฝ ๊ณต๊ธ ์ ์ฒด์ ๋ฒ์ ๊ณผ ์ ํธ๊ฐ๋ค์ด ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์กฐ์ ํ ์กฐํฉ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ํ OpenGL์์๋ ๋์ค์ง ์๋ ์ดํด๊ฐ ์๋๋ ๋์์ ๋ณด์ผ๋๋ง๋ค ๊ทธ๋ํฝ ์นด๋ ์ ์กฐ์ ์ฒด(๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐ/์ ์ง ํ ์ฌ๋)์ ์๋ชป ์ผ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
๋๋ถ๋ถ์ ๊ตฌํ์ ๊ทธ๋ํฝ์นด๋ ์ ์กฐ์ ์ฒด์์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ตฌํ์ ์์ด์ ๋ฌธ์ ๊ฐ ์๊ธธ๋๋ง๋ค ๊ทธ๋ํฝ ์นด๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ ๋ฐ์ดํธ ํจ์ผ๋ก์จ ํด๊ฒฐ๋ฉ๋๋ค. ์ด๋ฌํ ๋๋ผ์ด๋ฒ์๋ ์นด๋๊ฐ ์ง์ํ๋ ์ต์ ๋ฒ์ ์ OpenGL์ด ํฌํจ๋ฉ๋๋ค. ์ด๊ฒ์ด ๊ทธ๋ํฝ ๋๋ผ์ด๋ฒ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ ์ด์ ์ค ํ๋์ ๋๋ค.
Khronos๋ ๋ชจ๋ OpenGL ๋ฒ์ ์ ๋ํ ๋ชจ๋ ์ฌ์ ๋ฌธ์๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ํธ์คํ ํฉ๋๋ค. ๊ด์ฌ์๋ ๋ ์๋ ๋ฒ์ 3.3์ OpenGL (์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๊ฒ) ์ฌ์์ ์ฌ๊ธฐ์ ์ฐพ์ ์ ์์ต๋๋ค. OpenGL์ ์ธ๋ถ ์ฌํญ์ ์์ธํ ์ดํด ๋ณด๊ณ ์ถ๋ค๋ฉด ์ข์ ์ฐธ๊ณ ์๋ฃ ์ ๋๋ค. (๊ตฌํ์ด ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์ํ์ธ์) ์ด ์ฌ์์ ํด๋น ๊ธฐ๋ฅ์ ์ ํํ ์๋์ ์ฐพ๊ธฐ ์ํ ํ๋ฅญํ ์ฐธ๊ณ ์๋ฃ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Core-profile vs Immediate mode
์ด์ ์๋, OpenGL๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๊ทธ๋ํฝ์ ๊ทธ๋ฆฌ๋ ๋์ ์ฌ์ด Immediate mode( ์ข ์ข ๊ณ ์ ํจ์ ํ์ดํ๋ผ์ธ์ด๋ผ๊ณ ์ธ๊ธ๋๋) ์์ ๊ฐ๋ฐํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค. ๋๋ถ๋ถ์ OpenGL์ ํจ์๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์จ๊ฒจ์ ธ ์์๊ณ ๊ฐ๋ฐ์๋ OpenGL์ด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ณ์ฐ๋ฐฉ์์ ์ ์ดํ ์ ์์์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ ์ฐ์ฑ์ ์ํ๊ณ , ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ์ ์ฐํ๊ฒ ๋์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๊ทธ๋ํฝ์ ๋ ์ ์ปจํธ๋กค ํ ์ ์๊ฒ ๋์์ต๋๋ค. Immediate mode๋ ์ดํดํ๊ณ ์ฌ์ฉํ๊ธฐ์ ์ ๋ง ์ฝ์ง๋ง, ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก 3.2 ๋ฒ์ ๋ถํฐ๋ Immediate mode๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ํ์์ผ๋ฉฐ ๊ฐ๋ฐ์๊ฐ OpenGL์ Core-Frofile mode์์ ๊ฐ๋ฐํ๋๋ก ์ฅ๋ คํ์ต๋๋ค. ์ด๋ OpenGL์ ์ฌ์์์ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ๊ฑฐํ์ต๋๋ค.
OpenGL์ core-profile์ ์ฌ์ฉํ ๋์๋ OpenGL์ ์ฐ๋ฆฌ๊ฐ ํ๋์ ์ธ ๊ดํ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ OpenGL'์ deprecated๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ ๋๋ง๋ค, OpenGL์ ์๋ฌ๋ฅผ ๋ด๋ฟ๊ณ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ๋ฉ์ถฅ๋๋ค. ํ๋์ ์ ๊ทผ์ ๋ฐฐ์ฐ๋ ๊ฒ์ ์ด์ ์ ๋งค์ฐ ์ ์ฐํ๋ฉฐ ํจ์จ์ ์ ๋๋ค. ํ์ง๋ง ์ด ๋ง์ ๋ฐฐ์ฐ๊ธฐ์๋ ๋ ์ด๋ ต๋ค๋ ๋ป์ด๊ธฐ๋ ํ์ง์. Immediate mode๋ OpenGL์ด ์ค์ ๋ก ์ํํ๋ ๊ฒ๋ค์ด ์๋นํ ๋ง์ด ์ถ์ํ๋์์ผ๋ฉฐ ๋ฐฐ์ฐ๊ธฐ๋ ์ฝ์ง๋ง ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์ ํ๊ธฐ๊ฐ ์ด๋ ค์ ์ต๋๋ค. ํ๋์ ์ธ ์ ๊ทผ๋ฒ์ ๊ฐ๋ฐ์๊ฐ OpenGL๊ณผ ๊ทธ๋ํฝ์ค ํ๋ก๊ทธ๋๋ฐ์ ์ง์ ์ผ๋ก ์ดํดํ๋๋ก ์๊ตฌํ๋ฉฐ ์ฝ๊ฐ ์ด๋ ต์ง๋ง ํจ์ฌ ๋ ๋ง์ ์ ์ฐ์ฑ๊ณผ ํจ์จ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ทธ๋ํฝ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ์ดํด์ ๋๋ค.
์ด๊ฒ์ด ์ด ์ฑ ์ด Core-Profile OpenGL ๋ฒ์ 3.3์ ๋ง์ถฐ์ง ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ ์ด๋ฝ์ง๋ง ๋ ธ๋ ฅํ ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ค๋๋ถํฐ OpenGL์ ์์ ๋ฒ์ ์ ์ ํํ ์ ์์ต๋๋ค. (์์ฑ ์์ ์ผ๋ก๋ 4.6) ์ด๋ ๊ฒ ์ง๋ฌธํ ์๋ ์์ต๋๋ค. '์ OpenGL 4.6์ ๋ฐฐ์ฐ์ง ์๊ณ OpenGL 3.3์ ๋ฐฐ์์ผ ํ๋์?' ๊ทธ ์ง๋ฌธ์ ๋ํ ๋ต์ ๊ฐ๋จํฉ๋๋ค. 3.3 ์ดํ์ OpenGL ๋ฒ์ ์ OpenGL์ ํต์ฌ ๋ฉ์ปค๋์ฆ์ ๋ณ๊ฒฝํ์ง ์๊ณ OpenGL์ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ต์ ๋ฒ์ ์ ๋์ผํ ์์ ์ ์ํํ๋ ๋ฐ ์ฝ๊ฐ ๋ ํจ์จ์ ์ด๊ฑฐ๋ ์ ์ฉํ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋ ๊ฐ๋ ๊ณผ ๊ธฐ์ ์ด ์ต์ OpenGL ๋ฒ์ ์์ ๋์ผํ๊ฒ ์ ์ง๋๋ฏ๋ก OpenGL 3.3์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ์ ํจํฉ๋๋ค. ์ค๋น๊ฐ ๋๊ฑฐ๋ ๋ ๊ฒฝํ์ด ๋ง์๋๋ง๋ค ์ต์ OpenGL ๋ฒ์ ์ ํน์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ต์ ๋ฒ์ ์ OpenGL์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ต์ ๊ทธ๋ํฝ ์นด๋๋ง ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒ ํด ์ค ๊ป๋๋ค. ์ด๊ฒ์ด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ฎ์ ๋ฒ์ ์ OpenGL์ ๋์์ผ๋ก ๊ฐ๋ฐํ๊ณ ์ ํ์ ์ผ๋ก ๋ ๋์ ๋ฒ์ ์ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ์ด์ ์ ๋๋ค.
์ผ๋ถ ์ฑํฐ์์๋ ์ด์ ๊ฐ์ ๋ ํ๋์ ์ธ ๊ธฐ๋ฅ์ ์ฐพ์ ์ ์์ต๋๋ค.
Extensions
OpenGL์ ๊ฐ์ฅ ํฐ ํน์ง์ ํ์ฅ ์ง์์ ๋๋ค. ๊ทธ๋ํฝ ํ์ฌ๊ฐ ์๋ก์ด ๊ธฐ์ ์ด๋ ๋ ๋๋ง์ ์ํ ์๋ก์ด ๋๊ท๋ชจ ์ต์ ํ๋ฅผ ์ ์ ํ ๋๋ง๋ค ๋๋ผ์ด๋ฒ์ ๊ตฌํ๋ ํ์ฅ์์ ์ข ์ข ํ์ธํ ์ ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ํ๋์จ์ด๊ฐ ์ด๋ฌํ ํ์ฅ์ ์ง์ํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ ๋ณด๋ค ๊ณ ๊ธ์ ์ด๊ฑฐ๋ ํจ์จ์ ์ธ ๊ทธ๋ํฝ์ ์ํด ํ์ฅ์์ ์ ๊ณต๋๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ทธ๋ํฝ ๊ฐ๋ฐ์๋ OpenGL์ด ํฅํ ๋ฒ์ ์ ๊ธฐ๋ฅ์ ํฌํจ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ด ๊ทธ๋ํฝ ์นด๋์์ ํ์ฅ์ด ์ง์๋๋์ง ํ์ธํ๊ธฐ๋ง ํ๋ฉด ์ด๋ฌํ ์๋ก์ด ๋ ๋๋ง ๊ธฐ์ ์ ๊ณ์ํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ข ์ข ํ์ฅ์ด ๋๋ฆฌ ์ฌ์ฉ๋๊ฑฐ๋ ๋งค์ฐ ์ ์ฉํ ๋ ํญํ OpenGL ๋ฒ์ ์ ์ผ๋ถ๊ฐ ๋ฉ๋๋ค.
๊ฐ๋ฐ์๋ ์ด๋ฌํ ํ์ฅ์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ฌ์ฉ๊ฐ๋ฅํ์ง ํ์ธ์ ํด ๋ณด์์ผ ํฉ๋๋ค. (๋๋ OpenGL ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ) ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ํ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์์ ์ ๋ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
if(GL_ARB_extension_name)
{
// ํ๋์จ์ด๊ฐ ์ง์ํ๋ ๋ฉ์ง๊ณ ์๋ก์ด ํ๋์ ์ธ ์์
์ํ
}
else
{
// ํ์ฅ์ด ์ง์๋์ง ์์: ์ด์ ๋ฐฉ์ ์ฌ์ฉ
}
OpenGL 3.3 ๋ฒ์ ์๋ ๋๋ถ๋ถ์ ๊ฐ์ ์ ๋ํ ํ์ ์ด ๊ฑฐ์ ํ์ํ์ง๋ ์์ง๋ง ํ์ํ ๊ฒฝ์ฐ์๋ ์ ์ ํ ์ง์นจ์ด ์ ๊ณต๋ฉ๋๋ค.
State machine
OpenGL์ ๊ทธ ์์ฒด๋ก ํฐ ์ํ ๋จธ์ ์ ๋๋ค. OpenGL์ด ํ์ฌ ์๋ํ๋ ๋ฐฉ์์ ์ ์ํ๋ ์ ์ํ๋ ๋ณ์ ๋ชจ์์ ๋๋ค. OpenGL์ ์ํ๋ฅผ ์ผ๋ฐ์ ์ผ๋ก OpenGL ์ปจํ ์คํธ๋ผ๊ณ ํฉ๋๋ค. OpenGL์ ์ฌ์ฉํ ๋ ์ข ์ข ์ผ๋ถ ์ต์ ์ ์ค์ ํ๊ณ ์ผ๋ถ ๋ฒํผ๋ฅผ ์กฐ์ ํ ๋ค์ ํ์ฌ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋งํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ผ๊ฐํ ๋์ ์ ์ ๊ทธ๋ฆฌ๊ฒ ๋ค๊ณ OpenGL์๊ฒ ๋งํ ๋๋ง๋ค OpenGL์ด ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ค์ ํ๋ ์ปจํ ์คํธ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ฌ OpenGL์ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. OpenGL์ ์ ์ ๊ทธ๋ฆฌ๋๋ก ์ง์ํ์ฌ ์ปจํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ์๋ง์ ๋ค์ ๊ทธ๋ฆฌ๊ธฐ ๋ช ๋ น์ ์ด์ ์ผ๊ฐํ ๋์ ์ ์ ๊ทธ๋ฆฝ๋๋ค.
OpenGL์์ ์์ ํ ๋ ์ปจํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฌ๋ฌ ์ํ ๋ณ๊ฒฝ ํจ์๋ค๊ณผ OpenGL์ ํ์ฌ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ผ๋ถ ์์ ์ ์ํํ๋ ์ฌ๋ฌ ์ํ ์ฌ์ฉ ํจ์๋ฅผ ์ ํ๊ฒ ๋ฉ๋๋ค. OpenGL์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ ํฐ ์ํ๋จธ์ ์ด๋ผ๋ ์ ์ ๊ธฐ์ตํ๋ ํ ๋๋ถ๋ถ์ ํจ์๋ค์ด ๋ ๋ช ํํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
Objects
OpenGL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ C๋ก ์์ฑ๋์์ผ๋ฉฐ ๋ค๋ฅธ ์ธ์ด๋ก ๋ง์ ํ์์ด ๊ฐ๋ฅํ์ง๋ง ํต์ฌ์๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋จ์ ์์ต๋๋ค. C์ ๋ง์ ์ธ์ด ๊ตฌ์กฐ๋ ๋ค๋ฅธ ๊ณ ์์ค ์ธ์ด๋ก ์ ๋ฒ์ญ๋์ง ์๊ธฐ ๋๋ฌธ์ OpenGL์ ๋ช ๊ฐ์ง ์ถ์ํ๋ฅผ ์ผ๋์ ๋๊ณ ๊ฐ๋ฐ๋์์ต๋๋ค. ์ด๋ฌํ ์ถ์ํ ์ค ํ๋๋ OpenGL์ Object ์ ๋๋ค.
OpenGL์ Object๋ OpenGL ์ํ์ ํ์ ์งํฉ์ ๋ํ๋ด๋ ์ต์ ๋ชจ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋ก์ ์ฐฝ์ ์ค์ ์ ๋ํ๋ด๋ Obejct๊ฐ ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํฌ๊ธฐ, ์ง์๋๋ ์์ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. Object๋ฅผ C์ ์ ์ฌํ ๊ตฌ์กฐ์ฒด๋ก ์๊ฐํ ํ ์ ์์ต๋๋ค.
struct object_name {
float option1;
int option2;
char[] name;
};
Object๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ ๋๋ง๋ค ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ด๊ฒ ๋ฉ๋๋ค. (OpenGL์ ์ปจํ ์คํธ๊ฐ ํฐ ๊ตฌ์กฐ์ฒด๋ก ์๊ฐํ๋จ)
// OpenGL์ ์ํ
struct OpenGL_Context {
...
object_name* object_Window_Target;
...
};
// object
unsigned int objectId = 0;
glGenObject(1, &objectId);
// ์ปจํ
์คํธ์ object๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ํ ๋นํจ
glBindObject(GL_WINDOW_TARGET, objectId);
// ํ์ GL_WINDOW_TARGET์ ๋ฐ์ธ๋ฉ ๋ Obejct์ ์ต์
์ค์
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// ์ปจํ
์คํธ ๋์์ ๋ค์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์
glBindObject(GL_WINDOW_TARGET, 0);
์ด ์์ ์ฝ๋๋ OpenGL๋ก ์์
ํ ๋ ์์ฃผ ๋ณด๊ฒ๋๋ ์ํฌํ๋ก์ฐ์
๋๋ค. ๋จผ์ Object๋ฅผ ๋ง๋ค๊ณ ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ID๋ก ์ ์ฅํฉ๋๋ค. (์ค์ Obejct์ ๋ฐ์ดํฐ๋ ์ด ์ฌ ๋ค์ ์ ์ฅ๋ฉ๋๋ค.) ๊ทธ๋ฐ ๋ค์ Obejct(Id๋ฅผ ์ฌ์ฉํ์ฌ)๋ฅผ ์ปจํ
์คํธ์ ๋์ ์์น์ ๋ฐ์ธ๋ฉํฉ๋๋ค.( ์์ ์ฐฝ Object ๋์์ ์์น๋ GL_WINDOW_TARGET์ผ๋ก ์ ์ ๋จ). ๋ค์์ผ๋ก ์ฐฝ ์ต์
์ ์ค์ ํ๊ณ ๋ง์ง๋ง์ผ๋ก ์ฐฝ ๋์์ ํ์ฌ Obejct Id๋ฅผ 0
์ผ๋ก ์ค์ ํ์ฌ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ์ ํด์ ํฉ๋๋ค. ์ค์ ํ ์ต์
์ Object Id๊ฐ ์ฐธ์กฐํ๋ Object์ ์ ์ฅ๋๊ณ Obejct๋ฅผ GL_WINDOW_TARGET์ ๋ค์ ๋ฐ์ธ๋ฉํ์๋ง์ ๋ณต์๋ฉ๋๋ค.
์ง๊ธ๊น์ง ์ ๊ณต๋ ์ฝ๋ ์ํ์ OpenGL์ด ์๋ํ๋ ๋ฐฉ์์ ๊ทผ์ฌ์น ์ผ ๋ฟ์ ๋๋ค. ์ฑ ์ ์ฒด์์ ์ถฉ๋ถํ ์ค์ ์์ ๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ Object๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ์ข์ ์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋ ์ด์์ Object๋ฅผ ์ ์ํ๊ณ ์ต์ ์ ์ค์ ํ ์ ์์ผ๋ฉฐ OpenGL์ ์ํ๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ์์ํ ๋๋ง๋ค ์ํ๋ ์ค์ ์ผ๋ก Object๋ฅผ ๋ฐ์ธ๋ฉ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด 3d ๋ชจ๋ธ ๋ฐ์ดํฐ (์ง ๋๋ ์ผ๋ฆญํฐ) ์ ๋ํ ์ปจํ ์ด๋ Object ์ญํ ์ ํ๋ Object๊ฐ ์์ผ๋ฉฐ ๊ทธ ์ค ํ๋๋ฅผ ๊ทธ๋ฆด ๋๋ง๋ค ๊ทธ๋ฆฌ๋ ค๋ ๋ชจ๋ธ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ Object๋ฅผ ๋ฐ์ธ๋ฉํฉ๋๋ค(์ฒ์์ ๋ง๋ค๊ณ ์ค์ ํ์ต๋๋ค.) ์ด๋ฌํ Object์ ๋ํ ์ต์ ์ ์ฌ๋ฌ ๋ชจ๋ธ์ ์ง์ ํ ์ ์์ผ๋ฉฐ ํน์ ๋ชจ๋ธ์ ๊ทธ๋ฆด๋๋ง๋ค, ๋ชจ๋ ์ต์ ์ ๋ค์ ์ค์ ํ์ง ์๊ณ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ํด๋น Obejct๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
Let's get started
์ด์ OpenGL์ ์ฌ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, OpenGL ์ด ๋๋ฝ์ ์ผ๋ก ์ด๋ป๊ฒ ์๋๋๋์ง, OpenGL์ด ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์ฌ์ฉ์ ์ ์ ํธ๋ฆญ์ ๋ฐฐ์ ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํ๋๋ผ๋ ๊ฑฑ์ ํ์ง ๋ง์ธ์. ์ฑ ์ ์ฒด์์ ๊ฐ ๋จ๊ณ๋ฅผ ์ดํด๋ณด๊ณ OpenGL์ ์ค์ ๋ก ์ดํดํ๋ ๋ฐ ์ถฉ๋ถํ ์์ ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
Additional resources
- opengl.org: official website of OpenGL.
- OpenGL registry: hosts the OpenGL specifications and extensions for all OpenGL versions.