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

[Learn OpenGL] Hello Triangle - 3

by HOENDEV 2023. 11. 17.

์ •์  ์…ฐ์ด๋”๋Š” ์ •์  ์†์„ฑ์˜ ํ˜•ํƒœ๋กœ ์›ํ•˜๋Š” ์ž…๋ ฅ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ด๋Š” ํฐ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ,

 

์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ •์  ์…ฐ์ด๋”์˜ ์–ด๋–ค ์ •์  ์†์„ฑ์œผ๋กœ ๊ฐ€์•ผ ํ•˜๋Š”์ง€ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— 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