๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ˜ธ OpenGL

[Learn OpenGL] Hello Triangle - 4

by HOENDEV 2023. 11. 18.

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