์ ์ ์ ฐ์ด๋๋ ์ ์ ์์ฑ์ ํํ๋ก ์ํ๋ ์ ๋ ฅ์ ์ง์ ํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ด๋ ํฐ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง,
์ ๋ ฅ ๋ฐ์ดํฐ์ ์ด๋ค ๋ถ๋ถ์ด ์ ์ ์ ฐ์ด๋์ ์ด๋ค ์ ์ ์์ฑ์ผ๋ก ๊ฐ์ผ ํ๋์ง ์๋์ผ๋ก ์ง์ ํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ฆ, ๋ ๋๋งํ๊ธฐ ์ ์ OpenGL์ด ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํด์ํด์ผ ํ๋์ง ์ง์ ํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ์ ์ ์ ๋ฒํผ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค

- ์์น ๋ฐ์ดํฐ๋ 32๋นํธ(4๋ฐ์ดํธ) ๋ถ๋ ์์์ ๊ฐ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
- ๊ฐ ์์น๋ ์ด๋ฌํ ๊ฐ 3๊ฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- 3๊ฐ ๊ฐ ๊ฐ๊ฐ ์ฌ์ด์๋ ๊ณต๊ฐ(๋๋ ๋ค๋ฅธ ๊ฐ)์ด ์์ต๋๋ค. ๊ฐ๋ค์ ๋ฐฐ์ด์ ๋ฐ์ง๋์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฒํผ์ ์์ ๋ถ๋ถ์ ์์ต๋๋ค.
์ด ์ง์์ ๋ฐํ์ผ๋ก, ์ฐ๋ฆฌ๋ OpenGL์๊ฒ glVertexAttribPointer๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ๋ฐ์ดํฐ๋ฅผ (์ ์ ์์ฑ๋น) ์ด๋ป๊ฒ ํด์ํด์ผ ํ๋์ง ์๋ ค์ค ์ ์์ต๋๋ค.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer ํจ์๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋นํ ๋ง์ผ๋ฏ๋ก ํ๋์ฉ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ฑํ๋ ค๋ ์ ์ ์์ฑ์ ์ง์ ํฉ๋๋ค. ์ ์ ์ ฐ์ด๋์์ ์์น ์ ์ ์์ฑ์ ์์น๋ฅผ layout (location = 0)์ผ๋ก ์ง์ ํ์์ ๊ธฐ์ตํ์ธ์. ์ด๋ ์ ์ ์์ฑ์ ์์น๋ฅผ 0์ผ๋ก ์ค์ ํ๋ฉฐ, ์ด ์ ์ ์์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด 0์ ์ ๋ฌํฉ๋๋ค.
- ๋ค์ ์ธ์๋ ์ ์ ์์ฑ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค. ์ ์ ์์ฑ์ vec3์ด๋ฏ๋ก 3๊ฐ์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์ธ ๋ฒ์งธ ์ธ์๋ ๋ฐ์ดํฐ์ ์ ํ์ ์ง์ ํ๋ฉฐ, ์ด๋ GL_FLOAT์ ๋๋ค (GLSL์ vec*๋ ๋ถ๋ ์์์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค).
- ๋ค์ ์ธ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ์ ์ ๋ฐ์ดํฐ ์ ํ(int, byte)์ ์ ๋ ฅํ๊ณ ์ด๋ฅผ GL_TRUE๋ก ์ค์ ํ๋ฉด, ์ ์ ๋ฐ์ดํฐ๋ ๋ถ๋ ์์์ ์ผ๋ก ๋ณํ๋ ๋ 0(๋๋ ๋ถํธ ์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ -1)๊ณผ 1๋ก ์ ๊ทํ๋ฉ๋๋ค. ์ด๋ ์ฐ๋ฆฌ์๊ฒ ๊ด๋ จ์ด ์์ผ๋ฏ๋ก GL_FALSE๋ก ๋ก๋๋ค.
- ๋ค์ฏ ๋ฒ์งธ ์ธ์๋ 'stride'๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ ์ฐ์์ ์ธ ์ ์ ์์ฑ ๊ฐ์ ๊ณต๊ฐ์ ์๋ ค์ค๋๋ค. ๋ค์ ์์น ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋ถ๋ ์์์ ํฌ๊ธฐ์ 3๋ฐฐ ๋งํผ ๋จ์ด์ ธ ์์ผ๋ฏ๋ก ๊ทธ ๊ฐ์ stride๋ก ์ง์ ํฉ๋๋ค. ๋ฐฐ์ด์ด ๋ฐ์ง๋์ด ์๊ธฐ ๋๋ฌธ์(๋ค์ ์ ์ ์์ฑ ๊ฐ ์ฌ์ด์ ๊ณต๊ฐ์ด ์๊ธฐ ๋๋ฌธ์) stride๋ฅผ 0์ผ๋ก ์ง์ ํ์ฌ OpenGL์ด stride๋ฅผ ๊ฒฐ์ ํ๊ฒ ํ ์๋ ์์ต๋๋ค(๊ฐ์ด ๋ฐ์ง๋์ด ์์ ๋๋ง ์๋). ์ฌ๋ฌ ์ ์ ์์ฑ์ด ์์ ๋๋ ๊ฐ ์ ์ ์์ฑ ๊ฐ์ ๊ฐ๊ฒฉ์ ์ฃผ์ ๊น๊ฒ ์ ์ํด์ผ ํ์ง๋ง, ์ด์ ๋ํ ๋ ๋ง์ ์์๋ ๋์ค์ ๋ณผ ์ ์์ต๋๋ค.
- ๋ง์ง๋ง ๋งค๊ฐ๋ณ์๋ void* ์ ํ์ด๋ฏ๋ก ์ด์ํ ์บ์คํธ๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ๋ฒํผ์์ ์์น ๋ฐ์ดํฐ๊ฐ ์์๋๋ ์คํ์ ์ ๋๋ค. ์์น ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์์ ๋ถ๋ถ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ๊ทธ๋ฅ 0์ ๋๋ค. ์ด ๋งค๊ฐ๋ณ์์ ๋ํด์๋ ๋์ค์ ์ข ๋ ์์ธํ ์ดํด๋ณผ ๊ฒ์ ๋๋ค.
๊ฐ ์ ์ ์์ฑ์ VBO์ ์ํด ๊ด๋ฆฌ๋๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ,
์ด๋ค VBO์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋์ง(์ฌ๋ฌ VBO๋ฅผ ๊ฐ์ง ์ ์์)๋ glVertexAttribPointer๋ฅผ ํธ์ถํ ๋ GL_ARRAY_BUFFER์ ํ์ฌ ๋ฐ์ธ๋ฉ๋ VBO์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
glVertexAttribPointer๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ด์ ์ ์ ์๋ VBO๊ฐ ์ฌ์ ํ ๋ฐ์ธ๋ฉ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ ์ ์์ฑ 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๊ฐ ์ด์์ ์ ์ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ ์๋ง๋ ์๋ฐฑ ๊ฐ์ ๋ค์ํ ๊ฐ์ฒด(ํํ ์ผ)๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์์ํด๋ณด์ธ์.
์ ์ ํ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ๊ฐ ๊ฐ์ฒด์ ๋ชจ๋ ์ ์ ์์ฑ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋น ๋ฅด๊ฒ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ด ๋ฉ๋๋ค.
์ด๋ฌํ ์ํ ๊ตฌ์ฑ์ ๊ฐ์ฒด์ ์ ์ฅํ๊ณ ์ด ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ ์ํ๋ฅผ ๋ณต์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ด๋จ๊น์?
Vertex Array Object
VAO๋ VBO ์ฒ๋ผ ๋ฐ์ธ๋ฉ๋ ์ ์์ผ๋ฉฐ, ๊ทธ ์์ ๋ถํฐ ์ด๋ฃจ์ด์ง๋ ๋ชจ๋ ์ ์ ์์ฑ ํธ์ถ์ด VAO ๋ด๋ถ์ ์ ์ฅ๋ฉ๋๋ค.
์ด๋ ์ ์ ์์ฑ ํฌ์ธํฐ๋ฅผ ๊ตฌ์ฑํ ๋ ๊ทธ ํธ์ถ์ ํ ๋ฒ๋ง ์ํํ๋ฉด ๋๋ฉฐ,
๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆด ๋๋ง๋ค ํด๋น VAO๋ฅผ ๋ฐ์ธ๋ฉ ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ์ ์ ๋ฐ์ดํฐ ๋ฐ ์์ฑ ๊ตฌ์ฑ์ผ๋ก ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ ์ค์ ํ ๋ชจ๋ ์ํ๋ VAO ๋ด์ ์ ์ฅ๋ฉ๋๋ค.
Core OpenGL์ ์ ์ ์ ๋ ฅ์ ๋ํด ๋ฌด์์ ํ ์ง ์๊ธฐ ์ํด VAO ์ฌ์ฉ์ ์๊ตฌํฉ๋๋ค.
VAO๋ฅผ ๋ฐ์ธ๋ฉํ์ง ์์ผ๋ฉด OpenGL์ ๋๋ถ๋ถ ์๋ฌด๊ฒ๋ ๊ทธ๋ฆฌ์ง ์์ ๊ฒ์ ๋๋ค.
์ ์ ๋ฐฐ์ด ๊ฐ์ฒด๋ ๋ค์์ ์ ์ฅํฉ๋๋ค.
- glEnableVertexAttribArray ๋๋ glDisableVertexAttribArray์ ๋ํ ํธ์ถ.
- glVertexAttribPointer๋ฅผ ํตํ ์ ์ ์์ฑ ๊ตฌ์ฑ.
- glVertexAttribPointer ํธ์ถ์ ์ํ ์ ์ ์์ฑ๊ณผ ์ฐ๊ด๋ ์ ์ ๋ฒํผ ๊ฐ์ฒด.

VAO๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ VBO์ ๊ณผ์ ๊ณผ ์ ์ฌํฉ๋๋ค.
unsigned int VAO;
glGenVertexArrays(1, &VAO);
VAO๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ glBindVertexArray๋ฅผ ์ฌ์ฉํ์ฌ VAO๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ ์์ ๋ถํฐ ํด๋น VBO ๋ฐ ์์ฑ ํฌ์ธํฐ๋ฅผ ๋ฐ์ธ๋ฉ/๊ตฌ์ฑํ ํ ๋์ค์ ์ฌ์ฉํ๊ธฐ ์ํด VAO๋ฅผ ํด์ ํด์ผ ํฉ๋๋ค.
๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ถ์ ๋, ๊ทธ๋ฆฌ๋ ค๋ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ์ ํธํ๋ ์ค์ ์ผ๋ก VAO๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฝ๋์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.
// ..:: ์ด๊ธฐํ ์ฝ๋ (๊ฐ์ฒด๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ํ ํ ๋ฒ๋ง ์ํ) :: ..
// 1. ์ ์ ๋ฐฐ์ด ๊ฐ์ฒด ๋ฐ์ธ๋
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๋ฅผ ๋ค์ ํด์ ํฉ๋๋ค.
The triangle we've all been waiting for
์ฐ๋ฆฌ๊ฐ ์ ํํ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด, OpenGL์ ํ์ฌ ํ์ฑํ๋ ์์ด๋, ์ด์ ์ ์ ์๋ ์ ์ ์์ฑ ๊ตฌ์ฑ,
๊ทธ๋ฆฌ๊ณ VAO๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋ VBO์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ primitives๋ฅผ ๊ทธ๋ฆฌ๋ glDrawArrays๋ฅผ ์ ๊ณตํฉ๋๋ค.
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawArrays ํจ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฆฌ๊ณ ์ถ์ OpenGL primitive ์ ํ์ ๋ฐ์ต๋๋ค.
๋๋ฒ์งธ ์ธ์๋ ๊ทธ๋ฆฌ๊ณ ์ถ์ ์ ์ ๋ฐฐ์ด์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํฉ๋๋ค.
๋ง์ง๋ง ์ธ์๋ ๊ทธ๋ฆฌ๊ณ ์ถ์ ์ ์ ์ ์๋ฅผ ์ง์ ํ๋ฉฐ, 3 ์ ๋๋ค.

'๐ธ OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Learn OpenGL] Shaders - 1 (1) | 2023.11.18 |
|---|---|
| [Learn OpenGL] Hello Triangle - 4 (0) | 2023.11.18 |
| [Learn OpenGL] Hello Triangle - 2 (0) | 2023.11.17 |
| [Learn OpenGL] Hello Triangle - 1 (0) | 2023.11.16 |
| [Learn OpenGL] Creating a window(M1 Mac, Xcode) (0) | 2023.11.16 |