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

[Learn OpenGL] Hello Triangle - 2

by HOENDEV 2023. 11. 17.

Vertext input

๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  OpenGL์— ์ž…๋ ฅ ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

OepnGl์€ 3D๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฏ€๋กœ ๋ชจ๋“  ์ขŒํ‘œ๋Š” 3D(์ฆ‰, x, y, z)์ž…๋‹ˆ๋‹ค.

 

OpenGL์€ ๋‹จ์ˆœํžˆ ๋ชจ๋“  3D์ขŒํ‘œ๋ฅผ ํ™”๋ฉด์˜ 2Dํ”ฝ์…€๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

OpenGL์€ 3D์ขŒํ‘œ๊ฐ€ ๋ชจ๋“  3์ถ•์—์„œ -1.0๊ณผ 1.0 ์‚ฌ์ด์˜ ํŠน์ • ๋ฒ”์œ„์— ์žˆ์„ ๋•Œ๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ Normilized device coordinates๋Š” ํ™”๋ฉด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.(์ด ๋ฒ”์œ„ ๋ฐ–์˜ ๋ชจ๋“  ์ขŒํ‘œ๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

 

 

๋‹จ์ผ ์‚ผ๊ฐํ˜•์„ ๋ Œ๋”๋งํ•˜๊ณ ์ž ํ•˜๋ฏ€๋กœ ์ด ์„ธ ๊ฐœ์˜ ์ •์ ์„ ์ง€์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ ์ •์ ์€ 3D์œ„์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ OpenGL์˜ ๊ฐ€์‹œ์˜์—ญ์ธ Normilized device coordinates๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

float vertices[] = {
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f
};

 

OpenGL์€ 3D ๊ณต๊ฐ„์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์ •์ ์ด z ์ขŒํ‘œ๋ฅผ 0.0์œผ๋กœ ๊ฐ–๋Š” 2D ์‚ผ๊ฐํ˜•์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ผ๊ฐํ˜•์˜ ๊นŠ์ด๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด 2D์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

 

Normilized device coordinates(NDC)

vertex shader์—์„œ ์ •์  ์ขŒํ‘œ๊ฐ€ ์ฒ˜๋ฆฌ๋œ ํ›„, ๊ทธ๊ฒƒ๋“ค์€ x, y, z ๊ฐ’์ด -1.0 ์—์„œ 1.0๊นŒ์ง€ ๋ณ€ํ•˜๋Š” ์ž‘์€ ๊ณต๊ฐ„์ธ

 

ndc์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ขŒํ‘œ๋Š” ๋ฒ„๋ ค์ง€๊ฑฐ๋‚˜ ํด๋ฆฌํ•‘๋˜์–ด ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜๋Š” z์ถ•์„ ๋ฌด์‹œํ•œ ndc ๋‚ด์— ์ง€์ •๋œ ์‚ผ๊ฐํ˜•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

NDC์ขŒํ‘œ๋Š” glViewport์—์„œ ์ œ๊ณตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐํฌํŠธ ๋ณ€ํ™˜์„ ํ†ตํ•ด ํ™”๋ฉด ๊ณต๊ฐ€ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ ๊ฒฐ๊ณผ ํ™”๋ฉด ๊ณต๊ฐ„ ์ขŒํ‘œ๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์— ์ž…๋ ฅ์œผ๋กœ ๋ณ€ํ™˜ ๋ฉ๋‹ˆ๋‹ค.

 

 

์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•œ ํ›„, ์ด๋ฅผ ๊ทธ๋ž˜ํ”ฝ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ฒซ ๋ฒˆ์งธ ๊ณผ์ •์ธ ์ •์  ์…ฐ์ด๋”์— ์ž…๋ ฅ์œผ๋กœ ๋ณด๋‚ด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Š” GPU์— ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , OpenGL์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์„ฑํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

์ •์  ์…ฐ์ด๋”๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง€์‹œํ•œ ๋งŒํผ์˜ ์ •์ ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์†Œ์œ„ ์ •์  ๋ฒ„ํผ ๊ฐ์ฒด(VBO)๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 

VBO๋Š” GPU์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋งŽ์€ ์ˆ˜์˜ ์ •์ ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฒ„ํผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์ ์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ๊ทธ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•œ ๋ฒˆ์— ํ•œ ์ •์ ์”ฉ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. CPU์—์„œ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ณด๋‚ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์œผ๋ฉด ์ •์  ์…ฐ์ด๋”๋Š” ์ •์ ์— ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

 

 

์ •์  ๋ฒ„ํผ ๊ฐ์ฒด๋Š” OpenGL ์žฅ์—์„œ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด OpenGL ๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

 

OpenGL์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด ๋ฒ„ํผ์—๋Š” ํ•ด๋‹น ๋ฒ„ํผ์— ๋Œ€์‘ํ•˜๋Š” ๊ณ ์œ  ID๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ glGenBuffers ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํผ ID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

unsigned int VBO;
glGenBuffers(1, &VBO);

 

OpenGL์—๋Š” ๋งŽ์€ ์ข…๋ฅ˜์˜ ๋ฒ„ํผ ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ •์  ๋ฒ„ํผ ๊ฐ์ฒด์˜ ๋ฒ„ํผ ํƒ€์ž…์€ GL_ARRAY_BUFFER์ž…๋‹ˆ๋‹ค.

 

OpenGL์€ ๋‹ค๋ฅธ ๋ฒ„ํผ ํƒ€์ž…์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๋ฒ„ํผ์— ๋™์‹œ์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. glBindBuffer ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋ฒ„ํผ๋ฅผ 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 ํƒ€๊ฒŸ์— ๋ฐ”์ธ๋”ฉ๋œ ์ •์  ๋ฒ„ํผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

 

๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฒ„ํผ์— ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ ๋‹จ์œ„)๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ์ •์  ๋ฐ์ดํ„ฐ์˜ ๋‹จ์ˆœํ•œ sizeof๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

 

์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ „์†กํ•˜๊ณ ์ž ํ•˜๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

 

๋„ค ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๊ฐ€ ์ œ๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ธ ๊ฐ€์ง€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

 

  1. GL_STREAM_DRAW: ๋ฐ์ดํ„ฐ๋Š” ํ•œ ๋ฒˆ๋งŒ ์„ค์ •๋˜๊ณ  GPU์—์„œ ๋ช‡ ๋ฒˆ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. GL_STATIC_DRAW: ๋ฐ์ดํ„ฐ๋Š” ํ•œ ๋ฒˆ๋งŒ ์„ค์ •๋˜๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  3. GL_DYNAMIC_DRAW: ๋ฐ์ดํ„ฐ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์‚ผ๊ฐํ˜•์˜ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ , ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ชจ๋“  ๋ Œ๋”๋ง ํ˜ธ์ถœ์— ๋Œ€ํ•ด ๋™์ผํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ ์œ ํ˜•์€ GL_STATIC_DRAW๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ž์ฃผ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ฒ„ํผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, GL_DYNAMIC_DRAW ์‚ฌ์šฉ ์œ ํ˜•์€ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๊ฐ€ ๋” ๋น ๋ฅธ ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์น˜ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Vertext Shader

์ •์  ์…ฐ์ด๋”๋Š” ์šฐ๋ฆฌ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋Š” ์…ฐ์ด๋” ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

 

ํ˜„๋Œ€ 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์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค).

 

๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”์–ด ํ”„๋กœํŒŒ์ผ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ๋Š” in ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ์…ฐ์ด๋”์˜ ๋ชจ๋“  ์ž…๋ ฅ ์ •์  ์†์„ฑ์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

 

์ง€๊ธˆ์€ ์œ„์น˜ ๋ฐ์ดํ„ฐ์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฏ€๋กœ ๋‹จ์ผ ์ •์  ์†์„ฑ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

GLSL์—๋Š” ํฌ์ŠคํŠธํ”ฝ์Šค ์ˆซ์ž์— ๋”ฐ๋ผ 1์—์„œ 4๊ฐœ์˜ float๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ ์ •์ ์ด 3D ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ aPos๋ผ๋Š” ์ด๋ฆ„์˜ vec3 ์ž…๋ ฅ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ layout (location = 0)์„ ํ†ตํ•ด ์ž…๋ ฅ ๋ณ€์ˆ˜์˜ ์œ„์น˜๋ฅผ ํŠน๋ณ„ํžˆ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ด ์œ„์น˜๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Vector

๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๊ณต๊ฐ„ ๋‚ด์—์„œ ์œ„์น˜๋‚˜ ๋ฐฉํ–ฅ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์— ์œ ์šฉํ•œ ์ˆ˜ํ•™์  ํŠน์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์ˆ˜ํ•™์  ๊ฐœ๋…์ธ ๋ฒกํ„ฐ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

GLSL์—์„œ ๋ฒกํ„ฐ๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ 4์ด๋ฉฐ, ๊ฐ๊ฐ์˜ ๊ฐ’์„ vec.x, vec.y, vec.z, vec.w๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๊ฐ๊ฐ์€ ๊ณต๊ฐ„์—์„œ์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. vec.w ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ณต๊ฐ„์—์„œ์˜ ์œ„์น˜๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” 3D๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ์ง€, 4D๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค) ํ•˜์ง€๋งŒ perspective division์ด๋ผ๋Š” ๊ฒƒ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋ฒกํ„ฐ์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ๋…ผ์˜ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

 

 

์ •์  ์‰์ด๋”์˜ ์ถœ๋ ฅ์„ ์„ค์ •ํ•˜๋ ค๋ฉด vec4์ธ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜๋œ gl_Position์— ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ gl_Position์— ์„ค์ •ํ•œ ๊ฒƒ์ด ์ •์  ์‰์ด๋”์˜ ์ถœ๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

ํ˜„์žฌ ์ •์  ์‰์ด๋”๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ „ํ˜€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์‰์ด๋”์˜ ์ถœ๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

 

์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณดํ†ต ์ด๋ฏธ ์ •๊ทœํ™”๋œ device ์ขŒํ‘œ์— ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

 

๋จผ์ € OpenGL์˜ ๊ฐ€์‹œ ์˜์—ญ ๋‚ด์— ๋“ค์–ด๊ฐ€๋Š” ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Compiling a shader

์ฝ”๋“œ ํŒŒ์ผ ์ƒ๋‹จ์— ์ •์  ์‰์ด๋”์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ const C ๋ฌธ์ž์—ด๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

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;
}

 

์ •์  ์…ฐ์ด๋” ์ปดํŒŒ์ผ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ด์ œ ์ปดํŒŒ์ผ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

Fragment shader

ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ์‚ผ๊ฐํ˜•์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•  ๋‘ ๋ฒˆ์งธ์ด์ž ๋งˆ์ง€๋ง‰ ์…ฐ์ด๋”์ž…๋‹ˆ๋‹ค.

 

ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ํ”ฝ์…€์˜ ์ƒ‰์ƒ ์ถœ๋ ฅ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ํ•ญ์ƒ ์˜ค๋ Œ์ง€์ƒ‰ ๊ณ„์—ด์˜ ์ƒ‰์ƒ์„ ์ถœ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์—์„œ ์ƒ‰์ƒ์€ ๋นจ๊ฐ„์ƒ‰, ๋…น์ƒ‰, ํŒŒ๋ž€์ƒ‰ ๋ฐ ์•ŒํŒŒ(๋ถˆํˆฌ๋ช…๋„) ์„ฑ๋ถ„์˜ 4๊ฐ€์ง€ ๊ฐ’ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ RGBA๋กœ ์•ฝ์นญ๋ฉ๋‹ˆ๋‹ค. OpenGL์ด๋‚˜ GLSL์—์„œ ์ƒ‰์ƒ์„ ์ •์˜ํ•  ๋•Œ ๊ฐ ์„ฑ๋ถ„์˜ ๊ฐ•๋„๋ฅผ 0.0์—์„œ 1.0 ์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋นจ๊ฐ„์ƒ‰์„ 1.0, ๋…น์ƒ‰์„ 1.0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋‘ ์ƒ‰์ƒ์ด ํ˜ผํ•ฉ๋˜์–ด ๋…ธ๋ž€์ƒ‰์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ์„ธ ๊ฐ€์ง€ ์ƒ‰์ƒ ์„ฑ๋ถ„์„ ์‚ฌ์šฉํ•˜์—ฌ 1600๋งŒ ๊ฐ€์ง€ ์ด์ƒ์˜ ๋‹ค์–‘ํ•œ ์ƒ‰์ƒ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

#version 330 core
out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}

 

ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ถœ๋ ฅ ๋ณ€์ˆ˜๋งŒ ํ•„์š”ํ•˜๋ฉฐ, ์ด๋Š” ์ตœ์ข… ์ƒ‰์ƒ ์ถœ๋ ฅ์„ ์ •์˜ํ•˜๋Š” 4์ฐจ์› ๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” out ํ‚ค์›Œ๋“œ๋กœ ์ถœ๋ ฅ ๊ฐ’์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” FragColor๋ผ๊ณ  ์ ์ ˆํžˆ ์ด๋ฆ„์„ ์ง€์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ์™„์ „ํžˆ ๋ถˆํˆฌ๋ช…ํ•œ ์•ŒํŒŒ ๊ฐ’(1.0)์„ ๊ฐ€์ง„ ์˜ค๋ Œ์ง€์ƒ‰์œผ๋กœ vec4๋ฅผ ์ƒ‰์ƒ ์ถœ๋ ฅ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

 

ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์€ ์ •์  ์…ฐ์ด๋”์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ์…ฐ์ด๋” ์œ ํ˜•์œผ๋กœ GL_FRAGMENT_SHADER ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

 

unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);

 

์ด์ œ ๋‘ ์…ฐ์ด๋” ๋ชจ๋‘ ์ปดํŒŒ์ผ๋˜์—ˆ๊ณ , ๋‚จ์€ ์ผ์€ ๋‘ ์…ฐ์ด๋” ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋ Œ๋”๋ง์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์—์„œ๋„ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”!

 

Shader Program

์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ์…ฐ์ด๋”๊ฐ€ ๊ฒฐํ•ฉ๋œ ์ตœ์ข… ์—ฐ๊ฒฐ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

 

์ตœ๊ทผ์— ์ปดํŒŒ์ผ๋œ ์…ฐ์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด์— ์—ฐ๊ฒฐํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์ด ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ™œ์„ฑํ™”๋œ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์˜ ์…ฐ์ด๋”๋Š” ๋ Œ๋”๋ง ํ˜ธ์ถœ์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœ๊ทธ๋žจ์— ์…ฐ์ด๋”๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ, ๊ฐ ์…ฐ์ด๋”์˜ ์ถœ๋ ฅ์„ ๋‹ค์Œ ์…ฐ์ด๋”์˜ ์ž…๋ ฅ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

 

์ถœ๋ ฅ๊ณผ ์ž…๋ ฅ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค:

 

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' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Learn OpenGL] Hello Triangle - 4  (0) 2023.11.18
[Learn OpenGL] Hello Triangle - 3  (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
[Learn OpenGL] OpenGL  (0) 2023.11.15