Element Buffer Objects
์ ์ ์ ๋ ๋๋งํ ๋ ๋ ผ์ํ ๋ง์ง๋ง ์ฌํญ์ Element Buffer Object ์ ๋๋ค.
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, // ์ค๋ฅธ์ชฝ ํ๋จ
-0.5f, -0.5f, 0.0f, // ์ผ์ชฝ ํ๋จ
-0.5f, 0.5f, 0.0f // ์ผ์ชฝ ์๋จ
};
๋ณด์๋ค์ํผ, ์ง์ ๋ ์ ์ ์ค ์ผ๋ถ๊ฐ ์ค๋ณต๋ฉ๋๋ค.
์ค๋ฅธ์ชฝ ํ๋จ๊ณผ ์ผ์ชฝ ์๋จ์ ๋๋ฒ์ฉ ์ง์ ํฉ๋๋ค.
์ด๊ฒ์ 50%์ ์ค๋ฒํค๋ ์ ๋๋ค. ๊ฐ์ ์ฌ๊ฐํ์ 6๊ฐ ๋์ 4๊ฐ์ ์ ์ ๋ง์ผ๋ก๋ ์ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ฒ๊ฐ์ ์ผ๊ฐํ์ด ์๋ ๋ ๋ณต์กํ ๋ชจ๋ธ์ ๊ฒฝ์ฐ ์ค๋ณต๋๋ ๋ถ๋ถ์ด ๋ง์์ง ์ ์์ต๋๋ค.
๋ ๋์ ํด๊ฒฐ์ฑ ์ ๊ณ ์ ํ ์ ์ ๋ง์ ์ ์ฅํ๊ณ , ์ด ์ ์ ๋ค์ ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ์์๋ฅผ ์ง์ ํ๋ ๊ฒ์ ๋๋ค.
์ด ๊ฒฝ์ฐ ์ฌ๊ฐํ์ ์ํด 4๊ฐ์ ์ ์ ๋ง ์ ์ฅํ๊ณ , ๊ทธ๋ฆฌ๊ณ ์ถ์ ์์๋ฅผ ์ง์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
OpenGL์ด ์ด๋ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ฉด ์ข๊ฒ ์ง์?
๋คํํ๋ EBO๋ ์ ํํ ๊ทธ๋ ๊ฒ ์๋ํฉ๋๋ค.
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๊ฐ์ ์ ์ ๋ง ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก ์์ ๋ฒํผ ๊ฐ์ฒด(Element Buffer Object, EBO)๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
unsigned int EBO;
glGenBuffers(1, &EBO);
VBO์ ๋ง์ฐฌ๊ฐ์ง๋ก EBO๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ glBufferData๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋ฒํผ์ ๋ณต์ฌํฉ๋๋ค.
VBO์ฒ๋ผ, ์ด ํธ์ถ๋ค๋ ๋ฐ์ธ๋์ ์ธ๋ฐ์ธ๋ ํธ์ถ ์ฌ์ด์ ๋ฐฐ์นํด์ผ ํ์ง๋ง,
์ด๋ฒ์๋ ๋ฒํผ ์ ํ์ผ๋ก 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๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํ์ธ์.
๋จ์ ์์ ์ glDrawArrays ํธ์ถ์ ์ธ๋ฑ์ค ๋ฒํผ์์ ์ผ๊ฐํ์ ๋ ๋๋งํ๋๋ก ์ง์ํ๋ glDrawElements๋ก ๋์ฒดํ๋ ๊ฒ์ ๋๋ค.
glDrawElements๋ฅผ ์ฌ์ฉํ ๋, ํ์ฌ ๋ฐ์ธ๋ฉ๋ ์์ ๋ฒํผ ๊ฐ์ฒด์ ์ ๊ณต๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
์ฒซ ๋ฒ์งธ ์ธ์๋ glDrawArrays์ ์ ์ฌํ๊ฒ ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ๋ชจ๋๋ฅผ ์ง์ ํฉ๋๋ค.
๋ ๋ฒ์งธ ์ธ์๋ ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ์์์ ๊ฐ์ ๋๋ ์นด์ดํธ์ ๋๋ค. 6๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ผ๋ฏ๋ก ์ด 6๊ฐ์ ์ ์ ์ ๊ทธ๋ฆฌ๋ ค๊ณ ํฉ๋๋ค.
์ธ ๋ฒ์งธ ์ธ์๋ ์ธ๋ฑ์ค์ ์ ํ์ผ๋ก GL_UNSIGNED_INT์ ๋๋ค.
๋ง์ง๋ง ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ EBO์์ ์คํ์ ์ ์ง์ ํ ์ ์์ต๋๋ค(๋๋ ์ธ๋ฑ์ค ๋ฐฐ์ด์ ์ ๋ฌํ ์ ์์ง๋ง, ๊ทธ๊ฒ์ ์์ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ ๋์ ๋๋ค), ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ด๊ฒ์ 0์ผ๋ก ๋๊ฒ ์ต๋๋ค.
glDrawElements ํจ์๋ ํ์ฌ GL_ELEMENT_ARRAY_BUFFER ๋์์ ๋ฐ์ธ๋ฉ๋ EBO์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์ด๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ ๋๋ง๋ค ํด๋น EBO๋ฅผ ๋ฐ์ธ๋ฉํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด๋ ๋ค์ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ ์ ๋ฐฐ์ด ๊ฐ์ฒด(Vertex Array Object, VAO)๋ ์์ ๋ฒํผ ๊ฐ์ฒด ๋ฐ์ธ๋ฉ์ ์ถ์ ํฉ๋๋ค.
VAO๊ฐ ๋ฐ์ธ๋ฉ๋์ด ์๋ ๋์ ๋ง์ง๋ง์ผ๋ก ๋ฐ์ธ๋ฉ๋ ์์ ๋ฒํผ ๊ฐ์ฒด๋ VAO์ ์์ ๋ฒํผ ๊ฐ์ฒด๋ก ์ ์ฅ๋ฉ๋๋ค.
VAO์ ๋ฐ์ธ๋ฉํ๋ฉด ํด๋น EBO๋ ์๋์ผ๋ก ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.

VAO๋ GL_ELEMENT_ARRAY_BUFFER๊ฐ ๋์์ผ ๋ glBindBuffer ํธ์ถ์ ์ ์ฅํฉ๋๋ค.
์ด๋ ๋ํ ํด์ ํธ์ถ๋ ์ ์ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก, VAO๋ฅผ ํด์ ํ๊ธฐ ์ ์ ์์ ๋ฐฐ์ด ๋ฒํผ๋ฅผ ํด์ ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด EBO๊ฐ ๊ตฌ์ฑ๋์ง ์์ ์ํ๊ฐ ๋ฉ๋๋ค.
์ด์ ์ด๊ธฐํ ๋ฐ ๋ ๋๋ง ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ ๋๋ค.
// ..:: ์ด๊ธฐํ ์ฝ๋ :: ..
// 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);
[...]
// ..:: ๋ ๋๋ง ๋ฃจํ์ ๊ทธ๋ฆฌ๊ธฐ ์ฝ๋ :: ..
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.

'๐ธ OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Learn OpenGL] Shaders - 2 (0) | 2023.11.18 |
|---|---|
| [Learn OpenGL] Shaders - 1 (1) | 2023.11.18 |
| [Learn OpenGL] Hello Triangle - 3 (0) | 2023.11.17 |
| [Learn OpenGL] Hello Triangle - 2 (0) | 2023.11.17 |
| [Learn OpenGL] Hello Triangle - 1 (0) | 2023.11.16 |