1 Getting started 1 OpenGL - JJhuk/LearnOpenGL GitHub Wiki

LearnOpenGL - OpenGL

url: https://learnopengl.com/Getting-started/OpenGL ์ƒ์„ฑ์ผ: 2020๋…„ 12์›” 20์ผ ์˜ค์ „ 1:32

์šฐ๋ฆฌ์˜ ์—ฌํ–‰์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ด์ „์—, ๋จผ์ € OpenGL์ด ์ •ํ™•ํ•˜๊ฒŒ ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•ด์•ผํ•ด. OpenGL์€ ์ฃผ๋กœ ๊ทธ๋ž˜ํ”ฝ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” API(Application Programming Interface) ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ OpenGL ์ž์ฒด๋Š” API๊ฐ€ ์•„๋‹ˆ๋ผ Khronos Group ์—์„œ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€/๊ด€๋ฆฌ ํ•˜๋Š” ์‚ฌ์–‘์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

Untitled

OpenGL ์‚ฌ์–‘์€ ๊ฐ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ / ์ถœ๋ ฅ์ด ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์€ ์ด ์‚ฌ์–‘์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. OpenGL ์‚ฌ์–‘์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๊ฐœ๋ฐœ ๋œ OpenGL ๋ฒ„์ „์€ ํ•ด๋‹น ๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜๋Š” ํ•œ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ ์ œ์กฐ์—…์ฒด์ž…๋‹ˆ๋‹ค. ๊ตฌ์ž… ํ•œ ๊ทธ๋ž˜ํ”ฝ์นด๋“œ๋Š” ํ•ด๋‹น ์นด๋“œ (์‹œ๋ฆฌ์ฆˆ) ์šฉ์œผ๋กœ ํŠน๋ณ„ํžˆ ๊ฐœ๋ฐœ ๋œ OpenGL ๋ฒ„์ „ ์ธ ํŠน์ • ๋ฒ„์ „์˜ OpenGL์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Apple ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ๋•Œ OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Apple ์ž์ฒด์—์„œ ์œ ์ง€/๊ด€๋ฆฌํ•˜๋ฉฐ Linux์—์„œ๋Š” ๊ทธ๋ž˜ํ”ฝ ๊ณต๊ธ‰ ์—…์ฒด์˜ ๋ฒ„์ „๊ณผ ์• ํ˜ธ๊ฐ€๋“ค์ด ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ • ํ•œ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ OpenGL์—์„œ๋Š” ๋‚˜์˜ค์ง€ ์•Š๋Š” ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋™์ž‘์„ ๋ณด์ผ๋•Œ๋งˆ๋‹ค ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ ์ œ์กฐ์—…์ฒด(๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ/์œ ์ง€ ํ•œ ์‚ฌ๋žŒ)์˜ ์ž˜๋ชป ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ตฌํ˜„์€ ๊ทธ๋ž˜ํ”ฝ์นด๋“œ ์ œ์กฐ์—…์ฒด์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ตฌํ˜„์— ์žˆ์–ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ๋•Œ๋งˆ๋‹ค ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธ ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋“œ๋ผ์ด๋ฒ„์—๋Š” ์นด๋“œ๊ฐ€ ์ง€์›ํ•˜๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ OpenGL์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ทธ๋ž˜ํ”ฝ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

Khronos๋Š” ๋ชจ๋“  OpenGL ๋ฒ„์ „์— ๋Œ€ํ•œ ๋ชจ๋“  ์‚ฌ์–‘ ๋ฌธ์„œ๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๊ด€์‹ฌ์žˆ๋Š” ๋…์ž๋Š” ๋ฒ„์ „ 3.3์˜ OpenGL (์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ) ์‚ฌ์–‘์„ ์—ฌ๊ธฐ์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenGL์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ž์„ธํžˆ ์‚ดํŽด ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์ข‹์€ ์ฐธ๊ณ ์ž๋ฃŒ ์ž…๋‹ˆ๋‹ค. (๊ตฌํ˜„์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•˜์„ธ์š”) ์ด ์‚ฌ์–‘์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ์ •ํ™•ํ•œ ์ž‘๋™์„ ์ฐพ๊ธฐ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ์ฐธ๊ณ ์ž๋ฃŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Core-profile vs Immediate mode

์ด์ „์—๋Š”, OpenGL๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๋ž˜ํ”ฝ์„ ๊ทธ๋ฆฌ๋Š” ๋Œ€์— ์‰ฌ์šด Immediate mode( ์ข…์ข… ๊ณ ์ • ํ•จ์ˆ˜ ํŒŒ์ดํ”„๋ผ์ธ์ด๋ผ๊ณ  ์–ธ๊ธ‰๋˜๋Š”) ์—์„œ ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ OpenGL์˜ ํ•จ์ˆ˜๋“ค์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์— ์ˆจ๊ฒจ์ ธ ์žˆ์—ˆ๊ณ  ๊ฐœ๋ฐœ์ž๋Š” OpenGL์ด ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ๊ณ„์‚ฐ๋ฐฉ์‹์„ ์ œ์–ดํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์œ ์—ฐ์„ฑ์„ ์›ํ–ˆ๊ณ , ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๋ž˜ํ”ฝ์„ ๋” ์ž˜ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Immediate mode๋Š” ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ์—” ์ •๋ง ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ 3.2 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Immediate mode๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•˜์˜€์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ OpenGL์˜ Core-Frofile mode์—์„œ ๊ฐœ๋ฐœํ•˜๋„๋ก ์žฅ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” OpenGL์˜ ์‚ฌ์–‘์—์„œ ์ด์ „ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

OpenGL์˜ core-profile์„ ์‚ฌ์šฉํ• ๋•Œ์—๋Š” OpenGL์€ ์šฐ๋ฆฌ๊ฐ€ ํ˜„๋Œ€์ ์ธ ๊ด€ํ–‰์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ OpenGL'์˜ deprecated๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ• ๋•Œ๋งˆ๋‹ค, OpenGL์€ ์—๋Ÿฌ๋ฅผ ๋‚ด๋ฟœ๊ณ  ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ํ˜„๋Œ€์  ์ ‘๊ทผ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์˜ ์ด์ ์€ ๋งค์šฐ ์œ ์—ฐํ•˜๋ฉฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ง์€ ๋ฐฐ์šฐ๊ธฐ์—๋Š” ๋” ์–ด๋ ต๋‹ค๋Š” ๋œป์ด๊ธฐ๋„ ํ•˜์ง€์š”. Immediate mode๋Š” OpenGL์ด ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋“ค์ด ์ƒ๋‹นํžˆ ๋งŽ์ด ์ถ”์ƒํ™”๋˜์—ˆ์œผ๋ฉฐ ๋ฐฐ์šฐ๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€์ ์ธ ์ ‘๊ทผ๋ฒ•์€ ๊ฐœ๋ฐœ์ž๊ฐ€ OpenGL๊ณผ ๊ทธ๋ž˜ํ”ฝ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง„์ •์œผ๋กœ ์ดํ•ดํ•˜๋„๋ก ์š”๊ตฌํ•˜๋ฉฐ ์•ฝ๊ฐ„ ์–ด๋ ต์ง€๋งŒ ํ›จ์”ฌ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์ดํ•ด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ด ์ฑ…์ด Core-Profile OpenGL ๋ฒ„์ „ 3.3์— ๋งž์ถฐ์ง„ ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์–ด๋Ÿฝ์ง€๋งŒ ๋…ธ๋ ฅํ• ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋ถ€ํ„ฐ OpenGL์˜ ์ƒ์œ„ ๋ฒ„์ „์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ž‘์„ฑ ์‹œ์ ์œผ๋กœ๋Š” 4.6) ์ด๋ ‡๊ฒŒ ์งˆ๋ฌธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. '์™œ OpenGL 4.6์„ ๋ฐฐ์šฐ์ง€ ์•Š๊ณ  OpenGL 3.3์„ ๋ฐฐ์›Œ์•ผ ํ•˜๋‚˜์š”?' ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. 3.3 ์ดํ›„์˜ OpenGL ๋ฒ„์ „์€ OpenGL์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  OpenGL์— ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„ ๋” ํšจ์œจ์ ์ด๊ฑฐ๋‚˜ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋“  ๊ฐœ๋…๊ณผ ๊ธฐ์ˆ ์ด ์ตœ์‹  OpenGL ๋ฒ„์ „์—์„œ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋ฏ€๋กœ OpenGL 3.3์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์ค€๋น„๊ฐ€ ๋˜๊ฑฐ๋‚˜ ๋” ๊ฒฝํ—˜์ด ๋งŽ์„๋•Œ๋งˆ๋‹ค ์ตœ์‹  OpenGL ๋ฒ„์ „์˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ๋ฒ„์ „์˜ OpenGL์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์‹  ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋งŒ ๋„ˆ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด ์ค„ ๊ป๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋‚ฎ์€ ๋ฒ„์ „์˜ OpenGL์„ ๋Œ€์ƒ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ ๋” ๋†’์€ ๋ฒ„์ „์˜ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ฑ•ํ„ฐ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๋” ํ˜„๋Œ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Extensions

OpenGL์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ํ™•์žฅ ์ง€์›์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ํšŒ์‚ฌ๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์ด๋‚˜ ๋ Œ๋”๋ง์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋Œ€๊ทœ๋ชจ ์ตœ์ ํ™”๋ฅผ ์ œ์•ˆ ํ•  ๋•Œ๋งˆ๋‹ค ๋“œ๋ผ์ด๋ฒ„์— ๊ตฌํ˜„๋œ ํ™•์žฅ์—์„œ ์ข…์ข… ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋Š” ๋ณด๋‹ค ๊ณ ๊ธ‰์ ์ด๊ฑฐ๋‚˜ ํšจ์œจ์ ์ธ ๊ทธ๋ž˜ํ”ฝ์„ ์œ„ํ•ด ํ™•์žฅ์—์„œ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๋ž˜ํ”ฝ ๊ฐœ๋ฐœ์ž๋Š” OpenGL์ด ํ–ฅํ›„ ๋ฒ„์ „์— ๊ธฐ๋Šฅ์„ ํฌํ•จ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์ด ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ์—์„œ ํ™•์žฅ์ด ์ง€์›๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๋ Œ๋”๋ง ๊ธฐ์ˆ ์„ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…์ข… ํ™•์žฅ์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๋งค์šฐ ์œ ์šฉํ•  ๋•Œ ํ•ญํ›„ OpenGL ๋ฒ„์ „์˜ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ์„ ํ•ด ๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋˜๋Š” OpenGL ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ) ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ™•์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ž‘์—…์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if(GL_ARB_extension_name)
{
    // ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฉ‹์ง€๊ณ  ์ƒˆ๋กœ์šด ํ˜„๋Œ€์ ์ธ ์ž‘์—… ์ˆ˜ํ–‰
}
else
{
    // ํ™•์žฅ์ด ์ง€์›๋˜์ง€ ์•Š์Œ: ์ด์ „ ๋ฐฉ์‹ ์‚ฌ์šฉ
}

OpenGL 3.3 ๋ฒ„์ „์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ์ˆ ์— ๋Œ€ํ•œ ํ™•์ •์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ ์ ˆํ•œ ์ง€์นจ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

State machine

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

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

OpenGL์—์„œ ์ž‘์—… ํ•  ๋•Œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋“ค๊ณผ OpenGL์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ ์‚ฌ์šฉ ํ•จ์ˆ˜๋ฅผ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. OpenGL์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํฐ ์ƒํƒœ๋จธ์‹ ์ด๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋Š” ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ•จ์ˆ˜๋“ค์ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Objects

OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” C๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋งŽ์€ ํŒŒ์ƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•ต์‹ฌ์—๋Š” C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. C์˜ ๋งŽ์€ ์–ธ์–ด ๊ตฌ์กฐ๋Š” ๋‹ค๋ฅธ ๊ณ ์ˆ˜์ค€ ์–ธ์–ด๋กœ ์ž˜ ๋ฒˆ์—ญ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— OpenGL์€ ๋ช‡ ๊ฐ€์ง€ ์ถ”์ƒํ™”๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ƒํ™” ์ค‘ ํ•˜๋‚˜๋Š” OpenGL์˜ Object ์ž…๋‹ˆ๋‹ค.

OpenGL์˜ Object๋Š” OpenGL ์ƒํƒœ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ต์…˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋“œ๋กœ์ž‰ ์ฐฝ์˜ ์„ค์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” Obejct๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํฌ๊ธฐ, ์ง€์›๋˜๋Š” ์ƒ‰์ƒ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Object๋ฅผ C์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ์ฒด๋กœ ์‹œ๊ฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct object_name {
    float  option1;
    int    option2;
    char[] name;
};

Object๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ• ๋•Œ๋งˆ๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (OpenGL์˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ํฐ ๊ตฌ์กฐ์ฒด๋กœ ์‹œ๊ฐํ™”๋จ)


// OpenGL์˜ ์ƒํƒœ
struct OpenGL_Context {
  	...
  	object_name* object_Window_Target;
  	...  	
};


// object 
unsigned int objectId = 0;
glGenObject(1, &objectId);
// ์ปจํ…์ŠคํŠธ์— object๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ํ• ๋‹นํ•จ
glBindObject(GL_WINDOW_TARGET, objectId);
// ํ˜„์ œ GL_WINDOW_TARGET์— ๋ฐ”์ธ๋”ฉ ๋œ Obejct์˜ ์˜ต์…˜ ์„ค์ •
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH,  800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// ์ปจํ…์ŠคํŠธ ๋Œ€์ƒ์„ ๋‹ค์‹œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
glBindObject(GL_WINDOW_TARGET, 0);

์ด ์ž‘์€ ์ฝ”๋“œ๋Š” OpenGL๋กœ ์ž‘์—… ํ•  ๋•Œ ์ž์ฃผ ๋ณด๊ฒŒ๋˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค. ๋จผ์ € Object๋ฅผ ๋งŒ๋“ค๊ณ  ์ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ID๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. (์‹ค์ œ Obejct์˜ ๋ฐ์ดํ„ฐ๋Š” ์ด ์”ฌ ๋’ค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฐ ๋‹ค์Œ Obejct(Id๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ)๋ฅผ ์ปจํ…์ŠคํŠธ์˜ ๋Œ€์ƒ ์œ„์น˜์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.( ์˜ˆ์ œ ์ฐฝ Object ๋Œ€์ƒ์˜ ์œ„์น˜๋Š” GL_WINDOW_TARGET์œผ๋กœ ์ •์˜ ๋จ). ๋‹ค์Œ์œผ๋กœ ์ฐฝ ์˜ต์…˜์„ ์„ค์ •ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฐฝ ๋Œ€์ƒ์˜ ํ˜„์žฌ Obejct Id๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐœ์ฒด์˜ ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํ•œ ์˜ต์…˜์€ Object Id๊ฐ€ ์ฐธ์กฐํ•˜๋Š” Object์— ์ €์žฅ๋˜๊ณ  Obejct๋ฅผ GL_WINDOW_TARGET์— ๋‹ค์‹œ ๋ฐ”์ธ๋”ฉํ•˜์ž๋ง์ž ๋ณต์›๋ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์ œ๊ณต๋œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์€ OpenGL์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ทผ์‚ฌ์น˜ ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ฑ… ์ „์ฒด์—์„œ ์ถฉ๋ถ„ํ•œ ์‹ค์ œ ์˜ˆ์ œ๋ฅผ ๋ณด๊ฒŒ ๋ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ Object๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์žฅ ์ข‹์€ ์ ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‘˜ ์ด์ƒ์˜ Object๋ฅผ ์ •์˜ํ•˜๊ณ  ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ OpenGL์˜ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ์›ํ•˜๋Š” ์„ค์ •์œผ๋กœ Object๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 3d ๋ชจ๋ธ ๋ฐ์ดํ„ฐ (์ง‘ ๋˜๋Š” ์ผ€๋ฆญํ„ฐ) ์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ Object ์—ญํ• ์„ ํ•˜๋Š” Object๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ทธ๋ฆด ๋•Œ๋งˆ๋‹ค ๊ทธ๋ฆฌ๋ ค๋Š” ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ Object๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค(์ฒ˜์Œ์— ๋งŒ๋“ค๊ณ  ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.) ์ด๋Ÿฌํ•œ Object์— ๋Œ€ํ•œ ์˜ต์…˜์€ ์—ฌ๋Ÿฌ ๋ชจ๋ธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŠน์ • ๋ชจ๋ธ์„ ๊ทธ๋ฆด๋•Œ๋งˆ๋‹ค, ๋ชจ๋“  ์˜ต์…˜์„ ๋‹ค์‹œ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ฆฌ๊ธฐ ์ „์— ํ•ด๋‹น Obejct๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Let's get started

์ด์ œ OpenGL์„ ์‚ฌ์–‘ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, OpenGL ์ด ๋Œ€๋ฝ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™๋˜๋Š”์ง€, OpenGL์ด ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ •์˜ ํŠธ๋ฆญ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋”๋ผ๋„ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ฑ… ์ „์ฒด์—์„œ ๊ฐ ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ณ  OpenGL์„ ์‹ค์ œ๋กœ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Additional resources

  • opengl.org: official website of OpenGL.
  • OpenGL registry: hosts the OpenGL specifications and extensions for all OpenGL versions.