1 Getting started 4 Hello Triangle - JJhuk/LearnOpenGL GitHub Wiki
LearnOpenGL - Hello Triangle
url: https://learnopengl.com/Getting-started/Hello-Triangle ์์ฑ์ผ: 2020๋ 12์ 23์ผ ์ค์ 1:35
OpenGL์์๋ ๋ชจ๋ ๊ฒ์ด 3D ๊ณต๊ฐ์ ์์ง๋ง, ํ๋ฉด์ด๋ ์ฐฝ์ ํฝ์ ์ 2D๋ฐฐ์ด์ด๋ฏ๋ก OpenGL ์์ ์ ๋๋ถ๋ถ์ ๋ชจ๋ 3D ์ขํ๋ฅผ ํ๋ฉด์ ๋ง๋ 2D ํฝ์ ๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค. 3D์ขํ๋ฅผ 2D ํฝ์ ๋ก ๋ณํํ๋ ํ๋ก์ธ์ค๋ OpenGL์ ๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์์ ๊ด๋ฆฌํฉ๋๋ค. ๊ทธ๋ํฝ ํ์ดํ ๋ผ์ธ์ ํฌ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ 3D์ขํ๋ฅผ 2D ์ขํ๋ก ๋ณํํ๊ณ ๋๋ฒ์งธ ๋ถ๋ถ์ 2D์ขํ๋ฅผ ์ค์ ์์ ํฝ์ ๋ก ๋ณํํฉ๋๋ค. ์ด ์ฅ์์๋ ๊ทธ๋ํฝ ํ์ดํ ๋ผ์ธ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ง ํฝ์ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์ 3D์ขํ ์ธํธ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ์ด๋ฅผ ํ๋ฉด์ ์ปฌ๋ฌ 2Dํฝ์ ๋ก ๋ณํํฉ๋๋ค. ๊ทธ๋ํฝํ์ดํ๋ผ์ธ์ ๊ฐ ๋จ๊ณ์์ ์ด์ ๋จ๊ณ์ ์ถ๋ ฅ์ ์ ๋ ฅ์ผ๋ก ์๊ตฌํ๋ ์ฌ๋ฌ ๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค. ์ด ๋ชจ๋ ๋จ๊ณ๋ ๊ณ ๋๋ก ์ ๋ฌธํ ๋์ด ์์ผ๋ฉฐ (ํ๋์ ํน์ ๊ธฐ๋ฅ์ด ์์) ๋ณ๋ ฌ๋ก ์ฝ๊ฒ ์คํํ ์ ์์ต๋๋ค. ๋ณ๋ ฌ ํน์ฑ์ผ๋ก ์ธํด ์ค๋๋ ์ ๊ทธ๋ํฝ์นด๋์๋ ๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ์์ฒ๊ฐ์ ์์ ์ฒ๋ฆฌ ์ฝ์ด๊ฐ ์์ต๋๋ค. ํ๋ก์ธ์ฑ ์ฝ์ด๋ ํ์ดํ ๋ผ์ธ์ ๊ฐ ๋จ๊ณ์ ๋ํด GPU์์ ์์ ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค. ์ด๋ฌํ ์์ ํ๋ก๊ทธ๋จ์ ์ ฐ์ด๋๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฌํ ์ ฐ์ด๋ ์ค ์ผ๋ถ๋ ๊ฐ๋ฐ์๊ฐ ๊ตฌ์ฑํ ์ ์์ผ๋ฏ๋ก ๊ธฐ์กด ๊ธฐ๋ณธ ์ ฐ์ด๋๋ฅผ ๋์ฒด ํ ์์ฒด ์ ฐ์ด๋๋ฅผ ์์ฑํ ์ ์์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ์ดํ๋ผ์ธ์ ํน์ ๋ถ๋ถ์ ํจ์ฌ ๋ ์ธ๋ฐํ๊ฒ ์ ์ด ํ ์ ์์ผ๋ฉฐ GPU์์ ์คํํ๊ธฐ ๋๋ฌธ์ ๊ท์คํ CPU์๊ฐ๋ ์ ์ฝ ํ ์ ์์ต๋๋ค.์ ฐ์ด๋๋ OpenGL ์ ฐ์ด๋ฉ ์ธ์ด (GLSL)๋ก ์์ฑ๋์์ผ๋ฉฐ ๋ค์ ์ฅ์์ ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋์์ ๊ทธ๋ํฝํ์ดํ๋ผ์ธ์ ๋ชจ๋ ๋จ๊ณ์ ๋ํ ์ถ์์ ์ธ ํํ์ ์ฐพ์ ์ ์์ต๋๋ค. ํ๋์ ์น์ ์ ์์ฒด ์ ฐ์ด๋๋ฅผ ์ฝ์ ํ ์ ์๋ ์น์ ์ ๋ํ๋ ๋๋ค.
๋ณด์๋ค์ํผ ๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์๋ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ ๋๋ง ๋ ํฝ์ ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ํน์ ๋ถ๋ถ์ ๊ฐ๊ฐ ์ฒ๋ฆฌํ๋ ๋ง์ ์น์ ์ด ํฌํจ๋์ด ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ ๊ฐ ๋ถ๋ถ์ ๋จ์ํ ๋ ๋ฐฉ์์ผ๋ก ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ์ฌ ํ์ดํ ๋ผ์ธ ์๋ ๋ฐฉ์์ ๋ํ ์ข์ ์์๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์ ๋ํ ์
๋ ฅ์ผ๋ก ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ Vertex Data
๋ผ๋ ๋ฐฐ์ด์์ ์ผ๊ฐํ์ ํ์ฑํด์ผ ํ๋ 3๊ฐ์ 3D์ขํ ๋ชฉ๋ก์ ์ ๋ฌํฉ๋๋ค. ์ด Vertex Data
๋ ๋ฒํ
์ค๋ค์ ๋ชจ์์
๋๋ค. ๋ฒํ
์ค๋ 3D ์ขํ ๋น ๋ฐ์ดํฐ ์งํฉ์
๋๋ค. ์ด ๋ฒํ
์ค์ ๋ฐ์ดํฐ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจ ํ ์ ์๋ ๋ฒํ
์ค ์์ฑ(Vertex Attribute)์ ์ฌ์ฉ ์ฌ์ฉํ์ฌ ํํ๋์ง๋ง, ๋จ์์ฑ์ ์ํด ๊ฐ ๋ฒํ
์ค๋ 3D ์์น์ ์ผ๋ถ ์์ ๊ฐ์ผ๋ก๋ง ๊ตฌ์ฑ๋์ด์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
OpenGL์ด ์ขํ ๋ฐ ์์ ๊ฐ ๋ชจ์์ ์ด๋ป๊ฒ ๋ง๋ค์ง ์๊ธฐ ์ํด์๋ OpenGL์ ๋ฐ์ดํฐ๋ก ์ด๋ค ์ข
๋ฅ์ ๋ ๋ ์ ํ์ ํ์ฑ ํ ๊ฒ์ธ์ง ํํธ๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ ์งํฉ, ์ผ๊ฐํ ์งํฉ ๋๋ ํ๋์ ๊ธด ์ ์ผ๋ก ๋ ๋๋ง ๋๊ธธ ์ํ์๋์? ์ด๋ฌํ ํํธ๋ฅผ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ผ๊ณ ํ๋ฉฐ ๊ทธ๋ฆฌ๊ธฐ ๋ช
๋ น์ ํธ์ถํ๋ ๋์ OpenGL์ ์ ๊ณต๋ฉ๋๋ค. ํ๋ฌํ ํํธ ์ค ํ๋๊ฐ GL_POINTS
, GL_TRIANGLES
๋ฐ GL_LINE_STRIP
์
๋๋ค.
ํ์ดํ๋ผ์ธ์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ๋จ์ผ ๋ฒํ ์ค๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๋ ๋ฒํ ์ค ์ ฐ์ด๋์ ๋๋ค. ๋ฒํ ์ค ์ ฐ์ด๋์ ์ฃผ์ ๋ชฉ์ ์ 3D์ขํ๋ฅผ ๋ค๋ฅธ 3D์ขํ๋ฅผ ๋ณํํ๋ ๊ฒ์ด๋ฉฐ(๋์ค์ ์์ธํ ์ค๋ช ํจ) ๋ฒํ ์ค ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒํ ์ค ์์ฑ์ ๋ํ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
ํ๋ฆฌ๋ฏธํฐ๋ธ ์ด์
๋ธ๋ฆฌ ๋จ๊ณ๋ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ํ์ฑํ๋ ๋ฒํ
์ค ์
ฐ์ด๋์์ ๋ชจ๋ ๋ฒํ
์ค (๋๋ GL_POINTS
๊ฐ ์ ํ๋ ๊ฒฝ์ฐ ๋ฒํ
์ค)์ ์
๋ ฅ์ผ๋ก ์ทจํ๊ณ ์ฃผ์ด์ง ํ๋ฆฌ๋ฏธํฐ๋ธ ๋ชจ์์ ๋ชจ๋ ์ ์ ์กฐ๋ฆฝํฉ๋๋ค. ์ด๋ฒ ์์ ์์๋ ์ผ๊ฐํ์ ์์ฑํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ง์ค๋ฉํธ๋ฆฌ ์ ฐ์ด๋์ ์ถ๋ ฅ์ rasterization ๋จ๊ณ๋ก ์ ๋ฌ๋์ด ๊ฒฐ๊ณผ ํ๋ฆฌ๋ฏธํฐ๋ธ(๋ค)๋ฅผ ์ต์ข ํ๋ฉด์ ํด๋น ํฝ์ ์ ๋งคํํ์ฌ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋์ ๋งคํํ์ฌ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๊ฐ ์ฌ์ฉํ ํ๋ ๊ทธ๋จผํธ๋ฅผ ๋ง๋ญ๋๋ค. ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๊ฐ ์คํ๋๊ธฐ ์ ์ ํด๋ฆฌํ์ด ์ํ๋ฉ๋๋ค. ํด๋ฆฌํ์ ๋ทฐ ์ธ๋ถ์ ์๋ ๋ชจ๋ ์กฐ๊ฐ์ ์ญ์ ํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
OpenGL์ ํ๋ ๊ทธ๋จผํธ๋ OpenGL์ด ๋จ์ผ ํฝ์ ์ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ์ ๋๋ค.
ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋์ ์ฃผ์ ๋ชฉ์ ์ ํฝ์ ์ ์ต์ข ์์์ ๊ณ์ฐํ๋ ๊ฒ์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๊ณ ๊ธ OpenGL ํจ๊ณผ๊ฐ ๋ฐ์ํ๋ ๋จ๊ณ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์๋ ์ต์ข ํฝ์ ์์ (์: ์กฐ๋ช , ๊ทธ๋ฆผ์, ์กฐ๋ช ์์ ๋ฑ)์ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ 3D ์ฅ๋ฉด์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ชจ๋ ํด๋น ์์ ๊ฐ์ด ๊ฒฐ์ ๋๋ฉด ์ต์ข ๊ฐ์ฒด๋ ์ํ ํ ์คํธ ๋ฐ ๋ธ๋ ๋ฉ ๋จ๊ณ๋ผ๊ณ ํ๋ ํ ๋จ๊ณ๋ฅผ ๋ ํต๊ณผํฉ๋๋ค. ์ด ๋จ๊ณ๋ ํ๋ ๊ทธ๋จผํธ์ ํด๋น ๊น์ด (๊ทธ๋ฆฌ๊ณ ์คํ ์ค) ๊ฐ (๋์ค์ ์ป์ ๊ฒ์) ์ ํ์ธํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ํ๋ ๊ทธ๋จผํธ๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ ๋๋ ๋ค์ ์๋์ง ํ์ธํ๊ณ ๊ทธ์ ๋ฐ๋ผ ํ๊ธฐํด์ผ ํฉ๋๋ค. ์คํ ์ด์ง๋ ๋ํ ์ํ ๊ฐ( ์ํ๊ฐ์ ๊ฐ์ฒด์ ๋ถํฌ๋ช ๋๋ฅผ ๋ํ๋ ๋๋ค.)์ ํ์ธํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ๋ธ๋ ๋ฉ(ํผํฉ)ํฉ๋๋ค. ๋ฐ๋ผ์ ํฝ์ ์ถ๋ ฅ ์์์ด ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์์ ๊ณ์ฐ ๋๋๋ผ๋ ์ฌ๋ฌ ์ผ๊ฐํ์ ๋ ๋๋ง ํ ๋ ์ต์ข ํฝ์ ์น์์ ์์ ํ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๋ณด์๋ค์ํผ ๊ทธ๋ํฝํ์ดํ๋ผ์ธ์ ์ ์ฒด๊ฐ ๋งค์ฐ ๋ณต์กํ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ถ๋ถ์ด ๋ง์ด ํฌํจ๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ๋ฒํ ์ค ๋ฐ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ก๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค. ์ง์ค๋ฉํธ๋ฆฌ ์ ฐ์ด๋๋ ์ ํ ์ฌํญ์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ์ ฐ์ด๋๋ก ๋จ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค๋ช ํ์ง ์์ ํ ์ ๋ ์ด์ ๋จ๊ณ์ ๋ณํ ํผ๋๋ฐฑ ๋ฃจํ๋ ์์ง๋ง ์ด๊ฑด ๋์ค์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ต์ OpenGL์์๋ ์ต์ํ ์ฐ๋ฆฌ ์์ ์ ๋ฒํ ์ค ๋ฐ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ๋ฐ๋์ ์ ์ํด์ผ ํฉ๋๋ค. (GPU์๋ ๊ธฐ๋ณธ ๋ฒํ ์ค / ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๊ฐ ์์ต๋๋ค.) ์ด๋ฌํ ์ด์ ๋ก ์ฒซ ๋ฒ์งธ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ธฐ ์ ์ ๋ง์ ์ง์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ต์ OpenGL ํ์ต์ ์์ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ์ด ์ฅ์ ๋์์ ๋ง์นจ๋ด ์ผ๊ฐํ์ ๋ ๋๋งํ๋ฉด ๊ทธ๋ํฝ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๋ ๋ง์ด ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ฒํ ์ค ์ ๋ ฅ
๋ฌด์ธ๊ฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์์ํ๊ธฐ ์ํด์ ๋จผ์ OpenGL์๊ฒ ๋ฒํ
์ค ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํด์ผ ํฉ๋๋ค. OpenGL์ ๊ทธ๋ํฝ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก OpenGL์์ ์ง์ ํ๋ ๋ชจ๋ ์ขํ๋ 3D์
๋๋ค. (x
, y
๊ทธ๋ฆฌ๊ณ z
์ขํ๊ณ) OpenGL์ ๋ชจ๋ 3D ์ขํ๊ณ๋ฅผ ๋์ ์คํฌ๋ฆฐ์ ๋ง๋ 2D ํฝ์
๋ก ๊ฐ๋จํ๊ฒ ๋ณํ๋์ง ์์ต๋๋ค. OpenGL์ ์ค์ง 3์ถ์(x
, y
๊ทธ๋ฆฌ๊ณ z
) -1.0
์์ 1.0
์ฌ์ด์ ๋ฒ์์๋ง ์์๋ ์งํํฉ๋๋ค. ๋ชจ๋ ์ขํ๊ณ๋ ์ ๊ทํ๋ ๊ธฐ๊ธฐ ์ขํ ๋ฒ์์๋ง ๋์ ํ๋ฉด์ ๋ณด์
๋๋ค. (๊ทธ ๋ฐ์ ์๋ ๋ถ๋ถ์ ๋ณด์ด์ง ์์ต๋๋ค.) ํ๋์ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ธฐ ์ํด 3D ์ขํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ๊ฐ์ ๋ฒํ
์ค๋ค์ ๋ณํํด์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ๊ทํ๋ ์ฅ์น ์ขํ๋ฅผ float
๋ฐฐ์ด๋ก ์ ์ํ๊ฒ ์ต๋๋ค.
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
OpenGL์ 3D ๊ณต๊ฐ์์ ์๋ํ๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ๋ ๋๋งํ๋ 2D ์ผ๊ฐํ์ ๊ฐ๊ฐ ๋ฒํ
์ค๋ค์ z
์ขํ๋ 0.0
์ ๊ฐ์ง๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผ๊ฐํ์ ๊น์ด๊ฐ ๊ฐ์์ง๋ฏ๋ก 2D๊ฐ์ด ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
์ ๊ทํ๋ ๊ธฐ๊ธฐ ์ขํ (Normalized Device Coordinates NDC)
๋ฒํ
์ค ์ขํ๋ค์ด ๋ฒํ
์ค ์์ด๋๋ฅผ ํต๊ณผํ๊ฒ ๋๋ฉด, ๊ทธ๊ฒ๋ค์ -1.0
์์ 1.0
๋ฒ์์ x
, y
, z
์ ์์ ๊ณต๊ฐ์ ์ ๊ทํ๋ ๊ธฐ๊ธฐ ์ขํ๊ฐ ๋์ด์ผํฉ๋๋ค. ์ด๋ ํ ์ขํ๋ค์ด ์ด ๋ฒ์๊ฐ ๋ฒ์ด๋๋ค๋ฉด ๋ฒ๋ ค์ง๊ฑฐ๋/clipped ๋์ด ๋์ ์คํฌ๋ฆฐ์ ๋ณด์ฌ์ง์ง ์๊ฒ ๋ฉ๋๋ค. ์๋๋ฅผ ๋ณด๋ฉด ์ผ๊ฐํ์ด ์ ๊ทํ๋ ๊ธฐ๊ธฐ ์ขํ๋ก ๋ณํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. (z
์ถ์ ๋ฌด์ํ๊ฒ ์ต๋๋ค.)
์ผ๋ฐ์ ์ธ ํ๋ฉด ์ขํ์ ๋ฌ๋ฆฌ, ํ๋ฉด์ ์์ชฝ ๋ฐฉํฅ์ y์ถ ์ ๋ค์ ๊ณ ์ ํ๊ณ ๊ทธ๋ํ ์ค์์๋ ์ผ์ชฝ ์๋จ ๋์ (0,0)
์ขํ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ตญ ๋ณํ๋ ๋ชจ๋ ์ขํ๊ฐ ์ด ์ขํ ๊ณต๊ฐ์ ํ์๋๋๋ก ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋น ์ขํ๊ฐ ํ์๋์ง ์์ต๋๋ค.
NDC ์ขํ๋ glViewport์์ ์ ๊ณตํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐํฌํธ ๋ณํ์ ํตํด ํ๋ฉด ๊ณต๊ฐ ์ขํ๋ก ๋ณํ๋ฉ๋๋ค. ๊ฒฐ๊ณผ ํ๋ฉด ๊ณต๊ฐ ์ขํ๋ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋์ ๋ํ ์ ๋ ฅ์ผ๋ก ํ๋ ๊ทธ๋จผํธ๋ก ๋ณํ๋ฉ๋๋ค.
์ ์ ๋ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์ ์ฒซ ๋ฒ์งธ ํ๋ก์ธ์ค์ธ ๋ฒํ ์ค์ ฐ์ด๋์ ์ ๋ ฅ์ผ๋ก ๋ณด๋ด๋ ค๊ณ ํฉ๋๋ค. ์ด๋ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ GPU์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ OpenGL์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ํฝ์นด๋๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ง์ ํ์ฌ ์ํ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฒํ ์ค ์ ฐ์ด๋๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ ํ๋งํผ์ ๋ฒํ ์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ฐ๋ฆฌ๋ GPU์ ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ ์์ ๋ฒํ ์ค๋ฅผ ์ ์ฅํ ์ ์๋ ์์ ๋ฒํ ์ค ๋ฒํผ ๊ฐ์ฒด(VBO)๋ฅผ ํตํด ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ฌํ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ํ๋ฒ์ ํ ๋ฒํ ์ค์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ํ์ ์์ด ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๊ทธ๋ํฝ์นด๋๋ก ๋ณด๋ด๊ณ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ ๊ทธ๋๋ก ์ ์งํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. CPU์์ ๊ทธ๋ํฝ์นด๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ์๋์ ์ผ๋ก ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๋ณด๋ด๋๊ฒ ์ค์ํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๊ทธ๋ํฝ์นด๋์ ๋ฉ๋ชจ๋ฆฌ์ ์์ผ๋ฉด ๋ฒํ ์ค์ ฐ์ด๋๋ ๋ฒํ ์ค์ ๊ฑฐ์ ์ฆ๊ฐ์ ์ผ๋ก ์ก์ธ์คํ์ฌ ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
๋ฒํ ์ค ๋ฒํผ ๊ฐ์ฒด๋ OpenGL ์ฅ์์ ๋งํ ๊ฒ์ฒ๋ผ OpenGL ๊ฐ์ฒด์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ์ ๋๋ค. OpenGL์ ๋ชจ๋ ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๋ฒํผ์๋ ํด๋น ๋ฒํผ์ ํด๋นํ๋ ๊ณ ์ ํ ID๊ฐ ์์ผ๋ฏ๋ก glGenBuffers ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ ID๋ก ํ๋ ์์ฑํ ์ ์์ต๋๋ค.
unsigned int VBO;
glGenBuffers(1, &VBO); //๋ฒํผ์ ๊ฐฏ์
OpenGL์๋ ๋ง์ ์ ํ์ ๋ฒํผ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉฐ ๋ฒํ
์ค ๋ฒํผ ๊ฐ์ฒด์ ๋ฒํผ ์ ํ์ GL_ARRAY_BUFFER
์
๋๋ค. OpenGL์ ์ฌ์ฉํ๋ฉด ๋ฒํผ ์ ํ์ด ๋ค๋ฅธํ ํ๋ฒ์ ์ฌ๋ฌ ๋ฒํผ์ ๋ฐ์ธ๋ฉ ํ ์ ์์ต๋๋ค. glBlindBuffer ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ์์๋ ๋ฒํผ๋ฅผ GL_ARRAY_BUFFER
ํ๊ฒ์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
glBindBuffer(GL_ARRAY_BUFFER, VBO);
๊ทธ ์์ ๋ถํฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ๋ชจ๋ ๋ฒํผ ํธ์ถ(GL_ARRAY_BUFFER
ํ๊ฒ์์)์ ํ์ฌ ๋ฐ์ธ๋ฉ๋ ๋ฒํผ์ธ VBO๋ฅผ ๊ตฌ์ฑํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด์ ์ ์ ์๋ ๋ฒํ
์ค ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณต์ฌํ๋ glBufferData ํจ์๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBufferData๋ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฌ ๋ฐ์ธ๋ฉ๋ ๋ฒํผ๋ก ๋ณต์ฌํ๋ ๊ฒ์ ์ํด ํน๋ณํ ๊ณ ์๋ ํจ์์
๋๋ค. ์ฒซ๋ฒ์งธ ์ธ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ค๋ ๋ฒํผ์ ์ ํ์
๋๋ค. ํ์ฌ GL_ARRAY_BUFFER
ํ๊ฒ์ ๋ฐ์ธ๋ฉ ๋ ๋ฒํ
์ค ๋ฒํผ ๊ฐ์ฒด์
๋๋ค.(VBO) ๋๋ฒ์งธ ์ธ์๋ ๋ฒํผ์ ์ ๋ฌํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ(๋ฐ์ดํธ) ๋ฅผ ์ง์ ํฉ๋๋ค. ๋ฒํ
์ค ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ ๋จ์ํ sizeof
๋ฉด ์ถฉ๋ถํฉ๋๋ค. ์ธ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ฐ๋ฆฌ๊ฐ ๋ณด๋ด๋ ค๋ ์ค์ ๋ฐ์ดํฐ์
๋๋ค.
๋ค๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๊ทธ๋ํฝ์นด๋๊ฐ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํฉ๋๋ค. ์ด๋ 3๊ฐ์ง ํํ๋ฅผ ์ทจํ ์ ์์ต๋๋ค.
GL_STREAM_DRAW
: ๋ฐ์ดํฐ๊ฐ ํ๋ฒ๋ง ์ค์ ๋๊ณ GPU์์ ์ ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.GL_STATIC_DRAW
: ๋ฐ์ดํฐ๊ฐ ํ๋ฒ๋ง ์ค์ ๋๊ณ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.GL_DYNAMIC_DRAW
: ๋ฐ์ดํฐ๊ฐ ๋ง์ด ๋ณ๊ฒฝ๋๊ณ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
์ผ๊ฐํ์ ์์น ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋์ง ์๊ณ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ ๋ชจ๋ ๋ ๋ ํธ์ถ์์ ๋์ผํ๊ฒ ์ ์ง๋๋ฏ๋ก ์ฌ์ฉ ์ ํ์ GL_STATIC_DRAW
๊ฐ ๊ฐ์ฅ ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ฃผ ๋ณ๊ฒฝ๋ ์ ์ด์ดใด ๋ฐ์ดํฐ๊ฐ ์๋ ๋ฒํผ๊ฐ ์๋ ๊ฒฝ์ฐ GL_DYNAMIC_DRAW
์ ํ์ ์ฌ์ฉํ๋ฉด ๊ทธ๋ํฝ ์นด๋๊ฐ ๋ ๋น ๋ฅธ ์ฐ๊ธฐ๋ฅผ ํ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํ ์ ์์ต๋๋ค.
ํ์ฌ ์ฐ๋ฆฌ๋ VBO๋ผ๋ ๋ฒํ ์ค ๋ฒํผ ๊ฐ์ฒด์์ํด ๊ด๋ฆฌ๋๋ ๊ฒ์ฒ๋ผ ๊ทธ๋ํฝ์นด๋์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ต๋๋ค. ๋ค์์ผ๋ก ์ค์ ๋ก ์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฒํ ์ค ๋ฐ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ๋ง๋ค๊ณ ์ ํ๋ฏ๋ก ๋น๋๋ฅผ ์์ํ๊ฒ ์ต๋๋ค.
๋ฒํ ์ค ์ ฐ์ด๋
๋ฒํ ์ค ์ ฐ์ด๋๋ ์ฐ๋ฆฌ์ ๊ฐ์ ์ฌ๋๋ค์ด ํ๋ก๊ทธ๋๋ฐ ํ ์ ์๋ ์ ฐ์ด๋ ์ค ํ๋์ ๋๋ค. ์ต์ OpenGL์์๋ ๋ ๋๋ง์ ์ํํ๋ ค๋ฉด ์ต์ํ ๋ฒํ ์ค ๋ฐ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ์ค์ ํด์ผํ๋ฏ๋ก ์ ฐ์ด๋๋ฅผ ๊ฐ๋ตํ๊ฒ ์๊ฐํ๊ณ ์ฒซ ๋ฒ์งธ ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๊ธฐ ์ํด ๋ ๊ฐ์ ๋งค์ฐ ๊ฐ๋จํ ์ ฐ์ด๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๋ค์ ์ฅ์์๋ ์ ฐ์ด๋์ ๋ํด ์์ธํ ์ค๋ช ํฉ๋๋ค.
๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ์ ฐ์ด๋ ์ธ์ด GLSL(OpenGL Shading Language)๋ก ๋ฒํ ์ค ์ ฐ์ด๋๋ฅผ ์์ฑํ ๋ค์ ์ ฐ์ด๋๋ฅผ ์ปดํ์ผํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋๊ฒ์ ๋๋ค. ์๋์์ GLSL์ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ๋ฒํ ์ค ์ ฐ์ด๋์ ์์ค์ฝ๋๋ฅผ ์ฐพ์๋ณผ ์ ์์ต๋๋ค.
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
๋ณด์๋ค์ํผ GLSL์ C์ ๋น์ทํฉ๋๋ค. ๊ฐ ์ ฐ์ด๋๋ ๋ฒ์ ์ ์ธ์ผ๋ก ์์ํฉ๋๋ค. OpenGL 3.3 ์ด์๋ถํฐ GLSL ๋ฒ์ ๋ฒํธ๋ OpenGL ๋ฒ์ ๊ณผ ์ผ์นํฉ๋๋ค. (์ : GLSL ๋ฒ์ 420์ OpenGL 4.2์ ํด๋น). ๋ํ core profile ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์์์ ๋ช ์์ ์ผ๋ก ๋ํ๋ ๋๋ค.
๋ค์์ผ๋ก in
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํ
์ค ์
ฐ์ด๋์ ๋ชจ๋ ์
๋ ฅ ๋ฒํ
์ค ์์ฑ์ ์ ์ธํฉ๋๋ค. ์ง๊ธ์ ์์น ๋ฐ์ดํฐ์๋ง ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ํ๋์ ๋ฒํ
์ค ์์ฑ๋ง ํ์ํฉ๋๋ค. GLSL์๋ ์ ๋ฏธ์ฌ ์ซ์๋ฅผ ๊ธฐ์ค์ผ๋ก 1~4๊ฐ์ ๋ถ๋ ์์์ ์ ํฌํจํ๋ ๋ฒกํฐ ๋ฐ์ดํฐ ์ ํ์ด ์์ต๋๋ค. ๊ฐ ๋ฒํ
์ค์๋ 3D ์ขํ๊ฐ ์์ผ๋ฏ๋ก aPos ๋ผ๋ ์ด๋ฆ์ผ๋ก vec3
์
๋ ฅ ๋ณ์๋ฅผ ๋ง๋ญ๋๋ค. ๋ํ layout (location = 0)
์ ํตํด ์
๋ ฅ ๋ณ์์ ์์น๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ค์ ํ์ผ๋ฉฐ ๋์ค์ ํด๋น ์์น๊ฐ ํ์ํ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
Vector
๊ทธ๋ํฝ ํ๋ก๊ทธ๋๋ฐ์์ ์ฐ๋ฆฌ๋ ๋ฒกํฐ์ ์ํ์ ๊ฐ๋
์ ์์ฃผ ์ฌ์ฉํฉ๋๋ค. ๋ฒกํฐ๋ ๋ชจ๋ ๊ณต๊ฐ์์ ์์น/๋ฐฉํฅ์ ๊น๋ํ๊ฒ ํํํ๊ณ ์ ์ฉํ ์ํ์ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. GLSL์ ๋ฒกํฐ๋ ์ต๋ ํฌ๊ธฐ๊ฐ 4์ด๊ณ ๊ฐ ๊ฐ์ ๊ฐ๊ฐ vec.x
, vec.y
, vec.z
๋ฐ vec.w
๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ฐ๊ฐ์ ๋ํ ๊ฐ์ ๊ณต๊ฐ์์์ ์ขํ๋ฅผ ๋ํ๋
๋๋ค. vec.w
๋ ๊ณต๊ฐ์ ์์น๋ก ์ฌ์ฉ๋์ง ์์ง๋ง (์ฐ๋ฆฌ๋ 4D๊ฐ ์๋ 3D๋ฅผ ๋ค๋ฅด๊ณ ์์) ์๊ทผ ๋ถํ ์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ดํ ์ฅ์์ ๋ฒกํฐ์ ๋ํด ํจ์ฌ ๋ ๊น๊ฒ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
๋ฒํ
์ค ์
ฐ์ด๋์ ์ถ๋ ฅ์ ์ค์ ํ๋ ค๋ฉด ์ฌ ๋ค์์ ์ฌ์ ์ ์๋ vec4
gl_Position ๋ณ์์ ์์น ๋ฐ์ดํฐ๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค. ๋ฉ์ธ ํจ์์ ๋์์, ์ฐ๋ฆฌ๊ฐ ์ค์ ํ gl_position์ ๋ฒํ
์ค ์
ฐ์ด๋์ ์ถ๋ ฅ์ผ๋ก ์ฌ์ฉ๋ ๊ฒ์
๋๋ค. ์
๋ ฅ์ ํฌ๊ธฐ 3์ ๋ฒกํฐ์ด๋ฏ๋ก ์ด๋ฅผ ํฌ๊ธฐ 4์ ๋ฒกํฐ๋ก ์ผ์คํ
ํด์ผ ํฉ๋๋ค. vec4
์ ์์ฑ์ ์์ vec3
๊ฐ์ ์ฝ์
ํ๊ณ w
๊ตฌ์ฑ ์์๋ฅผ 1.0f
๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค. (์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ์ดํ ์ฅ์์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.)
์ ฐ์ด๋ ์ปดํ์ผ
๋ฒํ ์ค ์ ฐ์ด๋์ ์์ค ์ฝ๋๋ฅผ ๊ฐ์ ธ ์์ ์ง๊ธ ์ฝ๋ ํ์ผ ๋งจ ์์ const char ๋ฌธ์์ด์ ์ ์ฅํฉ๋๋ค.
const char *vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
OpenGL์ด ์
ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐํ์์ ์์ค์ฝ๋์์ ๋์ ์ผ๋ก ์ปดํ์ผ ํด์ผ ํฉ๋๋ค. ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ์
ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค. ๋ค์ ID๋ก ์ฐธ์กฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฒํ
์ค ์
ฐ์ด๋๋ฅผ unsigned int
๋ก ์ง์ ํ๊ณ glCreateShader
๋ก ์
ฐ์ด๋๋ฅผ ๋ง๋ญ๋๋ค.
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glCreateShader์ ๋ํ ์ธ์๋ก ์์ฑํ๋ ค๋ ์
ฐ์ด๋ ์ ํ์ ์ ๊ณตํฉ๋๋ค. ๋ฒํ
์ค ์
ฐ์ด๋๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฏ๋ก GL_VERTEX_SHADER
๋ก ์ ๋ฌํฉ๋๋ค. ๋ค์์ผ๋ก ์
ฐ์ด๋ ์์ค ์ฝ๋๋ฅผ ์
ฐ์ด๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ๊ณ ์
ฐ์ด๋๋ฅผ ์ปดํ์ผํฉ๋๋ค.
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
glShaderSource ํจ์๋ ์ปดํ์ผ ์
ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉํฉ๋๋ค. ๋๋ฒ์งธ ์ธ์๋ ์์ค ์ฝ๋๋ก ์ ๋ฌํ ๋ฌธ์์ด ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ธ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ๋ฒํ
์ค ์
ฐ์ด๋์ ์ค์ ์์ค ์ฝ๋์ด๋ฉฐ ๋ค๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ NULL
๋ก ๋จ๊ฒจ ๋ ์ ์์ต๋๋ค.
glCompileShader๋ฅผ ํธ์ถ ํ ํ ์ปดํ์ผ์ด ์ฑ๊ณตํ๋์ง ํ์ธํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋์๋์ง ํ์ธํ์ฌ ์ค๋ฅ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ์ปดํ์ผ ํ์ ์ค๋ฅ ํ์ธ์ ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ฉ๋๋ค.
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
๋จผ์ ์ฑ๊ณต์ ๋ํ๋ด๋ ์ ์์ ์ค๋ฅ ๋ฉ์์ง(์๋ ๊ฒฝ์ฐ)์ ๋ํ ์ ์ฅ ์ปจํ ์ด๋๋ฅผ ์ ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ glGetShaderiv๋ก ์ปดํ์ผ์ด ์ฑ๊ณตํ๋์ง ํ์ธํฉ๋๋ค. ์ปดํ์ผ์ด ์คํจํ๋ฉด glGetShaderInfoLog๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๊ณ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ผ ํฉ๋๋ค.
if(!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}
์๋ฌด๋ฐ ์ ๋ฌ๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๋ค๋ฉด ๋ฒํ ์ค ์ ฐ์ด๋๊ฐ ์ปดํ์ผ ๋์๋ค๋ ์ด์ผ๊ธฐ์ ๋๋ค.
ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋
ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋๋ฒ์งธ์ด์ ๋ง์ง๋ง ์ ฐ์ด๋์ ๋๋ค. ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ ํฝ์ ์ ์์ ์ถ๋ ฅ์ ๊ณ์ฐํ๋ ๊ฒ์ ๋๋ค. ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ ์ํด ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ ํญ์ ์ฃผํฉ์์ ์ถ๋ ฅํฉ๋๋ค.
์ปดํจํฐ ๊ทธ๋ํฝ์ ์์์ ์ผ๋ฐ์ ์ผ๋ก RGBA๋ก ์ถ์ฝ๋๋ ๋นจ๊ฐ, ๋
น์, ํ๋ ๋ฐ ์ํ(ํฌ๋ช
๋) ๊ตฌ์ฑ ์์์ 4๊ฐ์ ๊ฐ ๋ฐฐ์ด๋ก ํ์๋ฉ๋๋ค. OpenGL ๋๋ GLSL์์ ์์์ ์ ์ํ ๋ ๊ฐ ๊ตฌ์ฑ ์์์ ๊ฐ๋๋ฅผ 0.0
์์ 1.0
์ฌ์ด์ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋นจ๊ฐ์์ 1.0
์ผ๋ก, ๋
น์์ 1.0
์ผ๋ก ์ค์ ํ๋ฉด ๋ ์์์ด ํผํฉ๋์ด ๋
ธ๋์์ด ๋ฉ๋๋ค. ์ด 3๊ฐ์ง ์์ ๊ตฌ์ ์์๋ฅผ ๊ณ ๋ คํ๋ฉด 1600๋ง ๊ฐ์ง๊ฐ ๋๋ ์์์ ์์ฑํ ์ ์์ต๋๋ค.
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
ํ๋ ๊ทธ๋จผํธ ์
ฐ์ด๋์๋ ํ๋์ ์ถ๋ ฅ ๋ณ์๋ง ํ์ํ๋ฉฐ ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ๊ณ์ผํด์ผํ๋ ์ต์ข
์์ ์ถ๋ ฅ์ ์ ์ํ๋ ํฌ๊ธฐ 4์ ๋ฒกํฐ์
๋๋ค. out
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ๊ฐ์ ์ ์ธํ ์ ์์ผ๋ฉฐ ์ฌ๊ธฐ์์ ์ฆ์ FragColor ๋ผ๋ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ๋ค์์ผ๋ก ์ํ ๊ฐ์ด 1.0
(1.0
์ ์์ ํ ๋ถํฌ๋ช
ํจ)์ ์ฃผํฉ์์ผ๋ก vec4
๋ฅผ ์์ ์ถ๋ ฅ์ ํ ๋นํฉ๋๋ค.
ํ๋๊ทธ๋จผํธ ์
ฐ์ด๋๋ฅผ ์ปดํ์ผํ๋ ๊ณผ์ ์ ๋ฒํ
์ค ์
ฐ์ด๋์ ๋น์ทํ์ง๋ง ์ด๋ฒ์๋ ์
ฐ์ด๋ ์ ํ์ผ๋ก GL_FRAGMENT_SHADER
์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
์ด์ ๋ ์ ฐ์ด๋๊ฐ ๋ชจ๋ ์ปดํ์ผ๋๊ณ ๋จ์ ๊ฒ์ ๋ ๋๋ง์ ์ฌ์ฉํ ์ ์๋ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ ์ ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ ๋ฟ์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ํ์ธํ์ธ์!
์ ฐ์ด๋ ํ๋ก๊ทธ๋จ
์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ ๊ฒฐํฉ ๋ ์ฌ๋ฌ ์ ฐ์ด๋์ ์ต์ข ๋งํฌ ๋ฒ์ ์ ๋๋ค. ๋ง ์ปดํ์ผ ๋ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ๋งํฌํ ๋ค์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋ง ํ ๋ ์ด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ํ์ฑํ ํด์ผ ํฉ๋๋ค. ํ์ฑํ๋ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ ฐ์ด๋๋ ๋ ๋๋ง ํธ์ถ์ ์คํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ ฐ์ด๋๋ฅผ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํ ๋ ๊ฐ ์ ฐ์ด๋์ ์ถ๋ ฅ์ ๋ค์ ์ ฐ์ด๋์ ์ ๋ ฅ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ถ๋ ฅ๊ณผ ์ ๋ ฅ๊ธฐ ์ผ์นํ์ง ์์ผ๋ฉด ๋งํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ ์ฝ์ต๋๋ค.
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glCreateProgram ํจ์๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ ์๋ก ์์ฑ ๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ๋ํ ID ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด์ ์ด์ ์ ์ปดํ์ผ ๋ ์ ฐ์ด๋๋ฅผ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ์ฐ๊ฒฐ ํ ๋ค์ glLinkProgram๊ณผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
์ฝ๋๋ ๋งค์ฐ ์๋ช ํด์ผ ํฉ๋๋ค. ์ ฐ์ด๋๋ฅผ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํ๊ณ glLinkProgram์ ํตํด ์ฐ๊ฒฐํฉ๋๋ค.
์ ฐ์ด๋ ์ปดํ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ์ฐ๊ฒฐ์ด ์คํจํด์ด์ง ํ์ธํ๊ณ ํด๋น ๋ก๊ทธ๋ฅผ ๊ฒ์ ํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์ glGetshaderiv ๋ฐ glGetShaderInfoLog๋ฅผ ์ฌ์ฉํ๋ ๋์ ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
...
}
๊ฒฐ๊ณผ๋ ์๋ก ์์ฑ ๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ฌ์ฉํ์ฌ glUseProgram์ ํธ์ถํ์ฌ ํ์ฑํ ํ ์ ์๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ๋๋ค.
glUseProgram(shaderProgram);
glUseProgram ์ดํ์ ๋ชจ๋ ์ ฐ์ด๋ ๋ฐ ๋ ๋๋ง ํธ์ถ์ ์ด์ ์ด ํ๋ก๊ทธ๋จ ๊ฐ์ฒด (๋ฐ ์ ฐ์ด๋)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ๋ง๋ค. ์ผ๋จ ์ด ์ ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ๋ค๋ฉด ์ญ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์! ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค.
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
์ง๊ธ ์ฐ๋ฆฌ๋ ์ ๋ ฅ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ GPU์ ๋ณด๋ด๊ณ GPU์ ๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ๋ด์์ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ง์ํ์ต๋๋ค. ๊ฑฐ์ ๋ค ์์ง๋ง ์์ง ๋จ์์ต๋๋ค. OpenGL์ ์์ง ๋ฉ๋ชจ๋ฆฌ์์ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ๋ฒํ ์ค ์ ฐ์ด๋ ์์ฑ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชจ๋ฆ ๋๋ค. ์ฐ๋ฆฌ๋ ์น์ ํ๊ฒ OpenGL์๊ฒ ๊ทธ ๋ฐฉ๋ฒ์ ์๋ ค์ค ๊ฒ์ ๋๋ค.
๋ฒํ์ค ์์ฑ ๋งํน
๋ฒํ ์ค ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒํ ์ค ์์ฑ์ ํํ๋ก ์ํ๋ ์ ๋ ฅ์ ์ง์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ ์ฐ์ฑ์ ํฌ๊ฒ ๋ํ์ฃผ์ง๋ง ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ด๋ค ๋ถ๋ถ์ด ๋ฒํ ์ค ์ ฐ์ด๋์ ์ด๋ค ๋ฒํ ์ค ์์ฑ์ผ๋ก ์ด๋ํ๋์ง ์๋์ผ๋ก ์ง์ ํด์ผ ํจ์ ๋ปํ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ OpenGL์ด ๋ ๋๋ง ์ ์ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๋ฒํ ์ค ๋ฒํผ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ง์ ๋ฉ๋๋ค.
์์น ๋ฐ์ดํฐ๋ 32๋นํธ (4๋ฐ์ดํธ) ๋ถ๋ ์์์ ๊ฐ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
- ๊ฐ ์์น๋ 3๊ฐ์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ๊ฐ 3๊ฐ ๊ฐ ์ธํธ ์ฌ์ด์๋ ๊ณต๋ฐฑ(๋๋ ๋ค๋ฅธ ๊ฐ)์ด ์์ต๋๋ค. ๊ฐ์ ๋ฐฐ์ด์ ๋นผ๊ณกํ ์์ถ๋์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฒํผ์ ์์ ๋ถ๋ถ์ ์์ต๋๋ค.
์ด ์ง์์ ๋ฐํ์ผ๋ก glVertexAttribPointer๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํ ์ค ๋ฐ์ดํฐ(๋ฒํ ์ค ์์ฑ ๋น)๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ OpenGL์๊ฒ ์๋ ค์ค ์ ์์ต๋๋ค.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer ํจ์์๋ ๋งค๊ฐ ๋ณ์๊ฐ ์๋นํ ๋ง์ผ๋ฏ๋ก ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ๊ตฌ์ฑํ๋ ค๋ ๋ฒํ
์ค ์์ฑ์ ์ง์ ํฉ๋๋ค.
layout (location = 0)
์ ์ฌ์ฉํ์ฌ ๋ฒํ ์ค ์ ฐ์ด๋์์ ์์น ๋ฒํ ์ค ์์ฑ์ ์์น๋ฅผ ์ง์ ํ์ต๋๋ค. ์ด๊ฒ์ ๋ฒํ ์ค ์์ฑ์ ์์น๋ฅผ0
์ผ๋ก ์ค์ ํ๊ณ ์ด vertex ์์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์0
์ ์ ๋ ฅํฉ๋๋ค. - ๋ค์ ์ธ์๋ ๋ฒํ
์ค ์์ฑ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค. vertex ์์ฑ์
vec3
์ด๋ฏ๋ก3
๊ฐ์ ๋ฃ์ด์ค๋๋ค. - ์ธ๋ฒ์งธ ์ธ์๋ GL_FLOAT ๋ฐ์ดํฐ์ ์ ํ์ ์ง์ ํฉ๋๋ค. (GLSL์
vec*
๋ ๋ถ๋์์์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋จ). - ๋ค์ ์ธ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํ ํ ์ง์ ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ์ ์ ๋ฐ์ดํฐ ์ ํ (int, byte)๋ฅผ ์
๋ ฅํ๊ณ ์ด๋ฅผ GL_TRUE๋ก ์ค์ ํ๋ฉด ์ ์ ๋ฐ์ดํฐ๋
0
(๋๋ ๋ถํธ ์๋ ๋ฐ์ดํฐ์ผ ๊ฒฝ์ฐ1
)๋ก ์ ๊ทํ ๋๊ณ float์ผ๋ก ๋ณํ ๋ ๋1
๋ก ์ ๊ทํ ๋ฉ๋๋ค. ์ด๋ ์ฐ๋ฆฌ์ ๊ด๋ จ์ด ์์ผ๋ฏ๋ก GL_FALSE๋ก ๋๊ฒ ์ต๋๋ค. - ๋ค์ฏ๋ฒ์งธ ์ธ์๋ stride๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ, ์ด๋ ์ฐ์๋ ๋ฒํ
์ค ์์ฑ ์ฌ์ด์ ๊ณต๊ฐ์ ์๋ ค์ค๋๋ค. ๋ค์ ์์น ๋ฐ์ดํฐ ์ธํธ๋
float
ํฌ๊ธฐ์ ์ ํํ 3๋ฐฐ ๋จ์ด์ ธ ์์ผ๋ฏ๋ก ํด๋น ๊ฐ์ stride๋ก ์ง์ ํฉ๋๋ค. ๋ฐฐ์ด์ด ๋นผ๊ณกํ ์์ถ๋์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ (๋ค์ ๋ฒํ ์ค ์์ฑ ๊ฐ ์ฌ์ด์ ๊ณต๊ฐ์ด ์์) OpenGL์ด stride๋ฅผ ๊ฒฐ์ ํ ์ ์๋๋ก stride๋ฅผ0
์ผ๋ก ์ง์ ํ ์๋ ์์ต๋๋ค ( ๊ฐ์ด ๋นผ๊ณกํ ์์ถ ๋ ๊ฒฝ์ฐ์๋ง ์๋ํจ.) ๋ ๋ง์ ๋ฒํ ์ค ์์ฑ์ด ์์ ๋๋ง๋ค ๊ฐ ๋ฒํ ์ค ์์ฑ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ์คํ๊ฒ ์ ์ํด์ผ ํ์ง๋ง, ๋์ค์ ๋ ๋ง์ ์์ ๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค. - ๋ง์ง๋ง ๋งค๊ฐ ๋ณ์๋
void*
์ ํ์ด๋ฏ๋ก ์ด์ํ ์บ์คํ ์ด ํ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ฒํผ์์ ์์น ๋ฐ์ดํฐ๊ฐ ์์๋๋ ์คํ์ ์ ๋๋ค. ์์น ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์์ ๋ถ๋ถ์ ์์ผ๋ฏ๋ก ์ด ๊ฐ์0
์ ๋๋ค. ์ด ๋งค๊ฐ ๋ณ์์ ๋ํด์๋ ๋์ค์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ ๋ฒํ
์ค ์์ฑ์ VBO๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ VBO(์ฌ๋ฌ VBO๋ฅผ ๊ฐ์ง ์ ์์)๋ glVertexAttribPointer๋ฅผ ํธ์ถํ ๋ ํ์ฌ GL_ARRAY_BUFFER์ ๋ฐ์ธ๋ฉ ๋ VBO์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ์ด์ ์ ์ ์ ๋ VBO๋ glVertexAttribPointer๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ฌ์ ํ ๋ฐ์ธ๋ฉ๋์ด ์์ผ๋ฏ๋ก ๋ฒํ
์ค ์์ฑ 0
์ ์ด์ ๋ฒํ
์ค ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ด์ OpenGL์ด ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ์ผ๋ฏ๋ก ๋ฒํ ์ค์์ฑ ์์น๋ฅผ ์ธ์๋ก ์ ๊ณตํ๋ glEnableVertexAttribArray๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํ ์ค ์์ฑ๋ ํ์ฑํํด์ผํฉ๋๋ค. ๋ฒํ ์ค ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ ๋์ด ์์ต๋๋ค. ํ์ฑํ๋ฅผ ๋๋๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ์ค์ ํ์ต๋๋ค! ์ฐ๋ฆฌ๋ ๋ฒํ ์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ์์ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ๊ณ , ๋ฒํ ์ค ๋ฐ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ์ค์ ํ๊ณ , OpenGL์๊ฒ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ๋ฒํ ์ค ์ ฐ์ด๋์ ๋ฒํ ์ค ์์ฑ๊ณผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์์ต๋๋ค. OpenGL์์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// 0. OpenGL์ด ์ฌ์ฉํ ๋ฒํผ์ ์ฐ๋ฆฌ์ ๋ฒํ
์ค ๋ฐฐ์ด์ ๋ณต์ฌํฉ๋๋ค.
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 1. ๊ทธ๋ฐ๋ค์ ๋ฒํ
์ค ์์ฑ ํฌ์ธํฐ๋ฅผ ์ธํ
ํฉ๋๋ค.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 2. ๋ฌผ์ฒด๋ฅผ ๋๋๋งํ๊ณ ์ถ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ง ์
ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํฉ๋๋ค.
glUseProgram(shaderProgram);
// 3. ์ด์ ๋ฌผ์ฒด๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
someOpenGLFunctionThatDrawsOurTriangle();
๋ฌผ์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ถ์๋๋ง๋ค ์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ๋ง์ ๋ณด์ด์ง ์์์๋ ์์ง๋ง, 5๊ฐ ์ด์์ ๋ฒํ ์ค ์์ฑ๊ณผ 100๊ฐ ์ด์์ ์๋ก ๋ค๋ฅธ ์ค๋ธ์ ํธ๊ฐ ์๋ค๊ณ ์์ํด๋ณด์ธ์. ์ ์ ํ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ๊ฐ ๊ฐ์ฒด์ ๋ํ ๋ชจ๋ ๋ฒํ ์ค ์์ฑ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ด ํ๋ก์ธ์ค๊ฐ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์ํ ๊ตฌ์ฑ์ ๊ฐ์ฒด์ ์ ์ฅํ๊ณ ๋จ์ํ ์ด ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ ์ํ๋ฅผ ๋ณต์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ด๋จ๊น์?
Vertex Array Object
๋ฒํ ์ค ๋ฐฐ์ด ๊ฐ์ฒด (VAO๋ผ๊ณ ํจ)๋ ๋ฒํ ์ค ๋ฒํผ ๊ฐ์ฒด์ฒ๋ผ ๋ฐ์ธ๋ฉ ๋ ์ ์์ผ๋ฉฐ ํด๋น ์ง์ ์์ ์ดํ์ ๋ชจ๋ ๋ฒํ ์ค ์์ฑ ํธ์ถ์ VAO ๋ด๋ถ์ ์ ์ฅ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฒํ ์ค ์์ฑ ํฌ์ธํฐ๋ฅผ ๊ตฌ์ฑ ํ ๋ ์ด๋ฌํ ํธ์ถ์ ํ ๋ฒ๋ง ์ํํ๋ฉด ๋๊ณ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆด ๋๋ง๋ค ํด๋น VAO๋ฅผ ๋ฐ์ธ๋ฉ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ก ๋ค๋ฅธ VAO๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ ๊ฒ ๋งํผ ์ฝ๊ฒ ์๋ก ๋ค๋ฅธ ๋ฒํ ์ค ๋ฐ์ดํฐ์ ๋ฒํ ์ค ์์ฑ ๊ตฌ์ฑ๋ค ์ฌ์ด๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ๋ฐฉ๊ธ ์ค์ ํ ๋ชจ๋ ์ํ๋ VAO ๋ด์ ์ ์ฅ๋ฉ๋๋ค.
Core OpenGL์ VAO๋ฅผ ์ฌ์ฉํด์ผ ๋ฒํ ์ค ์ ๋ ฅ์ผ๋ก ๋ฌด์์ ํด์ผ ํ๋์ง ์ ์ ์์ต๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ VAO๋ฅผ ๋ฌถ์ง ๋ชปํ๋ค๋ฉด OpenGL์ ์ด๋ ํ ๊ฒ๋ ๊ทธ๋ฆฌ์ง ์์ ๊ฒ์ ๋๋ค.
๋ฒํ ์ค ๋ฐฐ์ด ๊ฐ์ฒด์๋ ๋ค์์ด ์ ์ฅ๋ฉ๋๋ค.
- glVertexAttribPointer๋ฅผ ํตํ ๋ฒํ ์ค ์์ฑ ๊ตฌ์ฑ
- glVertexAttribPointer์ ๋ํ ํธ์ถ๋ณ ๋ฒํ ์ค ์์ฑ๊ณผ ์ฐ๊ด๋ ๋ฒํ ์ค ๋ฒํผ ๊ฐ์ฒด.
\VAO๋ฅผ ๋ง๋๋ ํ๋ก์ธ์ค๋ VBO๋ฅผ ๋ง๋ค์์ ๋์ ๋น์ทํฉ๋๋ค.
unsigned int VAO;
glGenVertexArrays(1, &VAO);
VAO๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด glBindVertexArray๋ฅผ ์ฌ์ฉํ์ฌ VAO๋ฅผ ๋ฐ์ธ๋ฉ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ ์์ ๋ถํฐ ์ฐ๋ฆฌ๋ ํด๋น VBO(๋ค)์ ์์ฑ ํผ์ธํฐ(๋ค)์ ๋ฐ์ธ๋/๊ตฌ์ฑ ํ ๋ค์ ๋์ค์ ์ฌ์ฉํ๊ธฐ ์ํด VAO๋ฅผ ์ธ ๋ฐ์ธ๋ ํด์ผ ํฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ ์ฆ์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ์ ํธํ๋ ์ค์ ์ผ๋ก VAO๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ฝ๋์์ ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ป๋๋ค.
// ..:: ์ด๊ธฐํ ์ฝ๋ (ํ ๋ฒ๋ง ์ํ (๊ฐ์ฒด๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ํ)) :: ..
// 1. Vertex Array Object ๋ฐ์ธ๋ฉ
glBindVertexArray(VAO);
// 2. OpenGL์ด ์ฌ์ฉํ ๋ฒํผ์ ๋ฒํ์ค ๋ฐฐ์ด์ ๋ณต์ฌํฉ๋๋ค.
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 3. ๊ทธ๋ฐ๋ค์ ์ฐ๋ฆฌ์ ๋ฒํ
์ค ์์ฑ ํฌ์ธํฐ๋ฅผ ์ธํ
ํฉ๋๋ค.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
[...]
// ..:: ๊ทธ๋ฆฌ๋ ์ฝ๋ (๋๋ ๋ฃจํ์์) :: ..
// 4. ๋ฌผ์ฒด๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
someOpenGLFunctionThatDrawsOurTriangle();
์ด๊ฒ ๋ค์ ๋๋ค! ์ง๋จ ๋ช ๋ฐฑ๋ง ํ์ด์ง์ ์ํ ํ ๋ชจ๋ ์์ ์ ๋ฒํ ์ค ์์ฑ ๊ตฌ์ฑ๊ณผ ์ฌ์ฉํ VBO๋ฅผ VAO์ ์ ์ฅํ๋ ์ด ์๊ฐ๊น์ง ์ด์ด์ก์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ๊ทธ๋ฆฌ๋ ค๋ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๋จผ์ ๋ชจ๋ VAO (๋ฐ ํ์ํ VBO ๋ฐ ์์ฑ ํฌ์ธํฐ)๋ฅผ ์์ฑ / ๊ตฌ์ฑํ๊ณ ๋์ค์ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ฅํฉ๋๋ค. ๊ฐ์ฒด ์ค ํ๋๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ ์๊ฐ ํด๋น VAO๋ฅผ ๊ฐ์ ธ ์์ ๋ฐ์ธ๋ฉ ํ ๋ค์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ณ VAO๋ฅผ ๋ค์ ๋ฐ์ธ๋ฉ ํด์ ํฉ๋๋ค.
์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๊ธฐ๋ค๋ ค ์จ ์ผ๊ฐํ
์ ํํ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด OpenGL์ ํ์ฌ ํ์ฑํ ๋ ์ ฐ์ด๋, ์ด์ ์ ์ ์ ๋ ๋ฒํ ์ค ์์ฑ ๊ตฌ์ฑ ๋ฐ VBO์ ๋ฒํ ์ค ๋ฐ์ดํฐ (VAO๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ธ๋ฉ ๋จ)๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๊ทธ๋ฆฌ๋ glDrawArrays ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawArrays ํจ์๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฆฌ๋ ค๋ OpenGL ๊ธฐ๋ณธ ์ ํ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ทจํฉ๋๋ค. ์ฒ์์ ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๊ณ ์ถ๋ค๊ณ ๋ง ํ์ผ๋ GL_TRIANGLES๋ฅผ ์ ๋ฌํฉ๋๋ค. ๋ ๋ฒ์งธ ์ธ์๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฆฌ๋ ค๋ ๋ฒํ
์ค ๋ฐฐ์ด์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ 0
์ผ๋ก ๋ก๋๋ค. ๋ง์ง๋ง ์ธ์๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฆฌ๋ ๋ฒํ
์ค์ ์๋ฅผ ์ ์ฅํฉ๋๋ค. ์ฆ, 3
์
๋๋ค.(๋ฐ์ดํฐ์์ ์ ํํ 3๊ฐ์ ๋ฒํ
์ค ๊ธธ์ด ์ธ ์ผ๊ฐํ 1๊ฐ๋ง ๋ ๋๋งํฉ๋๋ค.)
์ด์ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ์ค๋ฅ๊ฐ ๋๋ฉด ๊ฑฐ๊พธ๋ก ์์ ํ์ญ์์ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปดํ์ผ ๋์๋ง์ ๋ค์ ๊ฒฐ๊ณผ๊ฐ ํ์๋ฉ๋๋ค.
์ ์ฒด ํ๋ก๊ทธ๋จ์ ์์ค ์ฝ๋๋ ์ฌ๊ธฐ ์์ต๋๋ค.
์ถ๋ ฅ์ด ๋๊ฐ์ง ์๋ค๋ฉด ๊ทธ ๊ณผ์ ์์ ๋ญ๊ฐ ์๋ชปํ์ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ์ ์ฒด ์์ค ์ฝ๋๋ฅผ ํ์ธํ๊ณ ๋์น ๊ฒ์ด ์๋์ง ํ์ธํ์ธ์.
Element Buffer Objects (์์ ๋ฒํผ ๊ฐ์ฒด)
๋ฒํ ์ค๋ฅผ ๋ ๋๋ง ํ ๋ ๋ง์ง๋ง์ผ๋ก ๋ ผ์ํ๊ณ ์ถ์ ๊ฒ์ด ํ๋ ์๋๋ฐ ๊ทธ๊ฒ์ EBO๋ก ์ถ์ฝ๋ Element Buffer Objects ์ ๋๋ค. ์์ ๋ฒํผ ๊ฐ์ฒด๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ค๋ช ํ๊ธฐ ์ํด ์์ ๋ฅผ ๋ณด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ผ๊ฐํ ๋์ ์ฌ๊ฐํ์ ๊ทธ๋ฆฌ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ ๊ฐ์ ์ผ๊ฐํ์ ์ฌ์ฉํ์ฌ ์ง์ฌ๊ฐํ์ ๊ทธ๋ฆด ์ ์์ต๋๋ค. (OpenGL์ ์ฃผ๋ก ์ผ๊ฐํ๊ณผ ํจ๊ป ์๋ํฉ๋๋ค). ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ผญ์ง์ ์งํฉ์ด ์์ฑ๋ฉ๋๋ค.
float vertices[] = {
// ์ฒซ ์ผ๊ฐํ
0.5f, 0.5f, 0.0f, // ์ค๋ฅธ์ชฝ ์๋จ
0.5f, -0.5f, 0.0f, // ์ค๋ฅธ์ชฝ ํ๋จ
-0.5f, 0.5f, 0.0f, // ์ผ์ชฝ ์๋จ
// ๋๋ฒ์งธ ์ผ๊ฐํ
0.5f, -0.5f, 0.0f, // ์ค๋ฅธ์ชฝ ํ๋จ
-0.5f, -0.5f, 0.0f, // ์ผ์ชฝ ํ๋จ
-0.5f, 0.5f, 0.0f // ์ผ์ชฝ ์๋จ
};
๋ณด์๋ค์ํผ ์ง์ ๋ ๋ฒํ
์ค์ ์ผ๋ถ ๊ฒน์น๋ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ค๋ฅธ์ชฝ ํ๋จ
๊ณผ ์ผ์ชฝ ์๋จ
์ ๋ ๋ฒ ์ง์ ํฉ๋๋ค! ๊ฐ์ ์ฌ๊ฐํ์ด 6๊ฐ๊ฐ ์๋ 4๊ฐ์ ๋ฒํ
์ค๋ก๋ง ์ง์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ 50% ์ค๋ฒํค๋์
๋๋ค. ์ด๊ฒ์ ํฐ ๋ฉ์ด๋ฉ์ด๋ฆฌ๊ฐ ์๋ 1000๊ฐ ์ด์์ ์ผ๊ฐํ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ๊ฐ ์๋ ๋ณต์กํ ๋ชจ๋ธ์ผ ๊ฒฝ์ฐ ๋ ์
ํ๋ ๊ฒ์
๋๋ค. ๋ ๋์ ํด๊ฒฐ์ฑ
์ ๊ณ ์ ํ ๋ฒํ
์ค๋ง ์ ์ฅ ํ ๋ค์ ์ด๋ฌํ ๋ฒํ
์ค๋ฅผ ๊ทธ๋ฆด ์์๋ฅผ ์ง์ ํ๋ ๊ฒ์
๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ๊ฐํ์ 4๊ฐ์ ๋ฒํ
์ค๋ง ์ ์ฅ ํ ๋ค์ ์์๋ฅผ ์ง์ ํ๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํด๋ณด๊ณ ์ถ์ต๋๋ค. OpenGL์ ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ฉด ์ข์ง ์์๊น์?
๊ณ ๋ง๊ฒ๋, ์์ ๋ฒํผ ๊ฐ์ฒด๊ฐ ์ ํํ ๊ทธ๋ฌํ ์ญํ ์ ํฉ๋๋ค. ๋ฒํ ์ค ๋ฒํผ ๊ฐ์ฒด์ ๋น์ทํ EBO ํผํผ๋ ์ด๋ค ๋ฒํ ์ค๋ฅผ OpenGL์ด ๊ทธ๋ ค์ผ ํ๋์ง ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํฉ๋๋ค. ์์ ์ธ๋ฑ์ฑ ๋ ๋๋ก์์ด ๋ฐ๋ก ์ฐ๋ฆฌ ๋ฌธ์ ์ ํด๊ฒฐ์ฑ ์ ๋๋ค. ์์ํ๋ ค๋ฉด ๋จผ์ (๊ณ ์ ํ) ๋ฒํ ์ค์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ฌ ์ง์ฌ๊ฐํ์ผ๋ก ๊ทธ๋ ค์ผ ํฉ๋๋ค.
float vertices[] = {
0.5f, 0.5f, 0.0f, // ์ค๋ฅธ์ชฝ ์๋จ
0.5f, -0.5f, 0.0f, // ์ค๋ฅธ์ชฝ ํ๋จ
-0.5f, -0.5f, 0.0f, // ์ผ์ชฝ ํ๋จ
-0.5f, 0.5f, 0.0f // ์ผ์ชฝ ์๋จ
};
unsigned int indices[] = { // 0๋ถํฐ ์์ํจ!
0, 1, 3, // ์ฒซ๋ฒ์งธ ์ผ๊ฐํ
1, 2, 3 // ๋๋ฒ์งธ ์ผ๊ฐํ
};
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๋ 6๊ฐ ๋์ 4๊ฐ์ ๊ผญ์ง์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ค์์ผ๋ก ์์ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
unsigned int EBO;
glGenBuffers(1, &EBO);
VBO์ ๋ง์ฐฌ๊ฐ์ง๋ก EBO๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ glBufferData๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋ฒํผ์ ๋ณต์ฌํฉ๋๋ค. ๋ํ, ์ด๋ฒ์๋ GL_ELEMENT_ARRAY_BUFFER
๋ฅผ ๋ฒํผ ์ ํ์ผ๋ก ์ง์ ํ์ง๋ง, ๋ฐ์ธ๋ ๋ฐ ์ธ๋ฐ์ธ๋ ํธ์ถ ์ฌ์ด์ ์ด๋ฌํ ํธ์ถ์ ๋ฃ๊ณ ์ ํฉ๋๋ค
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
์ด์ GL_ELEMENT_ARRAY_BUFFER
๋ฅผ ๋ฒํผ ํ๊ฒ์ผ๋ก์ผ๋ก ์ ๊ณตํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ํ ์ผ์ glDrawArray ํธ์ถ์ glDrawElements๋ก ๋์ฒดํ์ฌ ์ธ๋ฑ์ค ๋ฒํผ์์ ์ผ๊ฐํ ๋ ๋๋ง์ ํ ๊ฒ์์ ๋ํ๋ด๋ ๊ฒ์
๋๋ค. glDrawElements๋ฅผ ์ฌ์ฉํ ๋ ํ์ฌ ๋ฐ์ธ๋ฉ ๋ ์์ ๋ฒํผ ๊ฐ์ฒด์ ์ ๊ณต๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฆด ๊ฒ์
๋๋ค.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
์ฒซ ๋ฒ์งธ ์ธ์๋ glDrawArrays์ ์ ์ฌํ๊ฒ ๊ทธ๋ฆด ๋ชจ๋๋ฅผ ์ง์ ํฉ๋๋ค. ๋๋ฒ์งธ ์ธ์๋ ๊ทธ๋ฆด ์์์ ๊ฐ์ ๋๋ ํ์์ ๋๋ค. 6๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ผ๋ฏ๋ก ์ด 6๊ฐ์ ์ ์ ์ ๊ทธ๋ฆฌ๋ ค๊ณ ํฉ๋๋ค. ์ธ ๋ฒ์งธ ์ธ์๋ GL_UNSIGNED_INT ์ ํ์ ์ธ๋ฑ์ค ์ ํํ๋๋ค. ๋ง์ง๋ง ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด EBO์์ ์คํ์ ์ ์ง์ ํ ์ ์์ง๋ง(๋๋ ์ธ๋ฑ์ค ๋ฐฐ์ด์ ์ ๋ฌ ํ ์ ์์ง๋ง ์์ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ) 0์ผ๋ก ๋จ๊ฒจ ๋ก๋๋ค.
glDrawElements ํจ์๋ ํ์ฌ GL_ELEMENT_ARRAY_BUFFER ๋์์ ๋ฐ์ธ๋ฉ ๋ EBO์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๋ ๋๋ง ํ๊ณ ์ถ์ ๋๋ง๋ค ํด๋น EBO๋ฅผ ๋ฐ์ธ๋ฉ ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ๊ผญ์ง์ ๋ฐฐ์ด ๊ฐ์ฒด๋ ์์ ๋ฒํผ ๊ฐ์ฒด ๋ฐ์ธ๋ฉ์ ์ถ์ ํฉ๋๋ค. VAO๊ฐ ๋ฐ์ธ๋ฉ ๋ ๋์ ๋ฐ์ธ๋ฉ๋๋ ๋ง์ง๋ง ์์ ๋ฒํผ ๊ฐ์ฒด๋ VAO์ ์์ ๋ฒํผ ๊ฐ์ฒด๋ก ์ ์ฅ๋ฉ๋๋ค. VAO์ ๋ฐ์ธ๋ฉ ๋๋ฉด ํด๋น EBO๋ ์๋์ผ๋ก ๋ฐ์ธ๋ฉ ๋ฉ๋๋ค.
VAO๋ ๋์์ด GL_ELEMENT_ARRAY_BUFFER ์ผ ๋ glBindBuffer ํธ์ถ์ ์ ์ฅํฉ๋๋ค. ์ด๊ฒ์ ๋ํ ๋ฐ์ธ๋ฉ ํด์ ํธ์ถ์ ์ ์ฅํ๋ฏ๋ก VAO๋ฐ์ธ๋ฉ์ ํด์ ํ๊ธฐ ์ ์ ์์ ๋ฐฐ์ด ๋ฒํผ๋ฅผ ๋ฐ์ธ๋ฉ ํด์ ํ์ง ์์๋์ง ํ์ธํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด EBO๊ฐ ๊ตฌ์ฑ๋์ง ์์ต๋๋ค.
๊ฒฐ๊ณผ ์ด๊ธฐํ ๋ฐ ๊ทธ๋ฆฌ๊ธฐ ์ฝ๋๋ ์ด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// ..:: Initialization code :: ..
// 1. ๋ฒํ์ค ๋ฐฐ์ด ๊ฐ์ฒด ๋ฐ์ธ๋ฉ
glBindVertexArray(VAO);
// 2. OpenGL์ด ์ฌ์ฉํ๊ธฐ ์ํ ๋ฒํ์ค ๋ฒํผ์ ์๋ ๋ฒํ์ค๋ค์ ๋ฐฐ์ด์ ๋ณต์ฌ
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 3. OpenGL์ด ์ฌ์ฉํ๊ธฐ ์ํ ์์ ๋ฒํผ์ ์๋ ์ธ๋ฑ์ค ๋ฐฐ์ด์ ๋ณต์ฌ
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// 4. ๊ทธ๋ฐ๋ค์ ๋ฒํ
์ค ์์ฑ ํฌ์ธํฐ๋ค์ ์ง์ ํฉ๋๋ค.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
[...]
// ..:: Drawing code (in render loop) :: ..
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ์๋์ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ํ์๋ฉ๋๋ค. ์ผ์ชฝ ์ด๋ฏธ์ง๋ ์ต์ํด ๋ณด์ด๊ณ ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง๋ ์์ด์ด ํ๋ ์ ๋ชจ๋์์ ๊ทธ๋ ค์ง ์ง์ฌ๊ฐํ์ ๋๋ค. ์์ด์ด์ด ํ๋ ์ ์ฌ๊ฐํ์ ์ฌ๊ฐํ์ด ์ค์ ๋ก ๋ ๊ฐ์ ์ผ๊ฐํ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์์ ๋ณด์ฌ์ค๋๋ค.
์์ด์ดํ๋ ์ ๋ชจ๋
์์ด์ดํ๋ ์ ๋ชจ๋๋ก ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๋ฉด ๋๋ OpenGL์ด glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
์ ํตํด ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ชจ๋ ์ผ๊ฐํ์ ์๋ฉด๊ณผ ๋ท๋ฉด์ ์ ์ฉํ๊ณ ์ถ๋ค๊ณ ๋งํ๊ณ ๋ ๋ฒ์งธ ์ธ์๋ ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค. ์ดํ์ ๋ชจ๋ ๋๋ก์ ํธ์ถ์ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ์ ๋ค์ ์ค์ ํ ๋๊น์ง ์์ด์ด ํ๋ ์ ๋ชจ๋์์ ์ผ๊ฐํ์ ๋ ๋๋งํฉ๋๋ค.
์ค๋ฅ๊ฐ ์์ผ๋ฉด ๋ค๋ก ๋์๊ฐ์ ๋์น ๊ฒ์ด ์๋์ง ํ์ธํ์ญ์์ค. ์ ์ฒด ์์ค ์ฝ๋๋ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฌ๋ ๊ฒ์ฒ๋ผ ์ผ๊ฐํ์ด๋ ์ง์ฌ๊ฐํ์ ๊ทธ๋ฆด ์ ์๊ฒ ๋์๋ค๋ฉด ์ถํํฉ๋๋ค. ํ๋ OpenGL์ ๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ ์ค ํ๋์ธ ์ฒซ ์ผ๊ฐํ์ ๊ทธ๋ฆด ์ ์์์ต๋๋ค. ์ฒซ ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ๋ง์ ์์ ์ง์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ด๋ ค์ด ๋ถ๋ถ์ ๋๋ค. ๊ณ ๋ง๊ฒ๋ ์ฐ๋ฆฌ๋ ์ด์ ๊ทธ ์ฅ๋ฒฝ์ ๋์ด์๊ณ ๋ค์ ์ฅ์ ์ดํดํ๊ธฐ ํจ์ฌ ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค.
Additional resources
- antongerdelan.net/hellotriangle: Anton Gerdelan's take on rendering the first triangle.
- open.gl/drawing: Alexander Overvoorde's take on rendering the first triangle.
- antongerdelan.net/vertexbuffers: some extra insights into vertex buffer objects.
- learnopengl.com/In-Practice/Debugging: there are a lot of steps involved in this chapter; if you're stuck it may be worthwhile to read a bit on debugging in OpenGL (up until the debug output section).
Exercises
- ๋ฐ์ดํฐ์ ๋ ๋ง์ ์ ์ ์ ์ถ๊ฐํ์ฌ glDrawArrays๋ฅผ ์ฌ์ฉํ์ฌ 2๊ฐ์ ์ผ๊ฐํ์ ๋๋ํ ๊ทธ๋ ค๋ณด์ญ์์ค. : ์ ๋ต
- ์ด์ ๋ฐ์ดํฐ์ ๋ํด ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ VAO ๋ฐ VBO๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๋ ๊ฐ์ ์ผ๊ฐํ์ ๋ง๋ค์ด ๋ณด์ธ์ : ์ ๋ต
- ๋ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ด ๋ ธ๋์์ ์ถ๋ ฅํ๋ ๋ค๋ฅธ ํ๋ ๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๋ ๊ฐ์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ญ๋๋ค. ๋ ์ผ๊ฐํ์ ๋ค์ ๊ทธ๋ฆฝ๋๋ค. ๋ ์ผ๊ฐํ์ ๋ชจ๋ ๋ ธ๋์์ ์ถ๋ ฅํ๋ ๊ณณ์์ ๊ทธ๋ฆฝ๋๋ค. : ์ ๋ต