728x90

์–ธ๋ฆฌ์–ผ ๊ณต๋ถ€๋ฅผ ์ฒ˜์Œ ํ•˜๋‹ค๋ณด๋‹ˆ ์ธํ”„๋Ÿฐ์—์„œ ๊ฐ•์˜๋ฅผ ์ฐพ์•„๋ดค์Œ์—๋„ 5.1 -> 5.2๋กœ ์—”์ง„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋‹ˆ ๊ฐ‘์ž๊ธฐ ๊ฐ™์€ ์ฝ”๋“œ๋ผ ํ•ด๋„ ๋ฒ„๊ทธ๊ฐ€ ๋œจ๋”๋ผ..

๋””๋ฒ„๊ทธ ํ•ด์„œ ํƒ€๊ณ ํƒ€๊ณ  ์ฐพ์•„๋ณด๋‹ˆ GetWorld() ๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์˜€๋Š”๋ฐ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋ชฐ๋ผ์„œ ๋ฐ›์•„์˜ค๋Š”๊ฒŒ ๋ฌธ์ œ์ธ๊ฐ€.. ๋‚ด๊ฐ€ ์ฐพ์•„๋ณธ๊ฒŒ ๋งž๋‚˜..ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ์™€์ค‘์— ๊ต‰์žฅํ•œ ๋„์›€์„ ์ฃผ์‹ .. ์ค‘๊ตญ ์‚ฌ์ดํŠธ๋ถ„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค..

https://blog.csdn.net/qq_31930499/article/details/88365717

 

UE4 GEngine->GetWorld() == NULL-CSDNๅšๅฎข

ๅœจDedicated Serverๆจกๅผไธ‹๏ผŒload็ŽฉMapๅŽๆˆ‘ๆƒณๅœจๆˆ‘็š„C++ไปฃ็ ไธญๆƒณ่Žทๅ–GameInstance๏ผŒ้€š่ฟ‡ GEngine->GetWorld()->GetGameInstance() ่ฏญๅฅ่Žทๅ–๏ผŒไฝ†ๆ˜ฏ็จ‹ๅบ่ฟ่กŒๅˆฐ่ฟ™๏ผŒๅ‡บ็Žฐๆฎต้”™่ฏฏใ€‚ ็„ถๅŽๅฐ่ฏ•่Žทๅ–World๏ผŒ GEngine->GetWorld() ๅ‘็Žฐ

blog.csdn.net

 

๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” GetWorld() ์•ž์— GWorld->GetGameInstance()๋ฅผ ๋ถ™์—ฌ์ฃผ๋‹ˆ ๋™์ž‘์ด ์ž˜๋œ๋‹ค.

 

์ตœ์ ํ™”์ ์ธ ์ธก๋ฉด์—์„œ ์ข‹์€์ง€ ์•ˆ์ข‹์€์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ทธ๋ถ€๋ถ„์€ ์ข€ ๋” ์ฐพ์•„๋ด์•ผํ• ๋“ฏํ•˜๋‹ค.

๋‚˜์ฒ˜๋Ÿผ ์ฒ˜์Œ ์–ธ๋ฆฌ์–ผ์„ ๋งŒ์ง€๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ผ๋ฉฐใ… ใ… 

 

 

๋ฐ˜์‘ํ˜•

'๊ฒŒ์ž„์—”์ง„ > UE5' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[UE5] ์–ธ๋ฆฌ์–ผ ๋ฒ„์ „ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•  (0) 2024.03.17
728x90

์›๋ฌธ: https://benui.ca/unreal/ui-cpp-basics/

 

Unreal์„ ์œ„ํ•œ ๋งŽ์€ UI ํŠœํ† ๋ฆฌ์–ผ์€ Blueprint์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๋„“์€ ๋งค๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ์ „๋ฌธ๊ฐ€ ์ˆ˜์ค€์˜ UI๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด C++์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์™œ ์šฐ๋ฆฌ๋Š” C++์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

์šฐ์„ , ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๋Š” Blueprint๋กœ ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์™œ ์šฐ๋ฆฌ๋Š” C++๋กœ UI๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋‚˜์š”? ๋ผ๋Š” ์งˆ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งž์„์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•„๋‹์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Blueprint๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ๊ฒŒ์ž„์˜ UI๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ฌธ์ œ์— ๋ถ€๋”ชํž ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

C++์„ ์‚ฌ์šฉํ•œ UI๋ฅผ ๋งŒ๋“œ๋Š” ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

์—ฌ๊ธฐ์„œ ์ผ์ด ์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค. ๋ชจ๋“  UI ๋””์ž์ธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” 100๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋‹ค๋ฃจ๊ฒ ์ง€๋งŒ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

  • UUserWidget ์˜ Subclassing(๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)
  • Subclassing ํ˜น์€ ์ƒˆ๋กœ์šด UMG ์œ„์ ฏ ์ƒ์„ฑ
  • Subclassing ํ˜น์€ ์ƒˆ๋กœ์€ Slate ์œ„์ ฏ ์ƒ์„ฑ

์ด๊ฒƒ๋“ค์€ ๊ฐ๊ฐ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ์˜๋งˆํ•˜๋Š” ๋ฐ”๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” Slate์™€ UMG์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์–˜๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Slate์™€ UMG

์ฒซ ๋ฒˆ์งธ C++ ๊ธฐ๋ฐ˜ UserWidget์„ ๋งŒ๋“ค๋ ค๋ฉด UUserWidget์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ธ C++ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

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

 

๋‹ค์Œ ๋‹จ๊ณ„๋Š” C++์—์„œ ์œ„์ ฏ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ์‹œ๋ฆฌ์ฆˆ์˜ ์„œ๋ก ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Unreal(4.15 ๊ธฐ์ค€)์—๋Š” UMG์™€ Slate ๋‘ ๊ฐ€์ง€ UI ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Slate๋Š” ์˜ค๋ž˜๋œ Unreal UI ์‹œ์Šคํ…œ์ด๊ณ , UMG์™€ ์—๋””ํ„ฐ๊ฐ€ ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์ ฏ ์„ค์ •์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์ „์ ์ธ ์™ธ๊ด€์˜ C++์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. "์˜ค๋ž˜๋œ" ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ํ•ด์„œ ์˜ค๋ž˜๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. UI์— ๋” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์Šฌ๋ ˆ์ดํŠธ๋ฅผ ์ ์ฐจ ๋ฐฐ์›Œ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

UMG๋Š” Unreal 4์˜ ์ผ๋ถ€๋กœ ์ถ”๊ฐ€๋œ ์ƒˆ๋กœ์šด UI ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. Blueprint ์นœํ™”์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ๋””์ž์ด๋„ˆ๊ฐ€ ํŽธ์ง‘๊ธฐ์—์„œ UI๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ UMG ์œ„์ ฏ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑฐ์˜ ๋™์ผํ•œ ์ด๋ฆ„์˜ Slate ํด๋ž˜์Šค๋ฅผ ๋‚ด๋ถ€์— ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. **Slate ํด๋ž˜์Šค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง์„ ์ฒ˜๊ธฐํ•˜๊ณ  ํ•ด๋‹น UMG ํด๋ž˜์Šค๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ์‹ธ๋Š” wrapper์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด UImage๋Š” UMG ํด๋ž˜์Šค์ด๋ฉฐ ๋‚ด๋ถ€์— SImage ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

 

๋จผ์ €, ์—ญ์‚ฌ์˜ ์ž‘์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋„˜์–ด๊ฐ€์ง€ ๋งˆ์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

 

4.0 ๋ฒ„์ „ ์ด์ „์—๋Š” Unreal์˜ UI๊ฐ€ Slate๋ผ๋Š” ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ C++์˜ UI๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํŠœํ† ๋ฆฌ์–ผ ์‹œ๋ฆฌ์ฆˆ์—์„œ ์—ฌ๋Ÿฌ๋ถ„๋„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์–ธ๋ฆฌ์–ผ ์—”์ง„ 4.0 ๋ฒ„์ „์œผ๋กœ ์—ํ”ฝ์€ ๊ทธ๋“ค์˜ ์ƒˆ๋กœ์šด UI ์‹œ์Šคํ…œ์ธ UMG๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. UMG๋Š” ํšจ๊ณผ์ ์œผ๋กœ Slate๋ฅผ ๊ฐ์‹ธ๋Š” wrapper ์ด๊ณ , Blueprints์—์„œ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  UI ๋””์ž์ด๋„ˆ๊ฐ€ ์–ธ๋ฆฌ์–ผ ์—๋””ํ„ฐ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ UI๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Slate๊ฐ€ ๋…ผ์˜ํ•  ๋ชจ๋“  UMG์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋กฏ, ๋‹ค์–‘ํ•œ ์œ„์ ฏ, ์œ„์ ฏ์— ๋Œ€ํ•œ ์˜ต์…˜ ๋“ฑ์€ Slate์™€ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. UMG๋Š” Slate๋ฅผ ์œ„ํ•œ ์—๋””ํ„ฐ ๋ฐ Blueprint์— ์ ํ•ฉํ•œ wrapper์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ๋ฐฉ๋ฒ•

์ด ๋ฐฉ๋ฒ•์—์„œ ๋ฒ—์–ด๋‚˜ UI์— C++ ๊ธฐ๋ฐ˜ ์œ„์ ฏ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ๋‚˜์—ด๋œ ๊ฒƒ์€ ์ ์ง„์ ์œผ๋กœ ๋‚ฎ์€ ์ˆ˜์ค€์˜ '๋” ๋งŽ์€ ์ž‘์—…'์ด๋ฉฐ, ๊ทธ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ '์ตœ์ƒ์˜ ๋ฐฉ๋ฒ•'์€ ์•„๋‹ˆ๋ฉฐ, ๊ฐ๊ฐ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๊ฐ๊ฐ์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งฅ๋ฝ์ƒ, ์—ฌ๋Ÿฌ ํ•ด ๋™์•ˆ Unreal UI ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ ์ผํ•œ ๊ฒฝํ—˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ปค์Šคํ…€ UUserWidget - 95%์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•จ
  • ์ปค์Šคํ…€ UMG/Slate subclass - 5%์˜ ๊ฒฝ์šฐ (๋งค์šฐ ํŠน์ •ํ•œ ๊ฒƒ์„ ์›ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ UMG/Slate ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ฌ)

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

 

๊ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐ๊ฐ์˜ ํŠœํ† ๋ฆฌ์–ผ๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

 

1. ๋ฌธ์ œ

 

์ „์ฒด ํ•™์ƒ์˜ ์ˆ˜ n,

์ฒด์œก๋ณต์„ ๋„๋‚œ๋‹นํ•œ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด lost, 

์—ฌ๋ฒŒ์˜ ์ฒด์œก๋ณต์„ ๊ฐ€์ ธ์˜จ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด reserve๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ,

 ์ฒด์œก์ˆ˜์—…์„ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ํ•™์ƒ์˜ ์ตœ๋Œ“๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

2. ์ฝ”๋“œ

#include <string>
#include <vector>
#include <iostream>

using namespace std;

//n : ์ „์ฒด ํ•™์ƒ์˜ ์ˆ˜
//lost : ์ฒด์œก๋ณต์„ ๋„๋‚œ๋‹นํ•œ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ ๋ฐฐ์—ด
//reserve : ์—ฌ๋ฒŒ์˜ ์ฒด์œก๋ณต์„ ๊ฐ€์ ธ์˜จ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ ๋ฐฐ์—ด
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    
    //์•ž ๋’ค ์ˆ˜๋ฅผ ๋น„๊ตํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ ๊ณผ์ •์ด ๊ผญ ํ•„์š”ํ•จ
    sort(lost.begin(),lost.end());
    sort(reserve.begin(),reserve.end());
    
    //๋‘๊ฐ€์ง€ ๋ฐฐ์—ด์„ ํ†ตํ•ด ๋ฒกํ„ฐ์˜ ์‚ฝ์ž…,์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ 
    //์ฒดํฌ๋ฅผ ํ–ˆ๋Š”์ง€ ํ‘œ์‹œํ•ด์คŒ
    bool isChecked[31]={false};
    bool isCheckedReserve[31]={false};
    int coverNum=0;
    
    //๋จผ์ € ๊ฐ™์€ ๊ฐ’๋“ค์€ ๋ชจ๋‘ true๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋นŒ๋ ค์คŒ์œผ๋กœ์จ ๋ฉ”๊ฟ€์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ˆ˜๋ฅผ ์ฆ๊ฐ€
    for(int i=0;i<reserve.size();i++)
    {
        for(int j=0;j<lost.size();j++){
            if(reserve[i]==lost[j]){
                isChecked[j]=true;
                isCheckedReserve[i]=true;
                coverNum++;
            }
        }
    }
    //๊ทธ ํ›„ ๋‚จ์€ ๊ฒƒ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์•ž๋’ค์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฉ”๊ฟ€์ˆ˜ ์žˆ๋Š” ํ•™์ƒ ์ˆ˜ ๊ณ„์‚ฐ
    for(int i=0;i<reserve.size();i++){
        if(coverNum==lost.size())break;
        for(int j=0;j<lost.size();j++){
            if(isChecked[j]||isCheckedReserve[i]) continue;
            else if(lost[j]-1==reserve[i]||lost[j]+1==reserve[i])
            {
                coverNum++;
                isChecked[j]=true;
                isCheckedReserve[i]=true;
            }
        }
    }
    
    //์ •๋‹ต = ์ดํ•™์ƒ์ˆ˜ - ์žƒ์–ด๋ฒ„๋ฆฐ ์ฒด์œก๋ณต ์ˆ˜ + ๋ฉ”๊พผ ํ•™์ƒ ์ˆ˜
    answer = n-lost.size()+coverNum;
    
    return answer;
}

 

3. ํ•ด์„ค

//n : ์ „์ฒด ํ•™์ƒ์˜ ์ˆ˜
//lost : ์ฒด์œก๋ณต์„ ๋„๋‚œ๋‹นํ•œ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ ๋ฐฐ์—ด
//reserve : ์—ฌ๋ฒŒ์˜ ์ฒด์œก๋ณต์„ ๊ฐ€์ ธ์˜จ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ ๋ฐฐ์—ด
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    
    //์•ž ๋’ค ์ˆ˜๋ฅผ ๋น„๊ตํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ ๊ณผ์ •์ด ๊ผญ ํ•„์š”ํ•จ
    sort(lost.begin(),lost.end());
    sort(reserve.begin(),reserve.end());

๋จผ์ € ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ์˜ˆ์™ธ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ ฌ์„ ์ง„ํ–‰ํ•ด์ค€๋‹ค. ์žƒ์–ด๋ฒ„๋ฆฐ ์‚ฌ๋žŒ๋“ค๊ณผ ์—ฌ๋ฒŒ์˜ ์ฒด์œก๋ณต์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ฐฐ์—ด์„ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•œ๋‹ค.

    //๋‘๊ฐ€์ง€ ๋ฐฐ์—ด์„ ํ†ตํ•ด ๋ฒกํ„ฐ์˜ ์‚ฝ์ž…,์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ 
    //์ฒดํฌ๋ฅผ ํ–ˆ๋Š”์ง€ ํ‘œ์‹œํ•ด์คŒ
    bool isChecked[31]={false};
    bool isCheckedReserve[31]={false};
    int coverNum=0;
    
    //๋จผ์ € ๊ฐ™์€ ๊ฐ’๋“ค์€ ๋ชจ๋‘ true๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋นŒ๋ ค์คŒ์œผ๋กœ์จ ๋ฉ”๊ฟ€์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ˆ˜๋ฅผ ์ฆ๊ฐ€
    for(int i=0;i<reserve.size();i++)
    {
        for(int j=0;j<lost.size();j++){
            if(reserve[i]==lost[j]){
                isChecked[j]=true;
                isCheckedReserve[i]=true;
                coverNum++;
            }
        }
    }

๊ฐ๊ฐ ์ฒดํฌ๋ฅผ ํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€ ๊ธฐ๋กํ•  ๋ฐฐ์—ด ๋‘๊ฐœ๋ฅผ ์ค€๋น„ํ•œ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋ฒŒ์„ ์ด๋ฏธ ๋นŒ๋ ค์ฃผ๊ณ , ๋Œ€์—ฌ ๋ฐ›์€ ์‚ฌ๋žŒ์˜ ๊ฒฝ์šฐ ์ฒดํฌํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งจ ์ฒ˜์Œ ์—ฌ๋ฒŒ์„ ์ค€๋น„ํ•œ ํ•™์ƒ์ด ์žƒ์–ด๋ฒ„๋ ธ์„ ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•ด์ค€๋‹ค. (reserve[i]==lost[j]) ์ด ๊ฒฝ์šฐ

    //๊ทธ ํ›„ ๋‚จ์€ ๊ฒƒ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์•ž๋’ค์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฉ”๊ฟ€์ˆ˜ ์žˆ๋Š” ํ•™์ƒ ์ˆ˜ ๊ณ„์‚ฐ
    for(int i=0;i<reserve.size();i++){
        if(coverNum==lost.size())break;
        for(int j=0;j<lost.size();j++){
            if(isChecked[j]||isCheckedReserve[i]) continue;
            else if(lost[j]-1==reserve[i]||lost[j]+1==reserve[i])
            {
                coverNum++;
                isChecked[j]=true;
                isCheckedReserve[i]=true;
            }
        }
    }
    
    //์ •๋‹ต = ์ดํ•™์ƒ์ˆ˜ - ์žƒ์–ด๋ฒ„๋ฆฐ ์ฒด์œก๋ณต ์ˆ˜ + ๋ฉ”๊พผ ํ•™์ƒ ์ˆ˜
    answer = n-lost.size()+coverNum;
    
    return answer;
}

๊ทธ ํ›„ ์ฒดํฌํ•˜์ง€ ์•Š์€ ๊ฐ’๋“ค์„ ๋‹ค์‹œ ์ฒดํฌํ•ด์ค€๋‹ค. ์ด ๊ฒฝ์šฐ ์—ฌ๋ฒŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•™์ƒ์˜ id๋ฒˆํ˜ธ ์•ž๋’ค์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ฒดํฌํ•ด์ฃผ๋ฉด์„œ ๋งŒ์•ฝ ์—ฌ๋ฒŒ์„ ๋นŒ๋ ค์ฃผ๋ฉด coverNum์˜ ๊ฐ’์„ ๋†’์—ฌ์ค€๋‹ค. ์ด๋•Œ coverNum์€ ๋ง๊ทธ๋Œ€๋กœ ์–ผ๋งŒํผ ์žƒ์–ด๋ฒ„๋ฆฐ ํ•™์ƒ๋“ค์˜ ๊ณต๋ฐฑ์„ ๋ฉ”๊ฟ€์ˆ˜ ์žˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ •๋‹ต์€ ์ดํ•™์ƒ์ˆ˜์— ์žƒ์–ด๋ฒ„๋ฆฐ ์ฒด์œก๋ณต ์ˆ˜๋ฅผ ๋นผ๊ณ  ๋ฉ”๊พผ ํ•™์ƒ ์ˆ˜๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•
728x90

 

1. ๋ฌธ์ œ

 

์‚ฌ์ „์— ์•ŒํŒŒ๋ฒณ ๋ชจ์Œ 'A', 'E', 'I', 'O', 'U'๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”, ๊ธธ์ด 5 ์ดํ•˜์˜ ๋ชจ๋“  ๋‹จ์–ด๊ฐ€ ์ˆ˜๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „์—์„œ ์ฒซ ๋ฒˆ์งธ ๋‹จ์–ด๋Š” "A"์ด๊ณ , ๊ทธ๋‹ค์Œ์€ "AA"์ด๋ฉฐ, ๋งˆ์ง€๋ง‰ ๋‹จ์–ด๋Š” "UUUUU"์ž…๋‹ˆ๋‹ค.

๋‹จ์–ด ํ•˜๋‚˜ word๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ด ๋‹จ์–ด๊ฐ€ ์‚ฌ์ „์—์„œ ๋ช‡ ๋ฒˆ์งธ ๋‹จ์–ด์ธ์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

2. ์ฝ”๋“œ

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<string> nums;
string aeiou[5]={"A","E","I","O","U"};

void repeatPermutation(string s, int maxLength)
{
    if(maxLength==s.size()) //๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ == ์ฑ„์šธ ๋ฌธ์ž์—ด ํฌ๊ธฐ
    {
        nums.push_back(s);
        return; //์žฌ๊ท€ํ•จ์ˆ˜ ์ข…๋ฃŒ
    }
    
    for(int i=0;i<5;i++){
        repeatPermutation(s+aeiou[i],maxLength); //์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ
    }
}

int solution(string word) {
    int answer = 0;
    
    for(int i=1;i<=5;i++){
        repeatPermutation("",i);
    }
    
    sort(nums.begin(), nums.end());  

    for(int i=0;i<nums.size();i++){
        if(word==nums[i]){
            answer=i;
            break;
        }
    }
       
    return answer+1;
}

 

3. ํ•ด์„ค

vector<string> nums;
string aeiou[5]={"A","E","I","O","U"};

void repeatPermutation(string s, int maxLength)
{
    if(maxLength==s.size()) //๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ == ์ฑ„์šธ ๋ฌธ์ž์—ด ํฌ๊ธฐ
    {
        nums.push_back(s);
        return; //์žฌ๊ท€ํ•จ์ˆ˜ ์ข…๋ฃŒ
    }
    
    for(int i=0;i<5;i++){
        repeatPermutation(s+aeiou[i],maxLength); //์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ
    }
}

int solution(string word) {
    int answer = 0;
    
    for(int i=1;i<=5;i++){
        repeatPermutation("",i);
    }

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1์ž๋ฆฌ์ผ ๋•Œ, 2์ž๋ฆฌ์ผ ๋•Œ, 3์ž๋ฆฌ์ผ ๋•Œ, 4์ž๋ฆฌ์ผ ๋•Œ, 5์ž๋ฆฌ์ผ ๋•Œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ 1์ž๋ฆฌ์˜ ๊ฒฝ์šฐ

for(int i=0;i<5;i++){
        repeatPermutation(s+aeiou[i],maxLength); //์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ
}

์ด ๋ถ€๋ถ„์ด aeiou[0] ~aeiou[4] ๊นŒ์ง€์˜ ๊ฐ’์ด ํ•œ๋ฒˆ์”ฉ ํ˜ธ์ถœ ๋˜๋ฉด์„œ ๋๋‚ฉ๋‹ˆ๋‹ค.

2์ž๋ฆฌ์˜ ๊ฒฝ์šฐ ์œ„์˜ for๋ฌธ์ด aeiou[0]+aeiou[0]~aeiou[4] ์—์„œ๋ถ€ํ„ฐ aeiou[4]+aeiou[0]~aeiou[4] ๊นŒ์ง€ ๊ณ„์‚ฐํ•จ์œผ๋กœ ์ด 25๊ฐ€์ง€์˜ ๋ฌธ์ž์—ด์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ 5์ž๋ฆฌ์˜ ๊ฒฝ์šฐ๊นŒ์ง€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 

sort(nums.begin(), nums.end());  

    for(int i=0;i<nums.size();i++){
        if(word==nums[i]){
            answer=i;
            break;
        }
    }
       
    return answer+1;
}

๊ทธ ํ›„, ์‚ฌ์ „์  ๋ฐฐ์—ด๋กœ ๋‚˜์—ดํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด์— ์ €์žฅ๋œ ๋ฐฐ์—ด์€ A,E,I,O,U,AA,AE,AI,AO,AU.... ๋“ฑ์˜ ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.(ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜ (1์ž๋ฆฌ์ˆ˜...2์ž๋ฆฌ์ˆ˜...3์ž๋ฆฌ์ˆ˜.... ๋กœ ์ €์žฅ)

๊ธฐ๋ณธ์ ์œผ๋กœ sort ํ•จ์ˆ˜๋Š” string ๋ณ€์ˆ˜์—์„œ ์‚ฌ์ „์  ์ˆœ์„œ๋กœ ์ •๋ ฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ํŒ๋ณ„ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ for๋ฌธ์„ ํ†ตํ•ด ๋ฐ›์€ word ๊ฐ’๊ณผ nums[i]์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ํ•ด๋‹น ๋ฒˆํ˜ธ๋ฅผ ๋ฝ‘์•„๋ƒ…๋‹ˆ๋‹ค.

๋ฒกํ„ฐ๋Š” 0๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ์— +1์„ ํ•ด์ฃผ๋ฉด ๋ช‡๋ฒˆ์งธ ์ˆ˜์ธ์ง€๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€ป for๋ฌธ์„ ์“ฐ์ง€ ์•Š๊ณ  find() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•œ์ค„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

 

1. ๋ฌธ์ œ

์ถœ์ฒ˜:https://school.programmers.co.kr/learn/courses/30/lessons/86971

n๊ฐœ์˜ ์†ก์ „ํƒ‘์ด ์ „์„ ์„ ํ†ตํ•ด ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด ์ „์„ ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๋Š์–ด์„œ ํ˜„์žฌ์˜ ์ „๋ ฅ๋ง ๋„คํŠธ์›Œํฌ๋ฅผ 2๊ฐœ๋กœ ๋ถ„ํ• ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋‘ ์ „๋ ฅ๋ง์ด ๊ฐ–๊ฒŒ ๋˜๋Š” ์†ก์ „ํƒ‘์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ๋น„์Šทํ•˜๊ฒŒ ๋งž์ถ”๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์†ก์ „ํƒ‘์˜ ๊ฐœ์ˆ˜ n, ๊ทธ๋ฆฌ๊ณ  ์ „์„  ์ •๋ณด wires๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ „์„ ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๋Š์–ด์„œ ์†ก์ „ํƒ‘ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋น„์Šทํ•˜๋„๋ก ๋‘ ์ „๋ ฅ๋ง์œผ๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ, ๋‘ ์ „๋ ฅ๋ง์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์†ก์ „ํƒ‘ ๊ฐœ์ˆ˜์˜ ์ฐจ์ด(์ ˆ๋Œ€๊ฐ’)๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

2. ์ฝ”๋“œ

#include <string>
#include <vector>

using namespace std;

//dfs, visited ๋ฐฉ๋ฒ•

int graph[101][101];
int visited[101];

int dfs(int cur, int n)
{
    if(visited[cur]) return 0;      //ํ•œ๋ฒˆ ๋ฐฉ๋ฌธํ•œ ๊ณณ์€ ์žฌ๋ฐฉ๋ฌธ X
    int child=1;      //ํ•˜์œ„ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜
    visited[cur]=true;
    for(int i=1;i<=n;i++)
    {
        if(graph[cur][i])       //์—ฐ๊ฒฐ, ๊ฐ„์  ์—†๋Š” ๊ณณ๋งŒ
        {
            child+=dfs(i,n);
        }
    }
    return child;
}

void setGraph(int x,int y,int value)
{
    graph[x][y]=value;
    graph[y][x]=value;
}

int solution(int n, vector<vector<int>> wires) {
    int answer = 101;
    
    //์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์†ก์ „ํƒ‘ 1๋กœ ์ดˆ๊ธฐํ™”
    for(int i=0;i<wires.size();i++){
        setGraph(wires[i][0],wires[i][1],1);
    }
    
    for(int i=0;i<wires.size();i++){
        //๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
        fill_n(visited,101,false);
        
        //๋Š์„ ์ „์„  0์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ -> ์ „์„  ๋Š๊ธฐ
        setGraph(wires[i][0],wires[i][1],0);

        vector<int> diff;
        for(int i=1;i<=n;i++)
        {
            int tmp=dfs(i,n);       //๊นŠ์ด ํƒ์ƒ‰
            if(!tmp)continue;       //๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ ์ƒ๋žต
            diff.push_back(tmp);
        }
        answer = min(answer, abs(diff[0]-diff[1]));
        if(answer==0)break;
        //์›์ƒํƒœ๋กœ ๋Œ๋ ค๋†“๊ธฐ
        setGraph(wires[i][0],wires[i][1],1);
    }
    
    return answer;
}

 

3. ํ•ด์„ค

//dfs, visited ๋ฐฉ๋ฒ•

int solution(int n, vector<vector<int>> wires) {
    int answer = 101;
    
    //์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์†ก์ „ํƒ‘ 1๋กœ ์ดˆ๊ธฐํ™”
    for(int i=0;i<wires.size();i++){
        setGraph(wires[i][0],wires[i][1],1);
    }
    
    for(int i=0;i<wires.size();i++){
        //๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
        fill_n(visited,101,false);
        
        //๋Š์„ ์ „์„  0์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ -> ์ „์„  ๋Š๊ธฐ
        setGraph(wires[i][0],wires[i][1],0);

        vector<int> diff;
        for(int i=1;i<=n;i++)
        {
            int tmp=dfs(i,n);       //๊นŠ์ด ํƒ์ƒ‰
            if(!tmp)continue;       //๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ ์ƒ๋žต
            diff.push_back(tmp);
        }
        answer = min(answer, abs(diff[0]-diff[1]));
        if(answer==0)break;
        //์›์ƒํƒœ๋กœ ๋Œ๋ ค๋†“๊ธฐ
        setGraph(wires[i][0],wires[i][1],1);
    }
    
    return answer;
}

dfs๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์–ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ dp๋กœ ์ ‘๊ทผํ•˜์—ฌ์„œ ๋…ธ๋“œ์˜ ํ•˜์œ„ ๊ฐฏ์ˆ˜๋ฅผ ๋ˆ„์ ํ•˜์˜€์—ˆ๋Š”๋ฐ ํ•ด๋‹น ๊ฒฝ์šฐ๋Š” ๋…ธ๋“œ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

ํ‘ธ๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ๋จผ์ € ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์†ก์ „ํƒ‘๋“ค์„ 2์ฐจ์› ๋ฐฐ์—ด์— 1๋กœ ํ‘œ์‹œํ•ด์ค๋‹ˆ๋‹ค.

    //์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์†ก์ „ํƒ‘ 1๋กœ ์ดˆ๊ธฐํ™”
    for(int i=0;i<wires.size();i++){
        setGraph(wires[i][0],wires[i][1],1);
    }

2. 0~n๋ฒˆ์งธ ์†ก์ „ํƒ‘์„ ๊ฐ๊ฐ ๋Š๋Š” for ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ n๋ฒˆ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.

    for(int i=0;i<wires.size();i++){

3. ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ณ , 2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋Š์„ ์†ก์ „ํƒ‘์„ 0์œผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

        //๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
        fill_n(visited,101,false);
        
        //๋Š์„ ์ „์„  0์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ -> ์ „์„  ๋Š๊ธฐ
        setGraph(wires[i][0],wires[i][1],0);

4. dfs ํƒ์ƒ‰์„ ํ†ตํ•ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ณ  ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€์ง€ ์•Š์€ ๊ณณ๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•˜์—ฌ ํ•˜์œ„ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ ๊ฐ’๋“ค์˜ ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

        vector<int> diff;
        for(int i=1;i<=n;i++)
        {
            int tmp=dfs(i,n);       //๊นŠ์ด ํƒ์ƒ‰
            if(!tmp)continue;       //๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ ์ƒ๋žต
            diff.push_back(tmp);
        }
        answer = min(answer, abs(diff[0]-diff[1]));
        if(answer==0)break;
        //์›์ƒํƒœ๋กœ ๋Œ๋ ค๋†“๊ธฐ
        setGraph(wires[i][0],wires[i][1],1);

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

 

1. ๋ฌธ์ œ

์ถœ์ฒ˜ : https://school.programmers.co.kr/learn/courses/30/lessons/87946

์œ ์ €์˜ ํ˜„์žฌ ํ”ผ๋กœ๋„ k์™€ ๊ฐ ๋˜์ „๋ณ„ "์ตœ์†Œ ํ•„์š” ํ”ผ๋กœ๋„", "์†Œ๋ชจ ํ”ผ๋กœ๋„"๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด dungeons ๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์œ ์ €๊ฐ€ ํƒํ—˜ํ• ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋˜์ „ ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

2. ์ฝ”๋“œ

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//์ˆ˜์—ด next_permutation์„ ํ™œ์šฉํ•˜์—ฌ์„œ ํ’€์ด
//๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๊ณ„์‚ฐํ•œ ๋‹ค์Œ ์ฐจ๋ก€๋กœ ๊ฒ€์ฆํ•จ
int solution(int k, vector<vector<int>> dungeons) {
    int answer = 0;
    
    vector<int> v;
    // 0๋ถ€ํ„ฐ ๋˜์ „ ์‚ฌ์ด์ฆˆ๊นŒ์ง€ ๋ฒกํ„ฐ์— ์ €์žฅ
	for(int i=0; i<dungeons.size(); i++){
		v.push_back(i);
	}
    
    do{
        int pirodo=k;
        int count=0;
		for(int i=0; i<v.size(); i++){
            if(pirodo>=dungeons[v[i]][0]){
                //ํ”ผ๋กœ๋„ ์ฐจ๊ฐ ๋ฐ ๋˜์ „ ๊ฐฏ์ˆ˜ ์˜ฌ๋ฆฌ๊ธฐ
                count++;
                pirodo-=dungeons[v[i]][1];
            }
		}
        answer=max(answer,count);
	}while(next_permutation(v.begin(),v.end()));
    
    return answer;
}

 

3. ํ•ด์„ค

//์ˆ˜์—ด next_permutation์„ ํ™œ์šฉํ•˜์—ฌ์„œ ํ’€์ด
//๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๊ณ„์‚ฐํ•œ ๋‹ค์Œ ์ฐจ๋ก€๋กœ ๊ฒ€์ฆํ•จ
int solution(int k, vector<vector<int>> dungeons) {
    int answer = 0;
    
    vector<int> v;
    // 0๋ถ€ํ„ฐ ๋˜์ „ ์‚ฌ์ด์ฆˆ๊นŒ์ง€ ๋ฒกํ„ฐ์— ์ €์žฅ
	for(int i=0; i<dungeons.size(); i++){
		v.push_back(i);
	}

 

๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š๊ธฐ์— ์™„์ „ ํƒ์ƒ‰์„ ํ†ตํ•ด ํ’€์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ •ํ•ด์ง„ ๋ฐฐ์—ด์—์„œ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ๋Š” ์ˆ˜์—ด์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๋จผ์ € 0~ ๋˜์ „์˜ ๊ฐฏ์ˆ˜ ๊นŒ์ง€์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๋งŒ์•ฝ ๋˜์ „์˜ ๊ฐฏ์ˆ˜๊ฐ€ 3์ด๋ผ๋ฉด [0,1,2] ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

  do{
	int pirodo=k;
	int count=0;
	for(int i=0; i<v.size(); i++){
        	if(pirodo>=dungeons[v[i]][0]){
                //ํ”ผ๋กœ๋„ ์ฐจ๊ฐ ๋ฐ ๋˜์ „ ๊ฐฏ์ˆ˜ ์˜ฌ๋ฆฌ๊ธฐ
                count++;
                pirodo-=dungeons[v[i]][1];
            }
	}
    	answer=max(answer,count);
}while(next_permutation(v.begin(),v.end()));

๋งŒ๋“ค์–ด์ง„ ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  next_permutation() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜์—ด์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

do while๋ฌธ์„ ํ†ตํ•ด ์ˆ˜์—ด์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ํ”ผ๋กœ๋„์™€ ๋˜์ „์ด ํ•„์š”ํ•œ ์ตœ์†Œ ํ”ผ๋กœ๋„๋ฅผ ๋„˜๊ธด๋‹ค๋ฉด ๋˜์ „์„ ํด๋ฆฌ์–ดํ•˜๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค.

๋งŒ์•ฝ ์ตœ์†Œ ํ”ผ๋กœ๋„๋ฅผ ๋„˜๊ธฐ์ง€ ๋ชปํ•˜๋ฉด ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.

๊ณ„์‚ฐ์ด ๋๋‚œ ํ›„ ๋งŒ์•ฝ Count๊ฐ€ ๊ธฐ์กด์˜ answer๋ณด๋‹ค ํด ๊ฒฝ์šฐ answer์— count ๊ฐ’์„ ์‚ฝ์ž…ํ•œ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•
728x90

1. ๋ฌธ์ œ

์›๋ณธ ๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

Leo๊ฐ€ ๋ณธ ์นดํŽซ์—์„œ ๊ฐˆ์ƒ‰ ๊ฒฉ์ž์˜ ์ˆ˜ brown, ๋…ธ๋ž€์ƒ‰ ๊ฒฉ์ž์˜ ์ˆ˜ yellow๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ ์นดํŽซ์˜ ๊ฐ€๋กœ, ์„ธ๋กœ ํฌ๊ธฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

๊ฐˆ์ƒ‰ ๊ฒฉ์ž์˜ ์ˆ˜ brown์€ 8 ์ด์ƒ 5,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
๋…ธ๋ž€์ƒ‰ ๊ฒฉ์ž์˜ ์ˆ˜ yellow๋Š” 1 ์ด์ƒ 2,000,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
์นดํŽซ์˜ ๊ฐ€๋กœ ๊ธธ์ด๋Š” ์„ธ๋กœ ๊ธธ์ด์™€ ๊ฐ™๊ฑฐ๋‚˜, ์„ธ๋กœ ๊ธธ์ด๋ณด๋‹ค ๊น๋‹ˆ๋‹ค.

 

2. ์ฝ”๋“œ

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    
    //์™„์ „ ํƒ์ƒ‰
    int sum = brown+yellow;
    for(int i=2;i<sum;i++){
        if(sum%i!=0) continue;
        else
        {
            if((i-2)*(sum/i-2)==yellow)
            {
                answer.push_back(sum/i);
                answer.push_back(i);
                break;
            }
            else continue;
        }
    }
    
    return answer;
}

 

3. ํ•ด์„ค

//์™„์ „ ํƒ์ƒ‰
    int sum = brown+yellow;
    for(int i=2;i<sum;i++){
        if(sum%i!=0) continue;

๋จผ์ € brown+yellow๋ฅผ ๋”ํ•˜๋ฉด ๋ชจ๋“  ํƒ€์ผ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ผ์˜ ๊ฐฏ์ˆ˜๋Š” ๊ฐ€๋กœx์„ธ๋กœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๊ตฌํ•ด์ค๋‹ˆ๋‹ค.

ํƒ€์ผ์˜ ์„ธ๋กœ ๊ธธ์ด๋Š” 1๋ณด๋‹ค ์ปค์•ผํ•˜๊ธฐ์—(0์ด๋‚˜ 1์ธ ๊ฒฝ์šฐ ๋…ธ๋ž€์ƒ‰ ๊ตฌ์—ญ์ด ์ƒ๊ธธ ์ˆ˜ ์—†์Œ) i=2๋ถ€ํ„ฐ for๋ฌธ์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.

if(sum%i!=0) : ๋งŒ์•ฝ ๋‚˜๋ˆ„์–ด ์งˆ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ๊ฐ€๋กœ ์„ธ๋กœ๋ฅผ ๊ตฌํ• ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

        else
        {
            if((i-2)*(sum/i-2)==yellow)
            {
                answer.push_back(sum/i);
                answer.push_back(i);
                break;
            }
            else continue;
        }
    }

๋‚˜๋ˆ„์–ด์ง€๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ํ•ด๋‹น ๊ฐ€๋กœ ์„ธ๋กœ์˜ ๊ธธ์ด์—์„œ 2์”ฉ ๋นผ์„œ yellow ์˜์—ญ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ yellow ๊ฐฏ์ˆ˜๊ฐ€ ๋งž๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’๋“ค์„ answer์— ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•
728x90

1. ๋ฌธ์ œ

 

ํ•œ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค.

ํฉ์–ด์ง„ ์ข…์ด ์กฐ๊ฐ์„ ๋ถ™์—ฌ ์†Œ์ˆ˜๋ฅผ ๋ช‡ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ์ข…์ด ์กฐ๊ฐ์— ์ ํžŒ ์ˆซ์ž๊ฐ€ ์ ํžŒ ๋ฌธ์ž์—ด numbers๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ข…์ด ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

2. ์ฝ”๋“œ

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

int solution(string numbers) {
    int answer=0;
    
    //next_permutation์„ ์‚ฌ์šฉ
    //์ˆœ์—ด ๊ณ„์‚ฐ์—์„œ 1์ž๋ฆฌ,2์ž๋ฆฌ ~ n์ž๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
    sort(numbers.begin(),numbers.end());
    vector<unsigned int> nums;
    string sub;
    do {
        for (int i = 1; i <=  numbers.size(); i++)
        {
            sub = numbers.substr(0, i);
            nums.push_back(stoi(sub));
        }
    } while (next_permutation(numbers.begin(), numbers.end()));
    
    //์ค‘๋ณต๋œ ์ˆซ์ž ์ œ๊ฑฐํ•˜๊ธฐ
    sort(nums.begin(), nums.end());
    nums.erase(unique(nums.begin(),nums.end()), nums.end());
    
    //์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์ฒด ๊ตฌํ•˜๊ธฐ
    unsigned int nn=9999999;
    vector<bool> isPrimeNum(nn+1);
    isPrimeNum[1] = true; // 1์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ true
    for(unsigned int i = 2; i <= sqrt(nn); i++){
        if(isPrimeNum[i]) continue; // ์ด๋ฏธ true๋ฉด ๊ณ„์‚ฐ ์ œ์™ธ
        for(unsigned int j = i + i; j <= nn; j += i) // i๋ฅผ ์ œ์™ธํ•œ i์˜ ๋ฐฐ์ˆ˜๋“ค์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
            isPrimeNum[j] = true;
    }

    for(int i=0;i<nums.size();i++){
	    if(!isPrimeNum[nums[i]]&nums[i]>0)      //0์ธ ๊ฒฝ์šฐ ์ œ์™ธ
            answer++;
    }
    
    return answer;
}

 

3. ํ•ด์„ค

    //next_permutation์„ ์‚ฌ์šฉ
    //์ˆœ์—ด ๊ณ„์‚ฐ์—์„œ 1์ž๋ฆฌ,2์ž๋ฆฌ ~ n์ž๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
    sort(numbers.begin(),numbers.end());
    vector<unsigned int> nums;
    string sub;
    do {
        for (int i = 1; i <=  numbers.size(); i++)
        {
            sub = numbers.substr(0, i);
            nums.push_back(stoi(sub));
        }
    } while (next_permutation(numbers.begin(), numbers.end()));

๋จผ์ € ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ string์„ ์ •๋ ฌํ•ด์ฃผ๊ณ , next_permutation ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 1~n์ž๋ฆฌ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

    //์ค‘๋ณต๋œ ์ˆซ์ž ์ œ๊ฑฐํ•˜๊ธฐ
    sort(nums.begin(), nums.end());
    nums.erase(unique(nums.begin(),nums.end()), nums.end());

๊ทธ ํ›„, ์ค‘๋ณต ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ค‘๋ณต๋œ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•ด์ค๋‹ˆ๋‹ค.

    //์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์ฒด ๊ตฌํ•˜๊ธฐ
    unsigned int nn=9999999;
    vector<bool> isPrimeNum(nn+1);
    isPrimeNum[1] = true; // 1์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ true
    for(unsigned int i = 2; i <= sqrt(nn); i++){
        if(isPrimeNum[i]) continue; // ์ด๋ฏธ true๋ฉด ๊ณ„์‚ฐ ์ œ์™ธ
        for(unsigned int j = i + i; j <= nn; j += i) // i๋ฅผ ์ œ์™ธํ•œ i์˜ ๋ฐฐ์ˆ˜๋“ค์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
            isPrimeNum[j] = true;
    }

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์ฒด์˜ ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ๋ฒ”์œ„ ๋‚ด์—์„œ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’๋“ค์„ true๋กœ ํ‘œ์‹œํ•ด์ค๋‹ˆ๋‹ค.

    for(int i=0;i<nums.size();i++){
	    if(!isPrimeNum[nums[i]]&nums[i]>0)      //0์ธ ๊ฒฝ์šฐ ์ œ์™ธ
            answer++;
    }

์†Œ์ˆ˜ ํŒ๋ณ„ vector isPrimeNum์„ ๊ฐ€์ง€๊ณ  ๊ฒฝ์šฐ์˜ ์ˆ˜๋“ค์˜ ๋ฆฌ์ŠคํŠธ nums์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋งŒ์•ฝ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ(false) answer์„ ํ•œ๊ฐœ ๋Š˜๋ ค์ค๋‹ˆ๋‹ค.

๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ 0์ธ๊ฒฝ์šฐ๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋–„๋ฌธ์— ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•
728x90

ํ๋ฅผ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ค„์„ ์„œ์„œ ํ•˜๋Š” ์‹ธ์ธํšŒ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์œ ๋ช… ๊ฐ€์ˆ˜์˜ ์‹ธ์ธํšŒ๊ฐ€ ์—ด๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž
๋‚˜๋Š” ๊ฐ€์ˆ˜์˜ ์‹ธ์ธํšŒ์— ๋‹น์ฒจ์ด ๋˜์—ˆ๊ณ  ํ˜„์žฅ์—์„œ 3๋ฒˆ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌ๋ฐ›์•˜๋‹ค.
๋‹ค๋ฅธ ํŒฌ๋“ค์€ 1~20๋ฒˆ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌ๋ฐ›์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์˜€์„ ๋•Œ, ์ง„ํ–‰์ž๊ฐ€ 1๋ฒˆ๋ถ€ํ„ฐ ์‹ธ์ธ์„ ๋ฐ›์œผ๋Ÿฌ ์˜ค๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  2~20๋ฒˆ์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฐจ๋ก€๋กœ ์ค„์„ ์„œ๋ผ๊ณ  ํ•  ๊ฒƒ์ด๊ณ  ๊ทธ ๋‹ค์Œ ์ฐจ๋ก€๋Š” 2๋ฒˆ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์‹ธ์ธ์„ ๋ฐ›์œผ๋Ÿฌ ์ค„์„ ์ดํƒˆํ•  ๊ฒƒ์ด๋‹ค.
์ด๊ฒŒ ๋ฐ”๋กœ ํ์˜ ๊ฐœ๋…์ด๋‹ค! FIFO(First In First Out) ์„ ์ž…์„ ์ถœ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๋จผ์ € ๋น ์ ธ๋‚˜์˜จ๋‹ค. ์ฆ‰ 2๋ฒˆ์ด ๋งจ ์•ž์— ์žˆ๋Š”๋ฐ 3๋ฒˆ์ด ๋จผ์ € ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 




ํ๊ฐ€ ์“ฐ์ด๋Š” ๊ตฌ์กฐ๋Š” ์–ด๋””์— ์žˆ์„ ๊นŒ? ๋ฏธ๋ฃจ์–ด ์ง์ž‘ํ•ด๋ณด๊ฑด๋ฐ
๋ช…์ ˆ๋‚  ๋‚ด๋ ค๊ฐ€๋Š” KTX ์˜ˆ๋งค๋ฅผ ํ•  ๋•Œ, ๋‚ด ์•ž์˜ ๋Œ€๊ธฐ์ž 00๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋ณธ ์  ์žˆ๋Š”๊ฐ€?
์•„๋งˆ๋„ ๊ทธ๋Ÿฌํ•œ ๊ณณ์— ์“ฐ์ผ ๊ฒƒ ๊ฐ™๋‹ค.
๋ฌผ๋ก  ์ด๊ฒƒ ๋ง๊ณ ๋„ ๋งŽ์€ ๊ณณ์— ์“ฐ์ด๊ฒ ์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ€์‹œ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋Š๋‚Œ์ด ์•„๋‹๊นŒ ์‹ถ๋‹ค.

๋ฐ˜์‘ํ˜•

'์•Œ๊ณ ๋ฆฌ์ฆ˜ > ์ž๋ฃŒ๊ตฌ์กฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

2. ์Šคํƒ  (0) 2023.09.07
1. ๋ฆฌ์ŠคํŠธ  (0) 2023.09.05
728x90

์Šคํƒ์€ ๊ต‰์žฅํžˆ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ฐœ๋…์ด๋‹ค.
’๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋‚˜์˜ค๋Š”(FILO, First In Last Out) ๊ตฌ์กฐ‘ ์ด๋‹ค.
๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๋‘˜๋‹ค ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ๋ฐ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด
ํƒ์ƒ‰์€ ๋น ๋ฅธ ๋ฐฐ์—ด, ์šฉ๋Ÿ‰์˜ ์ œํ•œ์ด ์ž์œ ๋กœ์šด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์ด๊ธฐ์— ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์“ฐ์ผ ๋“ฏํ•˜๋‹ค.

์Šคํƒ์€ ๋ง๊ทธ๋Œ€๋กœ ์Œ“๋‹ค ์ธ๋ฐ, ๊ฐ€์žฅ ์™€๋‹ฟ๋Š” ๊ฒƒ์€ ํ”„๋ง๊ธ€์Šค ํ†ต์ด ์•„๋‹๊นŒ ์‹ถ๋‹ค..!
๋ฌผ๋ก  ํ”„๋ง๊ธ€์Šค๋ฅผ ๋’ค์ง‘์œผ๋ฉด ์šฐ๋ฅด๋ฅด ์Ÿ์•„์ ธ๋‚˜์˜จ๋‹ค๋งŒ์€.. ํ”„๋ง๊ธ€์Šค๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ ๊บผ๋‚ด์„œ ์ œ์ผ ๋ฐ‘์—๊นŒ์ง€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ณผ์ž์ด๋‹ค.
๋ฐ˜๋Œ€๋กœ ํ”„๋ง๊ธ€์Šค ํ†ต์— ๊ณผ์ž๋ฅผ ๋‹ค์‹œ ๋„ฃ๋Š”๋‹ค๋ฉด ๋งจ ๋งˆ์ง€๋ง‰์— ๋„ฃ์€ ๊ณผ์ž๋ถ€ํ„ฐ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์Šคํƒ PUSH(์™ผ) ์Šคํƒ POP(์˜ค)


์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ์„œ ์–ด๋–ค ๊ฒƒ์„ ๋งŒ๋“ค๋ฉด ์œ ์šฉํ• ๊นŒ ํ•˜๊ณ  ์ƒ๊ฐํ•˜์—ฌ๋ณด์•˜๋Š”๋ฐ
์•„๋ฌด๋ž˜๋„ Undo, Redo ์•„๋‹๊นŒ ์‹ถ๋‹ค.
ํ•œ๊ธ€(.hwp)์—์„œ๋„ ์ž˜ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹จ์ถ•ํ‚ค Ctrl+Z ๋ฅผ ํ†ตํ•ด ์ด์ „์˜ ์ž‘์—…์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ธฐ๋Šฅ ๋ง์ด๋‹ค.
์ด์ „์˜ ์ž‘์—…๋“ค์„ ํ•œ๊ฐœํ•œ๊ฐœ์”ฉ ์Œ“์•„๋†“๊ณ , ๋งŒ์•ฝ ๋˜๋Œ์•„๊ฐ€๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ํ•œํ์— ์ž‘์—…ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•˜๋ฉด ์ด์ „์˜ ์ž‘์—…์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ–‰๋™ ์ทจ์†Œํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•

'์•Œ๊ณ ๋ฆฌ์ฆ˜ > ์ž๋ฃŒ๊ตฌ์กฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

3. ํ  (0) 2023.09.12
1. ๋ฆฌ์ŠคํŠธ  (0) 2023.09.05
728x90

ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋‹ค๋ณด๋ฉด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ๋งŽ์•„์ง„๋‹ค.

๋ฐฐ์—ด์€ ํฌ๊ธฐ๊ฐ€ ํ•œ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„์ด ๋ชจ์ž๋ผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”๋ฐ, C++์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ STL์˜ vector๋ฅผ ๋ณดํ†ต ๋– ์˜ฌ๋ฆฐ๋‹ค. ๋‚˜์˜ ๊ฒฝ์šฐ๋„ ๊ทธ๋žฌ๊ณ 

ํ•˜์ง€๋งŒ STL์˜ vector ๊ฒฝ์šฐ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ์ž์œ ์ž์žฌ๋กœ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ฐฐ์—ด ํ˜•ํƒœ์—์„œ ๋ฐฐ์—ด์ด ๊ฐ€๋“ ์ฐฐ ๋•Œ๋งˆ๋‹ค ํฌ๊ธฐ๋ฅผ 1.5๋ฐฐ ~ 2๋ฐฐ (์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„) ๋Š˜๋ฆฐ ํ›„ ๋‹ค์‹œ ์˜ฎ๊ฒจ๋‹ด๋Š” ํ˜•์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ž‘์€ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค.

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” C์—์„œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ํ•œ์ •๋˜์–ด ์žˆ๋Š” ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ ์ž ๋งŒ๋“  ๊ฐœ๋…์ด๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žฅ๋‹จ์ ์ด ์žˆ๊ธฐ์— ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

๐Ÿ”น01. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

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

'๋ฆฌ์ŠคํŠธ' ๋‚ด์˜ ๊ฐ ์š”์†Œ๋Š” '๋…ธ๋“œ(Node)' ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

'๋งํฌ๋“œ'๋Š” '์—ฐ๊ฒฐ๋œ' ์ด๋ผ๋Š” ๋œป์ด๋‹ค. ์ฆ‰ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ์ด๋‹ค.

 

๊ตฌ์กฐ

๋…ธ๋“œ์˜ ๊ตฌ์กฐ

๋…ธ๋“œ๋Š” ๋ฐ์ดํ„ฐ์™€ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง„ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ๋Š” ๋’ค์—์˜ฌ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ด์œผ๋กœ์จ ํ•ด๋‹น ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ

์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ํ—ค๋“œ, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ํ…Œ์ผ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋งˆ์น˜ KTX ๊ธฐ์ฐจ๋ฅผ ์ด์–ด๋ถ™์ด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋’ค๋ฅผ ์ด์–ด์„œ ๋ถ™์ธ๋‹ค.

๊ธฐ์ฐจ ์‚ฌ์ด์˜ ์ด์Œ์ƒˆ ์—ญํ™œ์„ ํ•˜๋Š” ๊ณ ๋ฆฌ๊ฐ€ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๊ฐ€ ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

 

struct Node
{
    Data data;		//๋ฐ์ดํ„ฐ
    struct Node* NextNode;	//๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
}

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฝ”๋“œ๋ธ”๋ก์ด ์ข…๋ฃŒ๋จ์— ๋”ฐ๋ผ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋„๋ก malloc() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ• ๋‹น์„ ํ•ด์ค€๋‹ค.

์ด๋Ÿฌํ•œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ํƒ์ƒ‰ ์—ฐ์‚ฐ์—์„œ ์•ฝ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์•ž์—์„œ๋ถ€ํ„ฐ ์ญˆ์šฑ ์—ฐ๊ฒฐ๋œ ๊ตฌ์กฐ์ด๋‹ค ๋ณด๋‹ˆ HEAD๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•ด์„œ ๋งŒ์•ฝ 10๊ฐœ์˜ ๋…ธ๋“œ ์ค‘ 10๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•œ๋‹ค๋ฉด 1๋ฒˆ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ด์„œ 10๋ฒˆ๊นŒ์ง€ ๋‹ค๋‹ฌ์•„์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ n๊ฐœ์˜ ๋…ธ๋“œ ์ค‘ n๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•œ๋‹ค๋ฉด n๋ฒˆ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ด์•ผํ•˜๊ธฐ์— ๋น„์šฉ์ด ํฌ๊ณ  ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

 

โ—๋ฐฐ์—ด์— ๋น„ํ•ด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์žฅ๋‹จ์  ์ •๋ฆฌโ—

๐Ÿ”ธ๋‹จ์ ๐Ÿ”ธ

  1. ํฌ์ธํ„ฐ ๋•Œ๋ฌธ์— ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค 4 byte์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•จ

  2. ์ตœ์•ฝ์˜ ๊ฒฝ์šฐ nํšŒ์˜ ๋…ธ๋“œ ํƒ์ƒ‰ ๋ฃจํ”„ -> ๋น„์šฉ์ด ํฌ๊ณ  ์†๋„๊ฐ€ ๋Š๋ฆผ

๐Ÿ”ธ์žฅ์ ๐Ÿ”ธ

  1. ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ถ”๊ฐ€,์‚ฝ์ž…,์‚ญ์ œ๊ฐ€ ์‰ฝ๊ณ  ๋น ๋ฆ„

 

๋”ฐ๋ผ์„œ, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ์ถ”๊ฐ€,์‚ฝ์ž…,์‚ญ์ œ๊ฐ€ ์žฆ๊ณ  ์กฐํšŒ๋Š” ๋“œ๋ฌธ ๊ณณ์— ์œ ์šฉํ•˜๋‹ค.

 

๐Ÿ”น02. ๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํƒ์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์ด์ „ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋” Node ์•ˆ์— ๋งŒ๋“ค์–ด์„œ ์–‘๋ฐฉํ–ฅ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

๐Ÿ”น03. ํ™˜ํ˜• ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

ํ™˜ํ˜• ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ํ—ค๋“œ์™€ ํ…Œ์ผ์„ ์—ฐ๊ฒฐํ•œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ผ์— ์ ‘๊ทผํ•˜๋Š” ๋น„์šฉ์ด ์ž‘์•„์ ธ์„œ, ๋’ค์—์„œ๋ถ€ํ„ฐ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๋‚˜๊ฐ€๋Š” ํƒ์ƒ‰์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด 10๊ฐœ์˜ ๋…ธ๋“œ ์ค‘ 8๋ฒˆ์งธ๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค๋ฉด HEAD์—์„œ TAIL๋กœ 2๋ฒˆ ํƒ์ƒ‰ํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ”…์•Œ์•„๋‘๋ฉด ์ข‹์€ TIP๐Ÿ”…

์œ ์—ฐํ•˜๊ฒŒ ํฌ๊ธฐ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ  '๋ฆฌ์ŠคํŠธ(list)'๋ผ๊ณ  ํ•˜๋Š”๋ฐ,

C++ STL vector๋„ ๋ฆฌ์ŠคํŠธ์˜ ์ผ์ข…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

์—ฌ๊ธฐ์„œ C++ STL vector ๋Š” ๋™์  ๋ฐฐ์—ด์˜ ํ˜•ํƒœ์ด๊ณ ,

C++ STL list๋Š” ๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•

'์•Œ๊ณ ๋ฆฌ์ฆ˜ > ์ž๋ฃŒ๊ตฌ์กฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

3. ํ  (0) 2023.09.12
2. ์Šคํƒ  (0) 2023.09.07
728x90

NavMeshAgent Documentation ์›๊ธ€ : https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent.html

 

์˜์–ด ๊ทธ๋Œ€๋กœ ์ง๋…์งํ•ดํ•˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ.. ์ต์ˆ™ํ•ด์ง€๊ธฐ ์ „์—๋Š” ์˜ฎ๊ฒจ๋‹ด์œผ๋ฉด์„œ ํŒŒ์•…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค..

 

Properties

acceleration ๊ฐ€์†๋„ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๋Š” ์—์ด์ „ํŠธ์˜ ์ตœ๋Œ€ ๊ฐ€์†๋„(๋‹จ์œ„/sec^2).
agentTypeID Type ID ์—์ด์ „ํŠธ์˜ Type ID
angularSpeed ํšŒ์ „์†๋„ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๋Š” ๋™์•ˆ ์ตœ๋Œ€ ํšŒ์ „์†๋„(deg/s)
areaMask ์˜์—ญ ๋งˆ์Šคํฌ ํ†ต๊ณผ ๊ฐ€๋Šฅํ•œ NavMesh ์˜์—ญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜์—ญ ๋งˆ์Šคํฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ฒฝ๋กœ๊ฐ€ ์ •์ฒด๋ฉ๋‹ˆ๋‹ค.(isPathStale ์ฐธ์กฐ)
autoBraking ์ž๋™ ๋ธŒ๋ ˆ์ดํฌ ์—์ด์ „ํŠธ๊ฐ€ ๋ชฉ์ ์ง€ ์ง€์ ์„ ์˜ค๋ฒ„์ŠˆํŒ…ํ•˜์ง€ ์•Š๋„๋ก ์ž๋™์œผ๋กœ ๋ธŒ๋ ˆ์ดํฌ๋ฅผ ๋ฐŸ์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?
autoRepath ์ž๋™ ๊ฒฝ๋กœ์žฌํƒ์ƒ‰ ๊ธฐ์กด ๊ฒฝ๋กœ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—์ด์ „ํŠธ๊ฐ€ ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ํš๋“ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
autoTraverseOffMeshLink ์ž๋™ OffMeshLinks ์ด๋™ ์—์ด์ „ํŠธ๊ฐ€ OffMeshLinks ๊ฐ„์— ์ž๋™์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
avoidancePriority ํšŒํ”ผ ์šฐ์„  ์ˆœ์œ„ ํšŒํ”ผ ์šฐ์„  ์ˆœ์œ„ ์ˆ˜์ค€
baseoffset   ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” GameObject์˜ ์ƒ๋Œ€์ ์ธ ์ˆ˜์ง ๋ณ€์œ„
currentOffMeshLinkData   ํ˜„์žฌ OffMeshLink ๋ฐ์ดํ„ฐ
desiredVelocity ์›ํ•˜๋Š” ์†๋„ ํšŒํ”ผ๋กœ ์ธํ•œ ์ž ์žฌ์  ๊ธฐ์—ฌ๋ฅผ ํฌํ•จํ•œ ์—์ด์ „ํŠธ์˜ ์›ํ•˜๋Š” ์†๋„(์ฝ๊ธฐ ์ „์šฉ)
destination ๋ชฉ์ ์ง€ ์„ธ๊ณ„ ๊ณต๊ฐ„ ๋‹จ์œ„๋กœ ์—์ด์ „ํŠธ์˜ ๋Œ€์ƒ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
hasPath ๊ฒฝ๋กœ ์œ ๋ฌด ์—์ด์ „ํŠธ์— ํ˜„์žฌ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?(์ฝ๊ธฐ ์ „์šฉ)
height ์—์ด์ „ํŠธ ๋†’์ด ์žฅ์• ๋ฌผ์„ ํ†ต๊ณผํ•  ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ์—์ด์ „ํŠธ์˜ ๋†’์ด ๋“ฑ.
isOnNavMesh ๋ฐ”์ธ๋”ฉ ์œ ๋ฌด ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ navmesh์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?(์ฝ๊ธฐ ์ „์šฉ)
isOnOffMeshLink ์œ„์น˜ ์œ ๋ฌด ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ OffMeshLink์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?(์ฝ๊ธฐ ์ „์šฉ)
isPathState   ํ˜„์žฌ ๊ฒฝ๋กœ๊ฐ€ ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.(์ฝ๊ธฐ ์ „์šฉ)
isStopped ๋ฉˆ์ถค ์œ ๋ฌด ์ด ์†์„ฑ์€ NavMesh ์—์ด์ „ํŠธ์˜ ์ค‘์ง€ ๋˜๋Š” ์ œ๊ฐœ ์กฐ๊ฑด์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
navMeshOwner   ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ ์œ„์น˜ํ•œ NavMesh์˜ ์†Œ์œ  ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์ฝ๊ธฐ ์ „์šฉ).
nextOffMeshLinkData   ํ˜„์žฌ ๊ฒฝ๋กœ์˜ ๋‹ค์Œ OffMeshLink ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
nextPosition ๋‹ค์Œ ์œ„์น˜ navmesh ์—์ด์ „ํŠธ์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
obstacleAvoidanceType ์žฅ์• ๋ฌผ ํšŒํ”ผ ์œ ํ˜• ํšŒํ”ผ ํ’ˆ์งˆ ์ˆ˜์ค€
path ๊ฒฝ๋กœ ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์„ค์ •ํ•  ์†์„ฑ์ž…๋‹ˆ๋‹ค.
pathPending ๊ฒฝ๋กœ ๋ณด๋ฅ˜ ์ค‘ ๊ณ„์‚ฐ ์ค‘์ด์ง€๋งŒ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์€ ๊ฒฝ๋กœ์ž…๋‹ˆ๊นŒ?(์ฝ๊ธฐ ์ „์šฉ)
pathStatus ๊ฒฝ๋กœ ์ƒํƒœ ํ˜„์žฌ ๊ฒฝ๋กœ์˜ ์ƒํƒœ(์ „์ฒด, ๋ถ€๋ถ„ ๋˜๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Œ)์ž…๋‹ˆ๋‹ค.
radius ์—์ด์ „ํŠธ ํšŒํ”ผ ๋ฐ˜๊ฒฝ ์—์ด์ „ํŠธ์˜ ํšŒํ”ผ ๋ฐ˜๊ฒฝ์ž…๋‹ˆ๋‹ค.
remainingDistance ๋‚จ์€ ๊ฑฐ๋ฆฌ ํ˜„์žฌ ๊ฒฝ๋กœ์—์„œ ์—์ด์ „ํŠธ ์œ„์น˜์™€ ๋Œ€์ƒ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ(์ฝ๊ธฐ ์ „์šฉ)
speed ์ตœ๋Œ€ ์†๋„ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅผ ๋•Œ์˜ ์ตœ๋Œ€ ์ด๋™ ์†๋„
steeringTarget ๋‚˜์•„๊ฐ€๋Š” ๋ชฉํ‘œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ํ˜„์žฌ ๋‚˜์•„๊ฐ€๋Š” ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.(์ฝ๊ธฐ ์ „์šฉ)
stoppingDistance ๋ชฉํ‘œ์™€์˜ ์•ˆ์ „ ๊ฑฐ๋ฆฌ ๋ชฉํ‘œ ์œ„์น˜์—์„œ ์ด ๊ฑฐ๋ฆฌ ๋‚ด์—์„œ ์ •์ง€ํ•ฉ๋‹ˆ๋‹ค.
updatePosition   ๋ณ€ํ™˜ ์œ„์น˜๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋œ ์—์ด์ „ํŠธ ์œ„์น˜์™€ ๋™๊ธฐํ™”๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ True์ž…๋‹ˆ๋‹ค.
updateRotation   ์—์ด์ „ํŠธ๊ฐ€ ๋ณ€ํ™˜ ๋ฐฉํ–ฅ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
updateUpAxis   ์—์ด์ „ํŠธ๋ฅผ NavMesh์˜ ์œ„์ชฝ ์ถ•์— ์ •๋ ฌํ• ์ง€ ๋˜๋Š” ์—์ด์ „ํŠธ๊ฐ€ ๋ฐฐ์น˜๋œ ๋งํฌ์— ์ •๋ ฌํ• ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
velocity ์†๋„ NavMeshAgent ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ˜„์žฌ ์†๋„์— ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ์—์ด์ „ํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ œ์–ดํ•  ์†๋„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Public Methods

ActivateCurrentOffMeshLink   ํ˜„์žฌ OffMeshLink๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
CalculatePath   ์ง€์ •๋œ ์ ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
CompleteOffMeshLink   ํ˜„์žฌ OffMeshLink์—์„œ ์ด๋™์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
FindClosestEdge   ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด NavMesh ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
GetAreaCost ๊ฒฝ๋กœ ๋น„์šฉ ํŠน์ • ์œ ํ˜•์˜ ์˜์—ญ์„ ํšก๋‹จํ•  ๋•Œ ๊ฒฝ๋กœ ๊ณ„์‚ฐ์„ ์œ„ํ•œ ๋น„์šฉ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
Move   ํ˜„์žฌ ์œ„์น˜์— ์ƒ๋Œ€ ์ด๋™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
Raycast   ์—์ด์ „ํŠธ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  NavMesh์˜ ๋ชฉํ‘œ ์œ„์น˜๋ฅผ ํ–ฅํ•ด ์ง์„  ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.
ResetPath   ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.
SamplePathPosition   ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์œ„์น˜๋ฅผ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค.
SetAreaCost ์˜์—ญ ๋น„์šฉ ์„ค์ • ์˜์—ญ ์œ ํ˜•์— ๋”ฐ๋ฅธ ์˜์—ญ์„ ํšก๋‹จํ•˜๋Š” ๋น„์šฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
SetDestination ๋ชฉํ‘œ ์„ค์ • ๋Œ€์ƒ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ƒˆ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๊ณ„์‚ฐ์„ ์‹œํ•ฉ๋‹ˆ๋‹ค.
SetPath ๊ฒฝ๋กœ ํ• ๋‹น ์ด ์—์ด์ „ํŠธ์— ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
Warp   ์ œ๊ณต๋œ ์œ„์น˜๋กœ ์—์ด์ „ํŠธ๋ฅผ ์›Œํ”„ํ•ฉ๋‹ˆ๋‹ค.

Inherited Members(์ƒ์† ๋ฉค๋ฒ„)

Properties

enabled   ํ™œ์„ฑํ™”๋œ ๋™์ž‘์€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ๋น„ํ™œ์„ฑํ™”๋œ ๋™์ž‘์€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
isActiveAndEnabled   GameObject์™€ ๊ด€๋ จ ๋™์ž‘์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ  ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.
gameObject   ์ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ฒŒ์ž„ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ•ญ์ƒ ๊ฒŒ์ž„ ๊ฐœ์ฒด์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
tag ํƒœ๊ทธ ์ด ๊ฒŒ์ž„ ๊ฐœ์ฒด์˜ ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.
transform   ์ด ๊ฒŒ์ž„ ๊ฐœ์ฒด์— ๊ฒฌ๊ฒฐ๋œ ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค.
hideFlags   ๊ฐ์ฒด๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์žฅ๋ฉด์œผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
name ์ด๋ฆ„ ๊ฐœ์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

Public Methods

BroadcastMessage   ์ด ๊ฒŒ์ž„ ๊ฐœ์ฒด ๋˜๋Š” ํ•ด๋‹น ํ•˜์œ„ ๊ฐœ์ฒด์˜ ๋ชจ๋“  MonoBehavior์—์„œ methodName์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
CompareTag   ์ •์˜๋œ ํƒœ๊ทธ์— ๋Œ€ํ•ด GameObject์˜ ํƒœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
GetComponent   ์ง€์ •ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ GameObject์˜ Tํ˜• ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
GetComponentInChildren   ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ GameObject์˜ Tํ˜• ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” GameObject์˜ ์ž์‹์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
GetComponentInParent   ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ GameObject ๋˜๋Š” GameObject์˜ ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
GetComponents   ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ GameObject์—์„œ T ์œ ํ˜•์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
GetComponentsInChildren   ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ GameObject์— ์žˆ๋Š” T ํ˜•์‹์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ GameObject์˜ ์ž์‹์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
GetComponentsInParent   ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ GameObject์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ GameObject์˜ ๋ชจ๋“  ๋ถ€๋ชจ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
SendMessage   ์ด ๊ฒŒ์ž„ ๊ฐœ์ฒด์˜ ๋ชจ๋“  MonoBehavior์—์„œ methodName์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
SendMessageUpwards   ์ด ๊ฒŒ์ž„ ๊ฐœ์ฒด์˜ ๋ชจ๋“  MonoBehavior์™€ ๋ชจ๋“  ๋™์ž‘์˜ ์กฐ์ƒ์— ๋Œ€ํ•ด methodName์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
TryGetComponent   ์ง€์ •ํ•œ ์œ ํ˜•์˜ ๊ตฌ์„ฑ ์š”์†Œ(์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ)๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
GetInstanceID   ๊ฐœ์ฒด์˜ ์ธ์Šคํ„ด์Šค ID๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
ToString   ๊ฐœ์ฒด์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Static Methods

Destroy   ๊ฒŒ์ž„ ๊ฐœ์ฒด, ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ์ž์‚ฐ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
DestroyImmediate   ๊ฐœ์ฒด๋ฅผ ์ฆ‰์‹œ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  Destroy ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•ํ•˜๊ฒŒ ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค.
DontDestroyOnLoad   ์ƒˆ ์žฅ๋ฉด์„ ๋กœ๋“œํ•  ๋•Œ ๋Œ€์ƒ ๊ฐœ์ฒด๋ฅผ ํŒŒ๊ดดํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
FindAnyObjectByType   Type ์œ ํ˜•์˜ ํ™œ์„ฑ ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
FindFirstObjectByType   Type ์œ ํ˜•์˜ ์ฒซ ๋ฒˆ์งธ ํ™œ์„ฑ ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
FindobjectOfType   Type ์œ ํ˜•์˜ ์ฒซ ๋ฒˆ์งธ ํ™œ์„ฑ ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
FindObjectsByType   Type ์œ ํ˜•์˜ ๋กœ๋“œ๋œ ๋ชจ๋“  ๊ฐœ์ฒด ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
FindObjectsOfType   Type ์œ ํ˜•์˜ ๋กœ๋“œ๋œ ๋ชจ๋“  ๊ฐœ์ฒด์˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
Instantiate   ๊ฐœ์ฒด ์›๋ณธ์„ ๋ณต์ œํ•˜๊ณ  ๋ณต์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Operators

bool   ๊ฐœ์ฒด๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๊นŒ?
operator !=   ๋‘ ๊ฐœ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
operator ==   ๋‘ ๊ฐœ์ฒด ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋™์ผํ•œ ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
728x90

 

 

 

Unity์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ ์šฉ๋œ TextMeshPro๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟจํƒ€์ž„์„ ํ‘œ์‹œํ•ด์ฃผ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋„์ค‘์— ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

 

๋ฌธ์ œ์ ์€ ๊ฐ™์€ Material์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” TextMeshPro ๊ฐ€ ๋ฐœ๋™๋  ๋•Œ ๋Œ€๋ถ€๋ถ„ ์‚ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.(์ผ๋ถ€๋Š” ์‹œ์ž‘ํ•˜์ž๋งˆ์ž ์กด์žฌ)

๋ ˆ์ด์–ด ๋ฌธ์ œ์ธ๊ฐ€ ์‹ถ์–ด์„œ Layout order๊ด€๋ จ ์ฝ”๋“œ๋“ค์„ ์‚ฝ์ž…ํ•ด๋ณด๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ๋Š” ๋‚˜์•„์ง€์ง€ ์•Š์•˜๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ Canvas ์œ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” TextMeshPro UGUI(TextMeshPro - Text(UI))์—์„œ์˜ ๋ฌธ์ œ์ ์ด์˜€๋‹ค.

ํƒ€๊ฒฉ์‹œ ๋ชฌ์Šคํ„ฐ์˜ ๋ฐ๋ฏธ์ง€ ํ‘œ์‹œ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” TextMeshPro๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๋จธํ…Œ๋ฆฌ์–ผ์˜ ๋ฌธ์ œ๋ผ ๋ณด๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” TMP_Font Asset์— ์ƒˆ๋กœ์šด ๋จธํ…Œ๋ฆฌ์–ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๋จธํ…Œ๋ฆฌ์–ผ๋กœ ์ ์šฉํ•˜์˜€๋”๋‹ˆ ๋ฌธ์ œ์ ์ด ์‚ฌ๋ผ์กŒ๋‹ค.

 

๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ LiberationSans์™€ ๊ฐ™์€ Shader๋ฅผ ์ด์šฉํ•˜๋Š” Material์„ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

 

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์ œ์ž‘ํ•œ ๊ฒƒ์ด Material Preset์—๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋ฐ.. ๊ทธ ์ด์œ ๋Š” ์ด๋ฆ„๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ฆ„์˜ ์•ž์„ ๋˜‘๊ฐ™์ด LiberationSans SDF ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด Material์—์„œ ๋ณด์ธ๋‹ค.

 

๋ณ€๊ฒฝ ์ „
๋ณ€๊ฒฝ ํ›„

 

ํƒ€๊ฒฉ์‹œ ๋ฐœ์ƒํ•˜๋Š” TextMeshPro์™€ CoolTime์—์„œ์˜ TextMeshPro๋ฅผ ๋‹ค๋ฅธ Material๋กœ ๋ณ€๊ฒฝํ•˜๋‹ˆ๊นŒ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
728x90

Unity์—์„œ LoadScene ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ Scene๊ฐ„์˜ ์ „ํ™˜์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์˜ˆ์ „ ๋ฒ„์ „์—์„œ๋Š” ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ ๋‹คํฌ๋‹ ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

Window -> Rendering -> Lighting ์„ ๋ˆ„๋ฅด๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ์ฐฝ์ด ๋‚˜ํƒ€๋‚œ๋‹ค

Generate Lighting ์„ ๋ˆ„๋ฅด๋ฉด ์•Œ์•„์„œ ์กฐ๋ช… ๊ด€๋ จ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋งŒ๋“ค์–ด์ค€๋‹ค

๋ณ„๋„๋กœ ์–ด๋””์— ๋„ฃ์–ด์ฃผ๊ฑฐ๋‚˜ ํ•  ํ•„์š”์—†์ด ์ž˜ ์ž‘๋™๋œ๋‹ค.

๋ฐ˜์‘ํ˜•
728x90

์›๋ณธ : https://ogldev.org/www/tutorial38/tutorial38.html

๋ฐฐ๊ฒฝ

๋งˆ์นจ๋‚ด ์ˆ˜๋ฐฑ๋งŒ๋ช…์˜ ๋…์ž๋“ค์ด ์š”๊ตฌํ•ด์˜จ ํŠœํ† ๋ฆฌ์–ผ. ์Šคํ‚ค๋‹์œผ๋กœ๋„ ์•Œ๋ ค์ง„ ๊ณจ๊ฒฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ, Assimp ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๊ณจ๊ฒฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์‚ฌ์‹ค ๋‘ ๋ถ€๋ถ„์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ์•„ํ‹ฐ์ŠคํŠธ๊ฐ€ ์‹คํ–‰ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์ธ ์‚ฌ์šฉ์ž(๋˜๋Š” ์ž‘์„ฑํ•œ ์—”์ง„)๊ฐ€ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ๋ชจ๋ธ๋ง ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ ๋ฆฌ๊น…์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์€ ์•„ํ‹ฐ์ŠคํŠธ๊ฐ€ mesh ์•„๋ž˜ ๋ผˆ(skeleton)์˜ ๊ณจ๊ฒฉ(bones)์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

mesh๋Š” ๋ฌผ์ฒด์˜ ํ”ผ๋ถ€(์ธ๊ฐ„์ด๋“  ๊ดด๋ฌผ์ด๋“  ๋ฌด์—‡์ด๋“ )๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ skeleton์€ ์‹ค์ œ ์„ธ๊ณ„์—์„œ ์‹ค์ œ ์›€์ง์ž„์„ ๋ชจ๋ฐฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ mesh๋ฅผ ์›€์ง์ด๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์€ ๊ฐ ์ •์ ์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ผˆ์— ํ• ๋‹นํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ •์ ์ด ๋ผˆ์— ํ• ๋‹น๋˜๋ฉด ๋ผˆ๊ฐ€ ์ด๋™ํ•  ๋•Œ ์ •์ ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์˜ ์–‘์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์„ (์ •์ ๋‹น) 1๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ผญ์ง“์ ์ด ๋‘ ๋ผˆ ์‚ฌ์ด์— ์ •ํ™•ํžˆ ์œ„์น˜ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ผˆ๊ฐ€ ๊ผญ์ง“์ ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ๊ฐ™์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋ผˆ์— 0.5์˜ ๊ฐ€์ค‘์น˜๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ผญ์ง“์ ์ด ์™„์ „ํžˆ ๋‹จ์ผ ๋ผˆ์˜ ์˜ํ–ฅ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ€์ค‘์น˜๋Š” 1์ด ๋ฉ๋‹ˆ๋‹ค(๋ผˆ๊ฐ€ ์ •์ ์˜ ์›€์ง์ž„์„ ์ž์œจ์ ์œผ๋กœ ์ œ์–ดํ•จ).

 

๋ธ”๋ Œ๋”์—์„œ ์ƒ์„ฑ๋œ ๊ณจ๊ฒฉ ๊ตฌ์กฐ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

 

์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ๋ณธ ๊ฒƒ์€ ์‚ฌ์‹ค ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์•„ํ‹ฐ์ŠคํŠธ๋Š” ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๊ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์œ ํ˜•("walk","run","die" ๋“ฑ)์— ๋Œ€ํ•œ ํ‚ค ํ”„๋ ˆ์ž„ ์„ธํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค ํ”„๋ ˆ์ž„์—๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์ž„๊ณ„์ ์— ์žˆ๋Š” ๋ชจ๋“  ๋ผˆ์˜ ๋ณ€ํ™˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ์—”์ง„์€ ํ‚ค ํ”„๋ ˆ์ž„์˜ ๋ณ€ํ™˜ ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜์—ฌ ํ‚ค ํ”„๋ ˆ์ž„ ๊ฐ„์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์›€์ง์ž„์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

๊ณจ๊ฒฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ์‚ฌ์šฉ๋˜๋Š” ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋Š” ์ข…์ข… ๊ณ„์ธต ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ skeleton์ด ์ž์‹/๋ถ€๋ชจ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ skeleton tree๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

root bone์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ผˆ์—๋Š” ๋ถ€๋ชจ๊ฐ€ ํ•˜๋‚˜์”ฉ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์ฒด์˜ ๊ฒฝ์šฐ ํŒ”, ๋‹ค๋ฆฌ, ์†๊ฐ€๋ฝ ๋ผˆ์™€ ๊ฐ™์€ ์ž์‹ ๋ผˆ๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ํ•˜์—ฌ ๋“ฑ๋ผˆ๋ฅผ root๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ชจ์˜ ๋ผˆ๊ฐ€ ์›€์ง์ด๋ฉด ๋ชจ๋“  ์ž์‹ ๋ผˆ๋“ค๋„ ์›€์ง์ด์ง€๋งŒ, ์ž์‹์˜ ๋ผˆ๊ฐ€ ์›€์ง์ด๋ฉด ๋ถ€๋ชจ๋Š” ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ์˜ ์†๊ฐ€๋ฝ์€ ์†์„ ์›€์ง์ด์ง€ ์•Š๊ณ ๋„ ์›€์ง์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์†์ด ์›€์ง์ด๋ฉด ๋ชจ๋“  ์†๊ฐ€๋ฝ์ด ์›€์ง์ž…๋‹ˆ๋‹ค). ์‹ค์งˆ์ ์ธ ๊ด€์ ์—์„œ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ผˆ์˜ ๋ณ€ํ˜•์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ทธ๊ฒƒ์„ ๊ทธ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ root๋กœ ์ด๋„๋Š” ๋ชจ๋“  ๋ถ€๋ชจ ๋ผˆ์˜ ๋ณ€ํ˜•๊ณผ ๊ฒฐํ•ฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๋” ์ด์ƒ ์กฐ์ž‘์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜์—ญ ๋ฐ–์— ์žˆ๋Š” ๋ณต์žกํ•œ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ๋ง ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์˜ˆ์ˆ ๊ฐ€๊ฐ€ ์ด ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ณ ๊ธ‰ ๋„๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹น์‹ ์€ ๋ฉ‹์ง‘ mesh์™€ skeleton์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ›Œ๋ฅญํ•œ ์˜ˆ์ˆ ๊ฐ€๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. skeletal ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ทธ๋ž˜ํ”ฝ ์—”์ง„์ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ฒซ ๋ฒˆ์žฌ ๋‹จ๊ณ„๋Š” ์ •์  ๋ฒ„ํผ๋ฅผ ์ •์ ๋ณ„ ๊ณจ๊ฒฉ ์ •๋ณด๋กœ ๋ณด๊ฐ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋ ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๊ผญ์ง“์ ์— ๋Œ€ํ•ด ๊ฐ ์Šฌ๋กฏ์— ๊ณจ๊ฒฉ ID์™€ ๊ฐ€์ค‘์น˜๊ฐ€ ํฌํ•จ๋œ ์Šฌ๋กฏ ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์‚ถ์„ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” 4๊ฐœ์˜ ์Šฌ๋กฏ์ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 4๊ฐœ ์ด์ƒ์˜ ๋ผˆ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ •์ ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ณจ๊ฒฉ์ด ๋” ๋งŽ์€ ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด ๋ฐฐ์—ด ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด ํŠœํ† ๋ฆฌ์–ผ ๋ฐ๋ชจ์— ํฌํ•จ๋œ Doom 3 ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ๊ณจ๊ฒฉ 4๊ฐœ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ์ƒˆ๋กœ์šด ๊ผญ์ง“์  ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

bone ID๋Š” bone ๋ณ€ํ™˜ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์€ WVP ํ–‰๋ ฌ ์•ž์˜ ์œ„์น˜์™€ ์ •๊ทœ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(์ฆ‰, ์ •์ ์„ "bone space"์—์„œ ๋กœ์ปฌ ๊ณต๊ฐ„์œผ๋กœ ๋ณ€ํ™˜).

๊ฐ€์ค‘์น˜๋Š” ์—ฌ๋Ÿฌ ๋ผˆ์˜ ๋ณ€ํ™˜์„ ํ•˜๋‚˜์˜ ๋ณ€ํ™˜์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์ด ๊ฐ€์ค‘์น˜๋Š” ์ •ํ™•ํžˆ 1(๋ชจ๋ธ๋ง ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ฑ…์ž„)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ‚ค ํ”„๋ ˆ์ž„ ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๊ณ  ๋ชจ๋“  ํ”„๋ ˆ์ž„์˜ ๊ณจ๊ฒฉ ๋ณ€ํ™˜ ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

 

๋ผˆ ๋ณ€ํ˜•์˜ ๋ฐฐ์—ด์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฐฉ๋ฒ•์€ ๋Œ€๊ฐœ ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๋ณ€ํ™˜์€ ๊ณ„์ธต ๊ตฌ์กฐ(์ฆ‰, ํŠธ๋ฆฌ)๋กœ ์„ค์ •๋˜๋ฉฐ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธํŠธ์— ์Šค์ผ€์ผ๋ง ๋ฒกํ„ฐ, ํšŒ์ „ ์ฟผํ„ฐ ๋ฐ ๋ณ€ํ™˜ ๋ฒกํ„ฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ์˜ ๋ผˆ์—์„œ root๊นŒ์ง€ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด ๋ณ€ํ™˜ ์ฒด์ธ์„ ํ•จ๊ป˜ ๊ณฑํ•˜์—ฌ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ณจ๊ฒฉ์— ๋Œ€ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ์‰์ด๋”๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•œ ๋ชจ๋“  ๊ฒƒ์€ ๊ฝค ์ผ๋ฐ˜์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ Assimp์˜ ๊ณจ๊ฒฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ๋Œ€ํ•œ ํŠœํ† ๋ฆฌ์–ผ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‹ค์‹œ ๋“ค์–ด๊ฐ€์„œ ์–ด๋–ป๊ฒŒ ์Šคํ‚ค๋‹์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Assimip์˜ ์ข‹์€ ์ ์€ ์—ฌ๋Ÿฌ ํ˜•์‹์˜ ๊ณจ๊ฒฉ ์ •๋ณด ๋กœ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์œ์ ์€ ์‰์ด๋”์— ํ•„์š”ํ•œ ๊ณจ๊ฒฉ ๋ณ€ํ™˜์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ •์  ์ˆ˜์ค€์˜ ๋ผˆ ์ •๋ณด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Assimp ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๊ด€๋ จ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค:

 

 

์•„๋งˆ Assimp์— ๋Œ€ํ•œ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๊ธฐ์–ตํ•˜์‹œ๊ฒ ์ง€๋งŒ, ๋ชจ๋“  ๊ฒƒ์ด aiScene ํด๋ž˜์Šค(๋งค์‰ฌ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ฐ›๋Š” ๊ฐœ์ฒด)์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. aiScene์—๋Š” aiMesh ๊ฐœ์ฒด์˜ ๋ฐฐ์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. aiMesh๋Š” ๋ชจ๋ธ์˜ ์ผ๋ถ€์ด๋ฉฐ ์œ„์น˜, ์ •๊ทœ ํ…์Šค์ฒ˜ ์ขŒํ‘œ ๋“ฑ๊ณผ ๊ฐ™์€ ์ •์  ์ˆ˜์ค€์˜ ํ•ญ๋ชฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ aiMesh์—๋Š” aiBone ๊ฐ์ฒด์˜ ๋ฐฐ์—ด๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

์ •์  ๊ฐ€์ค‘์น˜ ๋ฐฐ์—ด์€ ์‚ฌ๋ฌผ๋“ค์ด ํฅ๋ฏธ๋กœ์›Œ์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

์ด ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ๋ชฉ์—๋Š” aiMesh์˜ ์ •์  ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค(๊ผญ์ง“์ ์ด ๋™์ผํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๋ฐฐ์—ด์— ๊ฑธ์ณ ๋ถ„์‚ฐ๋จ)์™€ ๊ฐ€์ค‘์น˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ผญ์ง“์  ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์€ 1์ด์–ด์•ผ ํ•˜์ง€๋งŒ ์ด๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ๋ชจ๋“  ๋ผˆ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ๊ฐ ํŠน์ • ๊ผญ์ง“์ ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ๋ชฉ๋ก์œผ๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ๋ˆ„์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ •์  ์ˆ˜์ค€์—์„œ ๊ณจ๊ฒฉ ์ •๋ณด๋ฅผ ๊ตฌ์ถ•ํ•œ ํ›„ ๊ณจ๊ฒฉ ๋ณ€ํ™˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‰์ด๋”์— ๋กœ๋“œํ•  ์ตœ์ข… ๋ณ€ํ™˜์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ์—๋Š” ๊ด€๋ จ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

 

 

๋‹ค์‹œ, ์šฐ๋ฆฌ๋Š” aiScene์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. aiScene ๊ฐœ์ฒด์—๋Š” ๋…ธ๋“œ ๊ณ„์ธต ๊ตฌ์กฐ(์ฆ‰, ํŠธ๋ฆฌ)์˜ ๋ฃจํŠธ์ธ aiNode ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ์—๋Š” ๋ถ€๋ชจ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์™€ ์ž์‹์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ๋ฐฐ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ tree๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์™”๋‹ค๊ฐ”๋‹ค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

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

 

ํผ์ฆ์˜ ๋งˆ์ง€๋ง‰ ์กฐ๊ฐ์€ aiScene ๊ฐ์ฒด์—๋„ ์ €์žฅ๋œ aiAnimation ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ aiAnimation ๊ฐ์ฒด๋Š” "walk", "run", "shoot" ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„ ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•จ์œผ๋กœ์จ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” ์›ํ•˜๋Š” ์‹œ๊ฐ์  ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์—๋Š” ๋ˆˆ๊ธˆ์˜ ์ง€์† ์‹œ๊ฐ„๊ณผ ์ดˆ๋‹น ๋ˆˆ๊ธˆ ์ˆ˜(์˜ˆ: 100๊ฐœ์˜ ๋ˆˆ๊ธˆ๊ณผ 25๊ฐœ์˜ ๋ˆˆ๊ธˆ์€ 4์ดˆ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋‚˜ํƒ€๋ƒ„)๊ฐ€ ์žˆ์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ชจ๋“  ํ•˜๋“œ์›จ์–ด์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ์ง„ํ–‰ ์‹œ๊ฐ„์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜์—๋Š” ์ฑ„๋„์ด๋ผ๊ณ  ํ•˜๋Š” aiNodeAnim ๊ฐ์ฒด์˜ ๋ฐฐ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์ฑ„๋„์€ ์‚ฌ์‹ค ๋ชจ๋“  ๋ณ€ํ˜•์ด ์žˆ๋Š” ๋ผˆ์ž…๋‹ˆ๋‹ค. ์ฑ„๋„์—๋Š” ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜์™€ ์„ธ ๊ฐœ์˜ ๋ณ€ํ™˜ ๋ฐฐ์—ด๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ์ด๋ฆ„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

Source Walthru

(mesh.cpp:75)

bool Mesh::LoadMesh(const string& Filename)
{
    // Release the previously loaded mesh (if it exists)
    Clear();

    // Create the VAO
    glGenVertexArrays(1, &m_VAO);
    glBindVertexArray(m_VAO);

    // Create the buffers for the vertices attributes
    glGenBuffers(ARRAY_SIZE_IN_ELEMENTS(m_Buffers), m_Buffers);

    bool Ret = false;

    m_pScene = m_Importer.ReadFile(Filename.c_str(), aiProcess_Triangulate | aiProcess_GenSmoothNormals |
                                    aiProcess_FlipUVs);

    if (m_pScene) {
       m_GlobalInverseTransform = m_pScene->mRootNode->mTransformation;
       m_GlobalInverseTransform = m_GlobalInverseTransform.Inverse();
       Ret = InitFromScene(m_pScene, Filename);
    }
    else {
       printf("Error parsing '%s': '%s'\n", Filename.c_str(), m_Importer.GetErrorString());
    }

    // Make sure the VAO is not changed from the outside
    glBindVertexArray(0);

    return Ret;
}

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

 

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

 

(mesh.h:69)

struct VertexBoneData
{
    uint IDs[NUM_BONES_PER_VERTEX];
    float Weights[NUM_BONES_PER_VERTEX];
}

(mesh.cpp:107)

bool Mesh::InitFromScene(const aiScene* pScene, const string& Filename)
{
    ...
    vector<VertexBoneData> Bones;
    ...
    Bones.resize(NumVertices);
    ...
    glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[BONE_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Bones[0]) * Bones.size(), &Bones[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(BONE_ID_LOCATION);
    glVertexAttribIPointer(BONE_ID_LOCATION, 4, GL_INT, sizeof(VertexBoneData), (const GLvoid*)0);
    glEnableVertexAttribArray(BONE_WEIGHT_LOCATION);
    glVertexAttribPointer(BONE_WEIGHT_LOCATION, 4, GL_FLOAT, GL_FALSE, sizeof(VertexBoneData), (const GLvoid*)16);
    ...
}

์œ„์˜ ๊ตฌ์กฐ๋Š” ๊ผญ์ง“์  ์ˆ˜์ค€์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ 4๊ฐœ์˜ ๋ผˆ(๋ผˆ๋‹น ID ๋ฐ ๋ฌด๊ฒŒ)๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ €์žฅ ๊ณต๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

VertexBoneData๋Š” ์‰์ด๋”์— ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์œ„์น˜ 0, 1, 2์— ๊ฐ๊ฐ ์œ„์น˜, ํ…์Šค์ฒ˜ ์ขŒํ‘œ ๋ฐ ์ผ๋ฐ˜ ๊ฒฝ๊ณ„๋ฅผ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์น˜ 3์—์„œ ๊ณจ๊ฒฉ ID๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์œ„์น˜ 4์—์„œ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋„๋ก VAO๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ glVertexAttribute๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ๋ชฉํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ID๋ฅผ ๋ฐ”์ธ๋”ฉํ•  glVertexAttributePointer๊ฐ€ ์•„๋‹Œ IPointer์ž…๋‹ˆ๋‹ค. ์ด ์ ์— ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‰์ด๋”์— ์†์ƒ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

 

(mesh.cpp:213)

void Mesh::LoadBones(uint MeshIndex, const aiMesh* pMesh, vector& Bones)
{
    for (uint i = 0 ; i < pMesh->mNumBones ; i++) {
        uint BoneIndex = 0;
        string BoneName(pMesh->mBones[i]->mName.data);

        if (m_BoneMapping.find(BoneName) == m_BoneMapping.end()) {
            BoneIndex = m_NumBones;
            m_NumBones++;
            BoneInfo bi;
            m_BoneInfo.push_back(bi);
        }
        else {
            BoneIndex = m_BoneMapping[BoneName];
        }

        m_BoneMapping[BoneName] = BoneIndex;
        m_BoneInfo[BoneIndex].BoneOffset = pMesh->mBones[i]->mOffsetMatrix;

        for (uint j = 0 ; j < pMesh->mBones[i]->mNumWeights ; j++) {
            uint VertexID = m_Entries[MeshIndex].BaseVertex + pMesh->mBones[i]->mWeights[j].mVertexId;
            float Weight = pMesh->mBones[i]->mWeights[j].mWeight;
            Bones[VertexID].AddBoneData(BoneIndex, Weight);
        }
    }
}

์œ„์˜ ํ•จ์ˆ˜๋Š” ๋‹จ์ผ aiMesh ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ •์  ๊ณจ๊ฒฉ ์ •๋ณด๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. Mesh::InitMesh()์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” VertexBoneData ๊ตฌ์กฐ๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒƒ ์™ธ์—๋„ ๊ณจ๊ฒฉ ์ด๋ฆ„๊ณผ ๊ณจ๊ฒฉ ID(์ด ํ•จ์ˆ˜์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์‹คํ–‰์ค‘์ธ ์ธ๋ฑ์Šค) ์‚ฌ์ด์˜ ๋งต์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๊ณจ๊ฒฉ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฒกํ„ฐ์— ์˜คํ”„์…‹ ํ–‰๋ ฌ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ •์  ID๊ฐ€ ๊ณ„์‚ฐ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ •์  ID๋Š” ๋‹จ์ผ ๋งค์‰ฌ์™€ ๊ด€๋ จ์ด ์žˆ๊ณ  ๋ชจ๋“  ๋งค์‰ฌ๋ฅผ ๋‹จ์ผ ๋ฒกํ„ฐ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ aiMesh์˜ ๊ธฐ๋ณธ ์ •์  ID๋ฅผ mWeights ๋ฐฐ์—ด์˜ ์ •์  ID์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ ˆ๋Œ€ ์ •์  ID๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

 

(mesh.cpp:29)

void Mesh::VertexBoneData::AddBoneData(uint BoneID, float Weight)
{
    for (uint i = 0 ; i < ARRAY_SIZE_IN_ELEMENTS(IDs) ; i++) {
        if (Weights[i] == 0.0) {
            IDs[i] = BoneID;
            Weights[i] = Weight;
            return;
        }
    }

    // should never get here - more bones than we have space for
    assert(0);
}

์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋Š” VertexBoneData ๊ตฌ์กฐ์—์„œ ๋นˆ ์Šฌ๋กฏ์„ ์ฐพ์•„ ๊ณจ๊ฒฉ ID์™€ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ •์ ์€ 4๊ฐœ ๋ฏธ๋งŒ์˜ ๋ผˆ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ผˆ์˜ ๋ฌด๊ฒŒ๊ฐ€ 0์œผ๋กœ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์—(VertexBoneData ์ƒ์„ฑ์ž ์ฐธ์กฐ), ์ด๋Š” ๋ชจ๋“  ๋ผˆ ์ˆ˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ฐ€์ค‘์น˜ ๊ณ„์‚ฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 (mesh.cpp:473)

Matrix4f Mesh::BoneTransform(float TimeInSeconds, vector<Matrix4f>& Transforms)
{
    Matrix4f Identity;
    Identity.InitIdentity();

    float TicksPerSecond = m_pScene->mAnimations[0]->mTicksPerSecond != 0 ?
                            m_pScene->mAnimations[0]->mTicksPerSecond : 25.0f;
    float TimeInTicks = TimeInSeconds * TicksPerSecond;
    float AnimationTime = fmod(TimeInTicks, m_pScene->mAnimations[0]->mDuration);

    ReadNodeHierarchy(AnimationTime, m_pScene->mRootNode, Identity);

    Transforms.resize(m_NumBones);

    for (uint i = 0 ; i < m_NumBones ; i++) {
        Transforms[i] = m_BoneInfo[i].FinalTransformation;
    }
}

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

 

(mesh.cpp:428)

void Mesh::ReadNodeHierarchy(float AnimationTime, const aiNode* pNode, const Matrix4f& ParentTransform)
{
    string NodeName(pNode->mName.data);

    const aiAnimation* pAnimation = m_pScene->mAnimations[0];

    Matrix4f NodeTransformation(pNode->mTransformation);

    const aiNodeAnim* pNodeAnim = FindNodeAnim(pAnimation, NodeName);

    if (pNodeAnim) {
        // Interpolate scaling and generate scaling transformation matrix
        aiVector3D Scaling;
        CalcInterpolatedScaling(Scaling, AnimationTime, pNodeAnim);
        Matrix4f ScalingM;
        ScalingM.InitScaleTransform(Scaling.x, Scaling.y, Scaling.z);

        // Interpolate rotation and generate rotation transformation matrix
        aiQuaternion RotationQ;
        CalcInterpolatedRotation(RotationQ, AnimationTime, pNodeAnim);
        Matrix4f RotationM = Matrix4f(RotationQ.GetMatrix());

        // Interpolate translation and generate translation transformation matrix
        aiVector3D Translation;
        CalcInterpolatedPosition(Translation, AnimationTime, pNodeAnim);
        Matrix4f TranslationM;
        TranslationM.InitTranslationTransform(Translation.x, Translation.y, Translation.z);

        // Combine the above transformations
        NodeTransformation = TranslationM * RotationM * ScalingM;
    }

    Matrix4f GlobalTransformation = ParentTransform * NodeTransformation;

    if (m_BoneMapping.find(NodeName) != m_BoneMapping.end()) {
        uint BoneIndex = m_BoneMapping[NodeName];
        m_BoneInfo[BoneIndex].FinalTransformation = m_GlobalInverseTransform * GlobalTransformation *
                                                    m_BoneInfo[BoneIndex].BoneOffset;
    }

    for (uint i = 0 ; i < pNode->mNumChildren ; i++) {
        ReadNodeHierarchy(AnimationTime, pNode->mChildren[i], GlobalTransformation);
    }
}

์ด ํ•จ์ˆ˜๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ์ง€์ •๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๊ฐ ๋…ธ๋“œ/๋ณธ์— ๋Œ€ํ•œ ์ตœ์ข… ๋ณ€ํ™˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งค์‰ฌ๊ฐ€ ํ•˜๋‚˜์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œํ€€์Šค๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•˜๋ ค๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ด๋ฆ„์„ ๋งํ•˜๊ณ  m_pScene->mAnimations[] ๋ฐฐ์—ด์—์„œ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ๋ชจ ๋งค์‰ฌ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

 

๋…ธ๋“œ ๋ณ€ํ™˜์€ ๋…ธ๋“œ์˜ mTransformation ๋ฉค๋ฒ„์—์„œ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋…ธ๋“œ๊ฐ€ ๋ผˆ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ๋ผˆ์˜ ์ตœ์ข…๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ƒ์„ฑํ•œ ํ–‰๋ ฌ๋กœ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ฑ„๋„ ๋ฐฐ์—ด์—์„œ ๋…ธ๋“œ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค์ผ€์ผ๋ง ๋ฒกํ„ฐ, ํšŒ์ „ ์ฟผํ„ฐ ๋ฐ ๋ณ€ํ™˜ ๋ฒกํ„ฐ๋ฅผ ๋ณด๊ฐ„ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜์˜ ํ–‰๋ ฌ๋กœ ๊ฒฐํ•ฉํ•˜๊ณ  ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์–ป์€ ํ–‰๋ ฌ(GlobablTransformation)๋กœ ๊ณฑํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ์žฌ๊ท€์ ์ด๋ฉฐ ๊ธ€๋กœ๋ฒŒ ๋ณ€ํ™˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ID ๋งคํŠธ๋ฆญ์Šค์ธ root ๋…ธ๋“œ์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ๋ชจ๋“  ์ž์‹์— ๋Œ€ํ•ด ์ด ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์ž์ฒด ๋ณ€ํ™˜์„ ์ „์—ญ ๋ณ€ํ™˜์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ํ†ตํ•ฉ๋œ ๋ณ€ํ™˜ ์ฒด์ž„์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

 

์—ฌ๊ธฐ์„œ๋Š” Assimp ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ•™ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์šฐ๋ฆฌ๋งŒ์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค๋กœ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๊ทธ๋ƒฅ Assimp๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

(mesh.cpp:387)

void Mesh::CalcInterpolatedRotation(aiQuaternion& Out, float AnimationTime, const aiNodeAnim* pNodeAnim)
{
    // we need at least two values to interpolate...
    if (pNodeAnim->mNumRotationKeys == 1) {
        Out = pNodeAnim->mRotationKeys[0].mValue;
        return;
    }

    uint RotationIndex = FindRotation(AnimationTime, pNodeAnim);
    uint NextRotationIndex = (RotationIndex + 1);
    assert(NextRotationIndex < pNodeAnim->mNumRotationKeys);
    float DeltaTime = pNodeAnim->mRotationKeys[NextRotationIndex].mTime - pNodeAnim->mRotationKeys[RotationIndex].mTime;
    float Factor = (AnimationTime - (float)pNodeAnim->mRotationKeys[RotationIndex].mTime) / DeltaTime;
    assert(Factor >= 0.0f && Factor <= 1.0f);
    const aiQuaternion& StartRotationQ = pNodeAnim->mRotationKeys[RotationIndex].mValue;
    const aiQuaternion& EndRotationQ = pNodeAnim->mRotationKeys[NextRotationIndex].mValue;
    aiQuaternion::Interpolate(Out, StartRotationQ, EndRotationQ, Factor);
    Out = Out.Normalize();
}

์ด ๋ฐฉ๋ฒ•์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ง€์ •๋œ ์ฑ„๋„์˜ ํšŒ์ „์ฟผํ„ฐ๋ฅผ ๋ณด๊ฐ„ํ•ฉ๋‹ˆ๋‹ค(์ฑ„๋„์— ํ‚ค ์ฟผํ„ฐ ๋ฐฐ์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ์Œ). ๋จผ์ € ํ•„์š”ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„ ์ง์ „์˜ ํ•ต์‹ฌ ์ฟผํ„ฐ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„์—์„œ ์ด์ „ ํ‚ค๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์™€ ํ•ด๋‹น ํ‚ค์™€ ๋‹ค์Œ ํ‚ค ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ์‚ฌ์ด์˜ ๋น„์œจ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋‘ ํ‚ค ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Assimp ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๊ฐ„์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. ์œ„์น˜ ๋ฐ ์Šค์ผ€์ผ๋ง์— ๋Œ€ํ•œ ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ์ธ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

(mesh.cpp:335)

uint Mesh::FindRotation(float AnimationTime, const aiNodeAnim* pNodeAnim)
{
    assert(pNodeAnim->mNumRotationKeys > 0);

    for (uint i = 0 ; i < pNodeAnim->mNumRotationKeys - 1 ; i++) {
        if (AnimationTime < (float)pNodeAnim->mRotationKeys[i + 1].mTime) {
            return i;
        }
    }

    assert(0);
}

์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐฉ๋ฒ•์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„ ์ง์ „์˜ ํ‚ค ํšŒ์ „์„ ์ฐพ์Šต๋‹ˆ๋‹ค. N ํ‚ค ํšŒ์ „์ด ์žˆ์œผ๋ฉด ๊ฒฐ๊ณผ๋Š” 0์—์„œ N-2๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„์€ ํ•ญ์ƒ ์ฑ„๋„์˜ ์ง€์† ์‹œ๊ฐ„ ๋‚ด์— ํฌํ•จ๋˜๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ํ‚ค(N-1)๋Š” ์œ ํšจํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

(skihnning.vs)

#version 330

layout (location = 0) in vec3 Position;
layout (location = 1) in vec2 TexCoord;
layout (location = 2) in vec3 Normal;
layout (location = 3) in ivec4 BoneIDs;
layout (location = 4) in vec4 Weights;

out vec2 TexCoord0;
out vec3 Normal0;
out vec3 WorldPos0;

const int MAX_BONES = 200;

uniform mat4 gWVP;
uniform mat4 gWorld;
uniform mat4 gBones[MAX_BONES];

void main()
{
    mat4 BoneTransform = gBones[BoneIDs[0]] * Weights[0];
    BoneTransform += gBones[BoneIDs[1]] * Weights[1];
    BoneTransform += gBones[BoneIDs[2]] * Weights[2];
    BoneTransform += gBones[BoneIDs[3]] * Weights[3];

    vec4 PosL = BoneTransform * vec4(Position, 1.0);
    gl_Position = gWVP * PosL;
    TexCoord0 = TexCoord;
    vec4 NormalL = BoneTransform * vec4(Normal, 0.0);
    Normal0 = (gWorld * NormalL).xyz;
    WorldPos0 = (gWorld * PosL).xyz;
}

์ด์ œ ๋งค์‰ฌ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ ์ž‘์—…์„ ๋งˆ์ณค์œผ๋ฏ€๋กœ ์‰์ด๋” ์ˆ˜์ค€์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € VSInput ๊ตฌ์กฐ์— ๊ณจ๊ฒฉ ID ๋ฐ ๊ฐ€์ค‘์น˜ ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

 

(tutorial38.cpp:140)

float RunningTime = (float)((double)GetCurrentTimeMillis() - (double)m_startTime) / 1000.0f;

m_mesh.BoneTransform(RunningTime, Transforms);

for (uint i = 0 ; i < Transforms.size() ; i++) {
    m_pEffect->SetBoneTransform(i, Transforms[i]);
}

์šฐ๋ฆฌ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด์•ผ ํ•  ์ผ์€ ์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ž‘์—…์€ ์œ„์˜ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์œ„์˜ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

GetCurrentTimeMillis() ํ•จ์ˆ˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์ดํ›„์˜ ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(๋ถ„์ˆ˜๋ฅผ ์ˆ˜์šฉํ•˜๋ ค๋ฉด ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค).

 

๋ชจ๋“  ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ์ด๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์†Œ์Šค ์ฝ”๋“œ ์ฃผ์†Œ : https://github.com/emeiri/ogldev/tree/master/tutorial28_youtube

๋ฐ˜์‘ํ˜•

'๊ณต๋ถ€ > OpenGL ์ž๋ฃŒ ๋ฒˆ์—ญ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฒˆ์—ญ] Tutorial 16 : Shadow mapping  (0) 2023.04.23
728x90

์›๋ณธ : http://www.opengl-tutorial.org/kr/intermediate-tutorials/tutorial-16-shadow-mapping/

 

ํŠœํ† ๋ฆฌ์–ผ 15์—์„œ๋Š” ์ •์  ์กฐ๋ช…์„ ํฌํ•จํ•˜๋Š” ๋ผ์ดํŠธ ๋งต์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

์•„์ฃผ ๋ฉ‹์ง„ ๊ทธ๋ฆผ์ž๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ชจ๋ธ์€ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

Shadow Map์€ ํ˜„์žฌ(2016๋…„ ๊ธฐ์ค€) ๋™์  Shadow๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์˜ ์ข‹์€ ์ ์€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ๊ฝค ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์œ์ ์€ ์ œ๋Œ€๋กœ ์ž‘์—… ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋จผ์ € ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์†Œ๊ฐœํ•˜๊ณ  ๋‹จ์ ์„ ํ™•์ธํ•œ ๋‹ค์Œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Shadow Map์„ ์ž‘์„ฑํ•  ๋‹น์‹œ(2012๋…„)์—๋Š” ์—ฌ์ „ํžˆ ๋งŽ์€ ์—ฐ๊ตฌ๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ์ฃผ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”์— ๋”ฐ๋ผ ์ž์ฒด Shadow Map์„ ๋”์šฑ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ Shadowmap

๊ธฐ๋ณธ Shadow Map ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‘ ๊ฐœ์˜ ํŒจ์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋จผ์ €, ์žฅ๋ฉด์€ ๋น›์˜ ๊ด€์ ์—์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๊ฐ fragment์˜ ๊นŠ์ด๋งŒ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

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

 

"๊ทธ๋ฆผ์ž ์†์— ์žˆ๋Š” ๋ฌผ์ฒด" ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒ˜ํ”Œ์ด ๋™์ผํ•œ ์ ์—์„œ ๊ทธ๋ฆผ์ž ๋งต๋ณด๋‹ค ๋น›์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์œผ๋ฉด ์”ฌ(scene)์— ๋น›์— ๋” ๊ฐ€๊นŒ์šด ๊ฐœ์ฒด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ˜„์žฌ fragment๋Š” ๊ทธ๋ฆผ์ž์— ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ ์ด๋ฏธ์ง€๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Shadowmap ๋ Œ๋”๋งํ•˜๊ธฐ

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” directional lights(๋ชจ๋“  ๊ด‘์„ ์ด ํ‰ํ–‰ํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ์กฐ๋ช…)๋งŒ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Shadow Map ๋ Œ๋”๋ง์€ ์ง๊ต ํˆฌ์˜ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ง๊ต ํ–‰๋ ฌ์€ ์›๊ทผ๋ฒ•์ด ๊ณ ๋ ค๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜์ ์ธ ์›๊ทผ๋ฒ• ํˆฌ์˜ ํ–‰๋ ฌ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ์ฒด๋Š” ์นด๋ฉ”๋ผ ๊ฐ€๊นŒ์ด์— ์žˆ๋Š” ๋ฉ€๋ฆฌ์žˆ๋“  ๋™์ผํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

 

๋ Œ๋” ๋Œ€์ƒ ๋ฐ MVP ๋งคํŠธ๋ฆญ์Šค ์„ค์ •

ํŠœํ† ๋ฆฌ์–ผ 14๋ถ€ํ„ฐ๋Š” ์‰์ด๋”์—์„œ ๋‚˜์ค‘์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์žฅ๋ฉด์„ ํ…์Šค์ฒ˜๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ๋Š” Shadow Map์„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด 1024x1024 16๋น„ํŠธ depth ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Shadow Map์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 16๋น„ํŠธ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’๋“ค์„ ์ž์œ ๋กญ๊ฒŒ ์‹œํ—˜ํ•ด๋ณด์„ธ์š”. ๋‚˜์ค‘์— ์ƒ˜ํ”Œ๋งํ•ด์•ผ ํ•˜๋ฏ€๋กœ depth ๋ Œ๋” ๋ฒ„ํผ๊ฐ€ ์•„๋‹Œ depth ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

// The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer.
 GLuint FramebufferName = 0;
 glGenFramebuffers(1, &FramebufferName);
 glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

 // Depth texture. Slower than a depth buffer, but you can sample it later in your shader
 GLuint depthTexture;
 glGenTextures(1, &depthTexture);
 glBindTexture(GL_TEXTURE_2D, depthTexture);
 glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, 1024, 1024, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0);

 glDrawBuffer(GL_NONE); // No color buffer is drawn to.

 // Always check that our framebuffer is ok
 if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
 return false;

๋น›์˜ ๊ด€์ ์—์„œ ์žฅ๋ฉด์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” MVP ๋งคํŠธ๋ฆญ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค:

  • Projection ํ–‰๋ ฌ์€ X,Y ๋ฐ Z ์ถ•์—์„œ ๊ฐ๊ฐ ์ถ• ์ •๋ ฌ ์ƒ์ž(-10, 10), (-10,10), (-10, 20)์˜ ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ์ง๊ต ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’์€ ์ „์ฒด *๊ฐ€์‹œ์ ์ธ* ์žฅ๋ฉด์„ ํ•ญ์ƒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”๊ฐ€ ์ง„ํ–‰ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • View ํ–‰๋ ฌ์€ ์นด๋ฉ”๋ผ ๊ณต๊ฐ„์—์„œ ์กฐ๋ช… ๋ฐฉํ–ฅ์ด -Z๊ฐ€ ๋˜๋„๋ก ์›”๋“œ๋ฅผ ํšŒ์ „์‹œํ‚ต๋‹ˆ๋‹ค(ํŠœํ† ๋ฆฌ์–ผ 3 ์ฐธ์กฐ)
  • Model ํ–‰๋ ฌ์€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
glm::vec3 lightInvDir = glm::vec3(0.5f,2,2);

 // Compute the MVP matrix from the light's point of view
 glm::mat4 depthProjectionMatrix = glm::ortho<float>(-10,10,-10,10,-10,20);
 glm::mat4 depthViewMatrix = glm::lookAt(lightInvDir, glm::vec3(0,0,0), glm::vec3(0,1,0));
 glm::mat4 depthModelMatrix = glm::mat4(1.0);
 glm::mat4 depthMVP = depthProjectionMatrix * depthViewMatrix * depthModelMatrix;

 // Send our transformation to the currently bound shader,
 // in the "MVP" uniform
 glUniformMatrix4fv(depthMatrixID, 1, GL_FALSE, &depthMVP[0][0])

์‰์ด๋”

์ด ํŒจ์Šค ๋™์•ˆ ์‚ฌ์šฉ๋˜๋Š” ์‰์ด๋”๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. vertex ์‰์ด๋”๋Š” ๊ท ์งˆ ์ขŒํ‘œ์—์„œ ์ •์ ์˜ ์œ„์น˜๋ฅผ ๊ฐ„๋‹จํžˆ ๊ณ„์‚ฐํ•˜๋Š” ํ†ต๊ณผ ์‰์ด๋”์ž…๋‹ˆ๋‹ค:

#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;

// Values that stay constant for the whole mesh.
uniform mat4 depthMVP;

void main(){
 gl_Position =  depthMVP * vec4(vertexPosition_modelspace,1);
}

fragment ์‰์ด๋”๋Š” ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์— fragment์˜ ๊นŠ์ด๋ฅผ ์œ„์น˜ 0(์ฆ‰, ๊นŠ์ด ํ…์Šค์ฒ˜)์— ๊ธฐ๋กํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

#version 330 core

// Ouput data
layout(location = 0) out float fragmentdepth;

void main(){
    // Not really needed, OpenGL does it anyway
    fragmentdepth = gl_FragCoord.z;
}

Shadow Map์„ ๋ Œ๋”๋งํ•˜๋Š” ์†๋„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๋ฐ˜ ๋ Œ๋”๋ง๋ณด๋‹ค ๋‘ ๋ฐฐ ์ด์ƒ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊นŠ์ด์™€ ์ƒ‰์ƒ ๋Œ€์‹  ์ •๋ฐ€๋„๊ฐ€ ๋‚ฎ์€ ๊นŠ์ด๋งŒ ๊ธฐ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์€ GPU์—์„œ ๊ฐ€์žฅ ํฐ ์„ฑ๋Šฅ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

๊ฒฐ๊ณผ ํ…์Šค์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด๋‘์šด ์ƒ‰์ƒ์€ ์ž‘์€ z๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒฝ์˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ๊ฐ€ ์นด๋ฉ”๋ผ ๊ทผ์ฒ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ํฐ์ƒ‰์€ z=1(๋™์ผํ•œ ์ขŒํ‘œ)์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋งค์šฐ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

Shadowmap ์‚ฌ์šฉํ•˜๊ธฐ

๊ธฐ๋ณธ ์‰์ด๋”

์ด์ œ ํ‰์†Œ์˜ ์‰์ด๋”๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๊ณ„์‚ฐํ•˜๋Š” ๊ฐ fragment์— ๋Œ€ํ•ด Shadow Map ๋’ค์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด Shadow Map์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ ๊ณต๊ฐ„๊ณผ ๋™์ผํ•œ ๊ณต๊ฐ„์—์„œ ํ˜„์žฌ fragment์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ MVP ํ–‰๋ ฌ๋กœ ํ•œ ๋ฒˆ ๋ณ€ํ™˜ํ•˜๊ณ  ๊นŠ์ด MVP ํ–‰๋ ฌ๋กœ ํ•œ ๋ฒˆ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์†์ž„์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์  ์œ„์น˜์— ๊นŠ์ด๋ฅผ ๊ณฑํ•˜๋ฉด MVP๋Š” [-1,1]์— ์žˆ๋Š” ๊ท ์ผํ•œ ์ขŒํ‘œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ํ…์Šค์ฒ˜ ์ƒ˜ํ”Œ๋ง์€ [0,1]์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™”๋ฉด ์ค‘์•™์— ์žˆ๋Š” fragment๋Š” ๊ท ์ผํ•œ ์ขŒํ‘œ๋กœ (0,0)์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์งˆ๊ฐ ์ค‘๊ฐ„์€ ์ƒ˜ํ”Œ๋งํ•ด์•ผ ํ•˜๋ฏ€๋กœ UV๋Š” (0.5,05)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๊ฒƒ์€ fragment shader์—์„œ ์ง์ ‘ fetch ์ขŒํ‘œ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹จ์ˆœํžˆ ์ขŒํ‘œ๋ฅผ 2(๋Œ€๊ฐ์„  : [-1.1] -> [-0.5,0.5])๋กœ ๋‚˜๋ˆ„๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” ํ–‰๋ ฌ(์•„๋ž˜ ํ–‰ : [-0.5,0.5]->[0,1])์„ ๊ณฑํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

glm::mat4 biasMatrix(
0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0
);
glm::mat4 depthBiasMVP = biasMatrix*depthMVP;

์ด์ œ vertex ์‰์ด๋”๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๋™์ผํ•˜์ง€๋งŒ 1:1์ด ์•„๋‹Œ 2๊ฐœ์˜ ์œ„์น˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค:

  • gl_Position ์€ ํ˜„์žฌ ์นด๋ฉ”๋ผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ •์ ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  • ShadowCoord๋Š” ๋งˆ์ง€๋ง‰ ์นด๋ฉ”๋ผ(๋น›)์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ •์ ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
// Output position of the vertex, in clip space : MVP * position
gl_Position =  MVP * vec4(vertexPosition_modelspace,1);

// Same, but with the light's view matrix
ShadowCoord = DepthBiasMVP * vec4(vertexPosition_modelspace,1);

๊ทธ๋Ÿฐ ๋‹ค์Œ fragment ์‰์ด๋”๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

  • texture(shadowMap, ShadowCoord.xy).z ๋Š” ๋น›๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋น›์„ ์ฐจ๋‹จํ•˜๋Š” ํ์ƒ‰์ž ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ShadowCoord.z๋Š” ๋น›๊ณผ ํ˜„์žฌ fragment ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

...๋”ฐ๋ผ์„œ ํ˜„์žฌ fragment๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ์ƒ‰์ž๋ณด๋‹ค ๋ฉ€๋ฆฌ ์žˆ์œผ๋ฉด, ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ (ํ•ด๋‹น ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ์ƒ‰์ž์˜) ๊ทธ๋ฆผ์ž์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

float visibility = 1.0;
if ( texture( shadowMap, ShadowCoord.xy ).z  <  ShadowCoord.z){
    visibility = 0.5;
}

์šฐ๋ฆฌ๋Š” ์ด ์ง€์‹์„ ์ด์šฉํ•˜์—ฌ ์Œ์˜์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฃผ๋ณ€ ์ƒ‰์ƒ์€ ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒํ™œ ์†์˜ ๋ชฉ์ ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ฆผ์ž ์†์— ์žˆ์„ ๋•Œ๋„ ๋“ค์–ด์˜ค๋Š” ๋น›์„ ๊ฐ€์งœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ˆœ์ˆ˜ํ•œ ๊ฒ€์€์ƒ‰์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค)

color =
 // Ambient : simulates indirect lighting
 MaterialAmbientColor +
 // Diffuse : "color" of the object
 visibility * MaterialDiffuseColor * LightColor * LightPower * cosTheta+
 // Specular : reflective highlight, like a mirror
 visibility * MaterialSpecularColor * LightColor * LightPower * pow(cosAlpha,5);

๊ฒฐ๊ณผ - ์‰๋„์šฐ ์•„ํฌ๋„ค

๋‹ค์Œ์€ ํ˜„์žฌ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ, ์•„์ด๋””์–ด๋Š” ๋›ฐ์–ด๋‚˜์ง€๋งŒ , ํ’ˆ์งˆ์€ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ด๋ฏธ์ง€์˜ ๊ฐ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์—๋Š” ShadowMap๊ณผ ShadowMap_simple์˜ ๋‘ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋‘˜ ์ค‘ ๋” ๋งˆ์Œ์— ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”.

๊ฐ„๋‹จํ•œ ๋ฒ„์ „์€ ์œ„์˜ ์ด๋ฏธ์ง€๋งŒํผ ํ’ˆ์งˆ์ด ์ข‹์ง€ ์•Š์ง€๋งŒ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์ ๋“ค

Shadow acne

๊ฐ€์žฅ ๋ช…๋ฐฑํ•œ ๋ฌธ์ œ์ ์€ shadow acne์ด๋‹ค:

์ด ํ˜„์ƒ์€ ๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€๋กœ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

์ด์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ "์ˆ˜์ •"์€ error margin์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ fragment์˜ depth(๋‹ค์‹œ๋งํ•ด, ๋น› ๊ณต๊ฐ„)๊ฐ€ ๋ผ์ดํŠธ๋งต ๊ฐ’์—์„œ ์ •๋ง ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์Œ์˜ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํŽธํ–ฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

float bias = 0.005;
float visibility = 1.0;
if ( texture( shadowMap, ShadowCoord.xy ).z  <  ShadowCoord.z-bias){
    visibility = 0.5;
}

๊ฒฐ๊ณผ๋ฌผ์€ ํ›จ์”ฌ ๋‚˜์•„์ง‘๋‹ˆ๋‹ค:

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

๊ฒŒ๋‹ค๊ฐ€, 0.005์˜ ํŽธํ–ฅ์€ ๋•…์—์„œ๋Š” ๋„ˆ๋ฌด ๋งŽ์ด ๋ณด์ด์ง€๋งŒ, ๊ณก๋ฉด์—์„œ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: ๋ช‡๋ช‡ ์ธ๊ณต๋ฌผ๋“ค์€ ์‹ค๋ฆฐ๋”์™€ ๊ตฌ์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ธฐ์šธ๊ธฐ์— ๋”ฐ๋ผ ์น˜์šฐ์นจ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

float bias = 0.005*tan(acos(cosTheta)); // cosTheta is dot( n,l ), clamped between 0 and 1
bias = clamp(bias, 0,0.01);

Shadow acne๋Š” ์ด์ œ, ๊ตฌ๋ถ€๋Ÿฌ์ง„ ํ‘œ๋ฉด์—์„œ๋„ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๋”ฐ๋ผ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ShadowMap์—์„œ ๋’ท๋ฉด๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋‘๊บผ์šด ๋ฒฝ์„ ๊ฐ€์ง„ ํŠน๋ณ„ํ•œ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ(๋‹ค์Œ ์„น์…˜ - Peter Panning ์ฐธ์กฐ)๋ฅผ ๊ฐ–๋„๋ก ๊ฐ•์š”ํ•˜์ง€๋งŒ, ์ ์–ด๋„ acne๋Š” ๊ทธ๋ฆผ์ž์— ์žˆ๋Š” ํ‘œ๋ฉด์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ShadowMap์„ ๋ Œ๋”๋งํ•  ๋•Œ ์ „๋ฉด ์‚ผ๊ฐํ˜•์„ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.

        // We don't use bias in the shader, but instead we draw back faces,
        // which are already separated from the front faces by a small distance
        // (if your geometry is made this way)
        glCullFace(GL_FRONT); // Cull front-facing triangles -> draw only back-facing triangles

๊ทธ๋ฆฌ๊ณ  ์”ฌ(scene)์„ ๋ Œ๋”๋งํ•  ๋•Œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค(๋’ท๋ฉด ์ ˆ๋‹จ)

         glCullFace(GL_BACK); // Cull back-facing triangles -> draw only front-facing triangles

์ด ๋ฐฉ๋ฒ•์€ ํŽธํ–ฅ ์™ธ์—๋„ ์ฝ”๋“œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Peter Panning

์šฐ๋ฆฌ๋Š” ๋” ์ด์ƒ Shadow acne๊ฐ€ ์—†์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ž˜๋ชป๋œ ์Œ์˜์˜ ๋•…์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋ฒฝ์„ ๋‚ ์•„๋‹ค๋‹ˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค(์ดํ›„ "ํ”ผํ„ฐ ํŒจ๋‹"์ด๋ผ๋Š” ์šฉ์–ด). ์‚ฌ์‹ค, ํŽธํ–ฅ(bias)์„ ๋”ํ•˜๋Š” ๊ฒƒ์€ ์ƒํ™ฉ์„ ๋” ์•…ํ™”์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–‡์€ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹จ์ ์€ ๋ Œ๋”๋งํ•  ์‚ผ๊ฐํ˜•์ด ๋” ๋งŽ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ”„๋ ˆ์ž„๋‹น ๋‘ ๋ฒˆ!)

Aliasing

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

PCF

์ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ShadowMap์˜ ์ƒ˜ํ”Œ๋Ÿฌ ์œ ํ˜•์„ Sampler2D ์‰์ด๋”๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ShadowMap์„ ํ•œ ๋ฒˆ ์ƒ˜ํ”Œ๋งํ•˜๋ฉด ํ•˜๋“œ์›จ์–ด๊ฐ€ ์‹ค์ œ๋กœ ์ธ์ ‘ํ•œ ํ…์…€๋„ ์ƒ˜ํ”Œ๋งํ•˜๊ณ  ๋ชจ๋“  ํ…์…€์— ๋Œ€ํ•ด ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋น„๊ต ๊ฒฐ๊ณผ์˜ ์ด์ค‘ ์„ ํ˜• ํ•„ํ„ฐ๋ง๊ณผ ํ•จ๊ป˜ [0,1]์˜ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, 0.5๋Š” ๋‘ ๊ฐœ์˜ ํ‘œ๋ณธ์ด ๊ทธ๋ฆผ์ž์— ์žˆ๊ณ  ๋‘ ๊ฐœ์˜ ํ‘œ๋ณธ์ด ๋น›์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

ํ•„ํ„ฐ๋ง๋œ ๊นŠ์ด ๋งต์˜ ๋‹จ์ผ ์ƒ˜ํ”Œ๋ง๊ณผ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋น„๊ต๋Š” ํ•ญ์ƒ true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. PCF๋Š” 4 "true ๋˜๋Š” false"์˜ ๋ณด๊ฐ„๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ ๊ทธ๋ฆผ์ž ํ…Œ๋‘๋ฆฌ๋Š” ๋งค๋„๋Ÿฝ์ง€๋งŒ ๊ทธ๋ฆผ์ž ๋งต์˜ ํ…์Šค์ฒ˜๋Š” ์—ฌ์ „ํžˆ ๋ณด์ž…๋‹ˆ๋‹ค.

Poisson Sampling

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์‰๋„์šฐ ๋งต์„ ํ•œ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ N๋ฒˆ ์ƒ˜ํ”Œ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PCF์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด N์ด ์ž‘๋”๋ผ๋„ ๋งค์šฐ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ 4๊ฐœ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

for (int i=0;i<4;i++){
  if ( texture( shadowMap, ShadowCoord.xy + poissonDisk[i]/700.0 ).z  <  ShadowCoord.z-bias ){
    visibility-=0.2;
  }
}

poissonDisk๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ ์ƒ์ˆ˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค:

vec2 poissonDisk[4] = vec2[](
  vec2( -0.94201624, -0.39906216 ),
  vec2( 0.94558609, -0.76890725 ),
  vec2( -0.094184101, -0.92938870 ),
  vec2( 0.34495938, 0.29387760 )
);

์ด ๋ฐฉ๋ฒ•์€ ํ†ต๊ณผํ•  ์‰๋„์šฐ ๋งต ์ƒ˜ํ”Œ ์ˆ˜์— ๋”ฐ๋ผ ์ƒ์„ฑ๋œ fragment๊ฐ€ ๋‹ค์†Œ ์–ด๋‘์›Œ์ง‘๋‹ˆ๋‹ค.

700.0 ์ƒ์ˆ˜๋Š” ํ‘œ๋ณธ์ด "ํ™•์‚ฐ"๋˜๋Š” ์ •๋„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ ๊ฒŒ ํผ๋œจ๋ฆฌ๋ฉด ๋‹ค์‹œ ์•จ๋ฆฌ์–ด์‹ฑ์ด ๋ฐœ์ƒํ•˜๊ณ , ๋„ˆ๋ฌด ๋งŽ์ด ํผ๋œจ๋ฆฌ๋ฉด ๋ฐด๋”ฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.*(์ด ์Šคํฌ๋ฆฐ์ƒท์€ ๋” ๊ทน์ ์ธ ํšจ๊ณผ๋ฅผ ์œ„ํ•ด PCF๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  16๊ฐœ์˜ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.*

Stratified Poisson Sampling

ํ”ฝ์…€๋งˆ๋‹ค ๋‹ค๋ฅธ ์ƒ˜ํ”Œ์„ ์„ ํƒํ•˜์—ฌ ์ด ๋ฐด๋”ฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค : Stratified Poisson ๋˜๋Š” Rotated Poisson

Stratified๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ‘œ๋ณธ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Rotated๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋žœ๋ค ํšŒ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” Stratified ๋ฒ„์ „๋งŒ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ๋žœ๋ค ์ธ๋ฑ์Šค๋กœ poissonDisk๋ฅผ ์ธ๋ฑ์‹ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

    for (int i=0;i<4;i++){
        int index = // A random number between 0 and 15, different for each pixel (and each i !)
        visibility -= 0.2*(1.0-texture( shadowMap, vec3(ShadowCoord.xy + poissonDisk[index]/700.0,  (ShadowCoord.z-bias)/ShadowCoord.w) ));
    }

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,[0,1]์—์„œ ๋‚œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

    float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673));
    return fract(sin(dot_product) * 43758.5453);

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ seed4๋Š” i(4๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ์ƒ˜ํ”Œ์„ ์ฑ„์ทจํ•  ์ˆ˜ ์žˆ๋„๋ก)์™€ ...์˜ ์กฐํ•ฉ์ด ๋ฉ๋‹ˆ๋‹ค.

gl_FragCord(ํ™”๋ฉด์˜ ํ”ฝ์…€ ์œ„์น˜)๋˜๋Š” Position_worldspace๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        //  - A random sample, based on the pixel's screen location.
        //    No banding, but the shadow moves with the camera, which looks weird.
        int index = int(16.0*random(gl_FragCoord.xyy, i))%16;
        //  - A random sample, based on the pixel's position in world space.
        //    The position is rounded to the millimeter to avoid too much aliasing
        //int index = int(16.0*random(floor(Position_worldspace.xyz*1000.0), i))%16;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ํŒจํ„ด์ด ์‚ฌ๋ผ์ง€๊ณ  ์‹œ๊ฐ์  ๋…ธ์ด์ฆˆ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž˜ ์ˆ˜ํ–‰๋œ ๋…ธ์ด์ฆˆ๋Š” ์ข…์ข… ์ด๋Ÿฌํ•œ ํŒจํ„ด๋ณด๋‹ค ๋œ ๋ถˆ์พŒํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์˜ˆ๋Š” tutorial16/ShadowMapping.fragmentshader ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋” ๋‚˜์•„๊ฐ€๊ธฐ

์ด ๋ชจ๋“  ๋ฐฉ๋ฒ•์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์šฐ๋ฆฌ์˜ ๊ทธ๋ฆผ์ž๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Early bailing

๊ฐ fragment์— ๋Œ€ํ•ด 16๊ฐœ์˜ ํ‘œ๋ณธ์„ ์ถ”์ถœํ•˜๋Š” ๋Œ€์‹ (๋‹ค์‹œ ๋งํ•˜๋ฉด ๋งŽ์€ ์–‘) 4๊ฐœ์˜ ๋ฉ€๋ฆฌ ์žˆ๋Š” ํ‘œ๋ณธ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

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

Spot lights

์ŠคํฌํŠธ๋ผ์ดํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ™•์‹คํ•œ ๊ฒƒ์€ ์ง๊ต ํˆฌ์šฉ ํ–‰๋ ฌ์„ ์›๊ทผ ํˆฌ์˜ ํ–‰๋ ฌ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

glm::vec3 lightPos(5, 20, 20);
glm::mat4 depthProjectionMatrix = glm::perspective<float>(glm::radians(45.0f), 1.0f, 2.0f, 50.0f);
glm::mat4 depthViewMatrix = glm::lookAt(lightPos, lightPos-lightInvDir, glm::vec3(0,1,0));

๊ฐ™์€ ๊ฒƒ์ด์ง€๋งŒ, orthographic frustum ๋Œ€์‹ ์— perspective frustum์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

texture2Dproj ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ทผ ๋ถ„ํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.(์ž์Šต์„œ4- ํ–‰๋ ฌ์˜ ๊ฐ์ฃผ ์ฐธ์กฐ)

 

๋‘๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์‰์ด๋”์˜ ๊ด€์ ์—์„œ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.(์ž์Šต์„œ 4- ํ–‰๋ ฌ์˜ ๊ฐ์ฃผ ์ฐธ์กฐ). ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ํˆฌ์‹œ ํˆฌ์˜ ํ–‰๋ ฌ์€ ์‹ค์ œ๋กœ ์–ด๋–ค ํˆฌ์‹œ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ํ•˜๋“œ์›จ์–ด์—์„œ ์˜ˆ์ƒ ์ขŒํ‘œ๋ฅผ w๋กœ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ, ์šฐ๋ฆฌ๋Š” ์‰์ด๋”์˜ ๋ณ€ํ˜•์„ ๋ชจ๋ฐฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ž์‹ ์„ ๋ถ„ํ• ํ•˜๋Š” ๊ด€์ ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ, orthographic ํ–‰๋ ฌ์€ ํ•ญ์ƒ w=1์˜ ๊ท ์งˆ ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์›๊ทผ๋ฒ•์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

 

GLSL์—์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ์ค„์€ ๋‚ด์žฅ textureProj ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์ •ํ™•ํ•˜๊ฒŒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

if ( texture( shadowMap, (ShadowCoord.xy/ShadowCoord.w) ).z  <  (ShadowCoord.z-bias)/ShadowCoord.w )
if ( textureProj( shadowMap, ShadowCoord.xyw ).z  <  (ShadowCoord.z-bias)/ShadowCoord.w )

Point lights

๋™์ผํ•˜์ง€๋งŒ depth ๊ทœ๋ธŒ ๋งต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ๋ธŒ ๋งต์€ ํ๋ธŒ์˜ ๊ฐ ๋ฉด์— ํ•˜๋‚˜์”ฉ ์žˆ๋Š” 6๊ฐœ์˜ ํ…์Šค์ฒ˜ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ‘œ์ค€ UV ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” 3D ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊นŠ์ด๋Š” ๊ณต๊ฐ„์˜ ๋ชจ๋“  ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ €์žฅ๋˜๋ฏ€๋กœ ์ ๊ด‘ ์ฃผ์œ„์— ๊ทธ๋ฆผ์ž๊ฐ€ ๋“œ๋ฆฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๊ฐœ์˜ ๋น› ํ˜ผํ•ฉ

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

์ž๋™ ๋น› frustum

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์ „์ฒด ์žฅ๋ฉด์„ ํฌํ•จํ•˜๋„๋ก ์†์œผ๋กœ ๋งŒ๋“  ๋น› frustum์ž…๋‹ˆ๋‹ค. ์ด ์ œํ•œ๋œ ์˜ˆ์ œ์—์„œ๋Š” ์ด ์ž‘์—…์ด ์ž‘๋™ํ•˜์ง€๋งŒ ์ด ์ž‘์—…์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋‹น์‹ ์˜ ์ง€๋„๊ฐ€ 1Km x 1Km์ด๋ผ๋ฉด, ๋‹น์‹ ์˜ 1024x1024 ๊ทธ๋ฆผ์ž ์ง€๋„์˜ ๊ฐ ํ…์ŠคํŠธ๋Š” 1ํ‰๋ฐฉ๋ฏธํ„ฐ๋ฅผ ์ฐจ์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ˜•ํŽธ ์—†์Šต๋‹ˆ๋‹ค. ์กฐ๋ช…์˜ ํˆฌ์˜ ํ–‰๋ ฌ์€ ๊ฐ€๋Šฅํ•œํ•œ ํƒ€์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

์ŠคํฌํŠธ๋ผ์ดํŠธ์˜ ๊ฒฝ์šฐ ๋ฒ”์œ„๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํƒœ์–‘๊ณผ ๊ฐ™์€ ๋ฐฉํ–ฅ ์กฐ๋ช…์€ ๋” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์ •๋ง๋กœ ์ „์ฒด ์žฅ๋ฉด์„ ๋น„์ถ”์ฃ . ๊ด‘๊ฒฉ์ž๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์ž ์žฌ์  ๊ทธ๋ฆผ์ž ์ˆ˜์‹ ๊ธฐ ๋˜๋Š” ์ค„์—ฌ์„œ PSR์€ ๋น›์˜ frustum, view frustum ๋ฐ ์žฅ๋ฉด ๊ฒฝ๊ณ„ ์ƒ์ž์— ๋™์‹œ์— ์†ํ•˜๋Š” ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ด ๋ฌผ์ฒด๋“ค์€ ์Œ์˜์„ ๋ฐ›๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ์™€ ๋น›์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ž ์žฌ์  ๊ทธ๋ฆผ์ž ์บ์Šคํ„ฐ(PCF)๋Š” ๋ชจ๋‘ ์ž ์žฌ์  ๊ทธ๋ฆผ์ž ์ˆ˜์‹ ๊ธฐ์ด๋ฉฐ, ๊ทธ ์‚ฌ์ด์— ์žˆ๋Š” ๋ชจ๋“  ๋ฌผ์ฒด(๋ฌผ์ฒด๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ณด์ด๋Š” ๊ทธ๋ฆผ์ž๋ฅผ ๋“œ๋ฆฌ์šธ ์ˆ˜ ์žˆ์Œ)์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋น› ํˆฌ์˜ ํ–‰๋ ฌ์„ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ๋ณด์ด๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ฒฝ๊ณ„ ์ƒ์ž๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๊ณ„ ์ƒ์ž์™€ ์กฐ๋ช… ์‚ฌ์ด์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒˆ ๊ฒฝ๊ณ„ ์ƒ์ž๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋Š” ์กฐ๋ช… ๋ฐฉํ–ฅ์„ ๋”ฐ๋ผ ์ •๋ ฌ๋จ).

 

์ด๋Ÿฌํ•œ ์ง‘ํ•ฉ์˜ ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์—๋Š” ๋ณผ๋ก ๊ป์งˆ ๊ต์ฐจ์  ๊ณ„์‚ฐ์ด ํฌํ•จ๋˜์ง€๋งŒ, ์ด ๋ฐฉ๋ฒ•์€ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ฆผ์ž ๋งต ํ•ด์ƒ๋„๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌผ์น˜๊ฐ€ frustum์—์„œ ์‚ฌ๋ผ์ง€๋ฉด ํŒํ•‘์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ณ„๋‹จ์‹ Shadow Map์—๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šฐ๋ฉฐ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ฐ’์„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ•˜์—ฌ ๋ณด์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์ˆ˜ shadow maps

์ง€์ˆ˜ ๊ทธ๋ฆผ์ž ๋งต์€ ๊ทธ๋ฆผ์ž์— ์žˆ์ง€๋งŒ ๋น› ํ‘œ๋ฉด ๊ทผ์ฒ˜์— ์žˆ๋Š” fragment๊ฐ€ ์‹ค์ œ๋กœ "๊ฐ€์šด๋ฐ ์–ด๋”˜๊ฐ€"๋ผ๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ์•จ๋ฆฌ์–ด์‹ฑ์„ ์ œํ•œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋”์ด์ƒ ์ด์ง„๋ฒ•์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ์ด๋Š” ํŽธํ–ฅ๊ณผ ๊ด€๋ จ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น›์ด ์žˆ๋Š” ํ‘œ๋ฉด๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด fragment๊ฐ€ ์ ์  ์–ด๋‘์›Œ์ง‘๋‹ˆ๋‹ค.

 

์ด๊ฒƒ์€ ๋ช…๋ฐฑํžˆ ๋ถ€์ •ํ–‰์œ„์ด๋ฉฐ, ๋‘ ๋ฌผ์ฒด๊ฐ€ ๊ฒน์น  ๋•Œ ์ธ๊ณต๋ฌผ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น›-๊ณต๊ฐ„ ์›๊ทผ๋ฒ• shadow maps

LiSPSM์€ ์นด๋ฉ”๋ผ ๊ทผ์ฒ˜์—์„œ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋น› ํˆฌ์˜ ํ–‰๋ ฌ์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "๋ถˆ์•ˆ์ •ํ•œ frustra"์˜ ๊ฒฝ์šฐ์—๋Š” ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฉํ–ฅ์„ ๋ฐ”๋ผ์ง€๋งŒ, ์Šคํฟ๋ผ์ดํŠธ๋Š” ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์„ ๋ฐ”๋ผ๋ด…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋น› ๊ทผ์ฒ˜, ์ฆ‰ ๋‹น์‹ ์œผ๋กœ๋ถ€ํ„ฐ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๊ณณ์— ๋งŽ์€ ๊ทธ๋ฆผ์ž ์ง€๋„ ์ •๋ฐ€๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋‹น์‹ ์ด ๊ฐ€์žฅ ํ•„์š”๋กœ ํ•˜๋Š” ์นด๋ฉ”๋ผ ๊ทผ์ฒ˜์— ๋‚ฎ์€ ํ•ด์ƒ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ LiSPSM์€ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ณ„๋‹จ์‹ shadow maps

CSM์€ LiSPSM๊ณผ ์™„์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ view frustum์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜(2-4) ํ‘œ์ค€ ๊ทธ๋ฆผ์ž ๋งต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ๋ฏธํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ์ž‘์€ ๊ตฌ์—ญ์— ๋Œ€ํ•ด์„œ๋Š” ํ›Œ๋ฅญํ•œ ํ•ด์ƒ๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ์ž ์ง€๋„๋Š” ๋” ๋จผ ๋ฌผ์ฒด๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ shadow map์€ ์žฅ๋ฉด์˜ ํฐ ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ์ง€๋งŒ, ๊ด€์  ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ตฌ์—ญ๋ณด๋‹ค ์‹œ๊ฐ์ ์œผ๋กœ ๋” ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ณ„๋‹จ์‹ ์‰๋„์šฐ ๋งต์€ ์ž‘์„ฑ ๋‹น์‹œ(2012๋…„) ์ตœ๊ณ ์˜ ๋ณต์žก์„ฑ/ํ’ˆ์งˆ ๋น„์œจ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งŽ์€ ๊ฒฝ์šฐ์— ์„ ํƒ์˜ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๋ณด์‹œ๋‹ค์‹œํ”ผ, ๊ทธ๋ฆผ์ž ์ง€๋„๋Š” ๋ณต์žกํ•œ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ๋งค๋…„ ์ƒˆ๋กœ์šด ๋ณ€ํ˜•๊ณผ ๊ฐœ์„ ์‚ฌํ•ญ์ด ๋ฐœํ‘œ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ๋กœ์„œ๋Š” ์–ด๋–ค ์†”๋ฃจ์…˜๋„ ์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋‹คํ–‰ํžˆ, ์ œ์‹œ๋œ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฉ๋ฒ•์€ ํ•จ๊ป˜ ํ˜ผํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น› ๊ณต๊ฐ„ ๊ด€์ ์—์„œ ๊ณ„์‚ฐ์‹ shadow map์„ PCF๋กœ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.. ์ด ๋ชจ๋“  ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ—˜ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ, ์ €๋Š” ๋‹น์‹ ์ด ๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋œ ๋ผ์ดํŠธ๋งต์„ ๊ณ ์ˆ˜ํ•˜๊ณ , ๋™์  ๊ฐ์ฒด์—๋งŒ shadowmap์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๊ฐ€์ง€์˜ ์‹œ์ž‘์  ํ’ˆ์งˆ์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์™„๋ฒฝํ•œ ์ •์  ํ™˜๊ฒฝ๊ณผ ๋ชจ์–‘์ƒˆ๊ฐ€ ์ข‹์ง€ ์•Š์€ ๊ทธ๋ฆผ์ž๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

Release v3.2

2023๋…„ 02์›” 24์ผ

Gitbook์„ ํ†ตํ•ด์„œ Documentation์„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋“ฏ ํ•จ.

์ถ”๊ฐ€

*ํ”ผ์ฝ” 4*

- ํ”ผ์ฝ”4์— ๋Œ€ํ•œ ๊ณต์‹์ ์ธ ์ง€์›์„ ์ถ”๊ฐ€ํ•จ

*ํฌ๋กฌ๋ถ*

- ํฌ๋กฌ๋ถ์— ์ถ”๊ฐ€์ ์ธ ์ง€์›์„ ์ถ”๊ฐ€ํ•จ. ๋” ๋งŽ์€ ์ •๋ณด

*ํ˜ธ์ŠคํŠธ ์ œ์–ด*

- ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ VR ์ถ”์ ์„ ์žฌ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ. ๋” ๋งŽ์€ ์ •๋ณด

- ํ˜ธ์ŠคํŠธ๊ฐ€ ์„ธ์…˜ ๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ž ๊ทธ๊ฑฐ๋‚˜ ์ž ๊ธˆ ํ•ด์ œํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•จ. ๋” ๋งŽ์€ ์ •๋ณด

- ํ˜ธ์ŠคํŠธ๊ฐ€ ํ™˜๊ฒฝ ๋‚ด์˜ ์ง€์ •๋œ ์˜์—ญ์œผ๋กœ ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž๋ฅผ ์†Œํ™˜ํ•˜๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ. ๋” ๋งŽ์€ ์ •๋ณด

*์•„๋ฐ”ํƒ€*

- VR ์‚ฌ์šฉ์ž๊ฐ€ ์†๋ชฉ ์ปจํŠธ๋กค์„ ํ†ตํ•ด ์ถ”์ ์„ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ. ๋” ๋งŽ์€ ์ •๋ณด

*IP์™€ ์—์…‹ ๋ณดํ˜ธ*

- LITE ์‚ฌ์šฉ์ž๊ฐ€ IFX ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋จ. ๋” ๋งŽ์€ ์ •๋ณด

- ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•  ๋•Œ ๊ณต์œ  IFX๋ฅผ ํฌํ•จํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋Š” ์„ธ์…˜ ์„ค์ •์ด ์ถ”๊ฐ€๋จ. ๋” ๋งŽ์€ ์ •๋ณด

*์Šคํฌ๋ฆฐ ๊ณต์œ *

- ์—ฐ๊ฒฐ๋œ ํ™”๋ฉด ์™ธ์— ๊ณต์œ ํ•  ํŠน์ • ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ. ๋” ๋งŽ์€ ์ •๋ณด

*๋…น์Œ*

- ๊ทธ๋ฃน ์ˆ˜์ค€์—์„œ ๊ธฐ๋ก ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ.

 

๊ฐœ์„ ์‚ฌํ•ญ

*๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ*

- ํ”Œ๋žซํผ์˜ ์•ˆ์ •์„ฑ์— ๋„์›€์ด ๋˜๋Š” ์ค‘์š”ํ•œ ์—…๋ฐ์ดํŠธ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ ์šฉํ•จ.

- ์‚ฌ์šฉ์ž๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์•”ํ˜ธ๋ฅผ ์„ ํƒํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์‚ฌ์šฉ์ž ์•”ํ˜ธ ๋งŒ๋“ค๊ธฐ ๊ธฐ๋Šฅ์ด ํ–ฅ์ƒ๋จ.

- OWASP ASVS V4 ์ง€์นจ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์•”ํ˜ธ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ.

- ์•”ํ˜ธ ๊ฐ•๋„ ํ‘œ์‹œ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•จ.

*ํ˜ธ์ŠคํŠธ ์ œ์–ด*

- VR ์žฅ์น˜์˜ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์†Œํ™˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์†Œํ™˜๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง๋ฉดํ•  ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ. ๋” ๋งŽ์€ ์ •๋ณด

*์ฝ˜ํ…์ธ  ์—๋””ํ„ฐ*

- ํ˜„์žฌ ์„ ํƒํ•œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ IFX ์˜ต์…˜์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ O ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•จ.

- ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‚ด์šฉ ์ž‘์„ฑ์ž์˜ ์ด๋ฆ„์„ ๋‚ด์šฉ ํŽธ์ง‘๊ธฐ๋กœ ๋ณ€๊ฒฝํ•จ.

- ํ”„๋กœ๊ทธ๋žจ์—์„œ ์žฅ๋ฉด ์ด๋ฆ„์ด ์‹œํ€€์Šค๋กœ ๋ณ€๊ฒฝ๋จ.

- ํƒ€์ž„๋ผ์ธ์—์„œ ์žฌ์ƒ ํ—ค๋“œ๊ฐ€ ๋‹ค์‹œ 0์œผ๋กœ ์ ํ”„ํ•˜๋Š” ๋Œ€์‹  ์œ„์น˜๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์ €์žฅ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐœ์„ ํ•จ.

*ํฌํƒˆ*

- ์•”ํ˜ธ๋กœ ๋ณดํ˜ธ๋œ ์„ธ์…˜์œผ๋กœ ์ด์–ด์ง€๋Š” ํฌํ„ธ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋จ. ์‚ฌ์šฉ์ž๊ฐ€ ํฌํ„ธ์„ ํ†ต๊ณผํ•˜๋ ค๋ฉด ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•จ. ๋” ๋งŽ์€ ์ •๋ณด

*์ด๋ชจ์ง€*

- Windows ์žฅ์น˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๋กœ ๊ฐ€๊ธฐ ํ‚ค๋ฅผ ํ†ตํ•ด ์ด๋ชจ์ง€๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ. ๋” ๋งŽ์€ ์ •๋ณด

*์˜ค๋””์˜ค*

- ๋ถ€์žฌ์ค‘ ๋ชจ๋“œ๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ ์‚ฌ์šฉ์ž์˜ ๋งˆ์ดํฌ๊ฐ€ ๋ถ€์žฌ์ค‘ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๊ธฐ ์ „๊ณผ ๋™์ผํ•œ ์Œ์†Œ๊ฑฐ ์ƒํƒœ๊ฐ€ ๋˜๋„๋ก ๋ถ€์žฌ์ค‘ ๋ชจ๋“œ์— ๋Œ€ํ•œ ์Œ์†Œ๊ฑฐ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•จ.

- ์‚ฌ์šฉ์ž๋ฅผ ์•‰ํžˆ๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋…น์Œํ•  ๋•Œ ์นด์šดํŠธ๋‹ค์šด ์˜ค๋””์˜ค ๊ฒฝ๋ณด์˜ ๋ณผ๋ฅจ์„ ๋ณด๋‹ค ํŽธ์•ˆํ•œ ์ˆ˜์ค€์œผ๋กœ ๋‚ฎ์ถค.

*์•„๋ฐ”ํƒ€*

- VR ๊ธฐ๊ธฐ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ•์ˆ˜ ๋ฐ ์† ์˜ฌ๋ฆฌ๊ธฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ฐœ์„ ํ•จ.

*๋ฏธ๋””์–ด*

- ๋™์˜์ƒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์— metadata ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•จ.

*๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜*

- ํ˜„์ง€ํ™”๋œ ํ…์ŠคํŠธ์˜ ๋ฐฐ์น˜ ๋ฐ ๊ฐ„๊ฒฉ์— ์—ฌ๋Ÿฌ ๊ฐœ์„ ์‚ฌํ•ญ์„ ์ ์šฉํ•จ.

*์›น ๋ธŒ๋ผ์šฐ์ €*

- ์‚ฌ์šฉ์ž๊ฐ€ ์„ธ์…˜ ๋‚ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ๋ถ€์ ์ ˆํ•œ ์‚ฌ์ดํŠธ์— ์•ก์„ธ์Šคํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์›น ์‚ฌ์ดํŠธ ํ•„ํ„ฐ๋ง์ด ๊ฐœ์„ ๋จ.

 

์ˆ˜์ •์‚ฌํ•ญ

*์˜ค๋””์˜ค*

- Windows ์žฅ์น˜์—์„œ ๋””์Šคํ”Œ๋ ˆ์ด ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์„ ํƒํ•œ ๋งˆ์ดํฌ ์ž…๋ ฅ์„ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ž…ํ•˜๋Š” ๋™์•ˆ ์„ธ์…˜ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ์Œ์„ฑ ํ†ต์‹ ์ด ๋Š๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ณต์œ ํ•  ๋•Œ Android ์žฅ์น˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ Bluetooth ํ—ค๋“œํฐ์„ ํ†ตํ•ด ์˜ค๋””์˜ค๋ฅผ ์†์‹คํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*์˜ค๋””์˜ค*

- ํ”ผ์ฝ” ๋„ค์˜ค 3 ๋˜๋Š” ๋ฉ”ํƒ€ ํ€˜์ŠคํŠธ 2 ํ—ค๋“œ์…‹์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ์•„๋ฐ”ํƒ€๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ away ๋ชจ๋“œ์— ๋“ค์–ด๊ฐ”์„ ๋•Œ ๋ฐ”๋‹ฅ์— ๋„ˆ๋ฌด ๊ฐ€๊นŒ์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- MyFace ์ž์‚ฐ ๋‹ค์šด๋กœ๋“œ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ์šฐ์ฃผ๋ณต ์žฅ๋น„ ์˜ค๋ฒ„๋ผ์ด๋“œ ์ ์šฉ์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ๋งˆ์ดํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ์•„๋ฐ”ํƒ€์˜ ๋จธ๋ฆฌ๊ฐ€ ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์‚ฌ์šฉ์ž๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋จธ๋ฆฌ ๊ฐ€๊นŒ์ด ๊ฐ€์ ธ๊ฐ”์„ ๋•Œ ์•„๋ฐ”ํƒ€์˜ ํŒ”์ด ๋น„ํ˜„์‹ค์ ์œผ๋กœ ํšŒ์ „ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*์ฝ˜ํ…์ธ  ์—๋””ํ„ฐ*

- Windows ์žฅ์น˜์—์„œ Cํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ํ•„๋“œ์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ปจํŠธ๋กค ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์ผœ์ง€๊ฑฐ๋‚˜ ๊บผ์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์‹œ๊ฐ„ ํ‘œ์‹œ ๋ง‰๋Œ€๋ฅผ ์ˆ˜์ง์œผ๋กœ ์Šคํฌ๋กคํ•  ๋•Œ ์‹œ๊ฐ„ ํ‘œ์‹œ ๋ง‰๋Œ€์˜ ์ƒˆ ์œ„์น˜๋กœ ๊ฐœ์ฒด ๋Œ๊ธฐ ์ˆ˜์ •.

- ๋…นํ™”์—์„œ ์บก์ฒ˜๋œ ๋ฏธ๋””์–ด๊ฐ€ ๋ฃจํ”„์—์„œ ์ฒ˜์Œ ๋ช‡ ์ดˆ๋งŒ ์žฌ์ƒ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์‹œ๊ฐ„์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ IFX์˜ ์‹œ๊ฐ„ ๊ฐ’ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ์ €์žฅ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์‹คํ–‰ ์ทจ์†Œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€ IFX์™€ ๊ฐ™์€ ๊ฐœ์ฒด๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ๊นœ๋ฐ•์ด๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ๊ฐœ์ฒด์— ์ ์šฉ๋œ ๋ณ€ํ™˜์ด ์‹คํ–‰ ์ทจ์†Œ ๊ธฐ๋ก์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์‹คํ–‰ ์ทจ์†Œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ž‘์—…์ด ๋ฌด์‹œ๋จ.

- ์‹œํ€€์Šค๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๋“œํ•  ๋•Œ๊นŒ์ง€ Cloud File Manager๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋œ ์˜ค๋””์˜ค ํŒŒ์ผ์ด ๋“ค๋ฆฌ์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ํŠธ๋ฆฌ๊ฑฐ๋œ ํšจ๊ณผ๋ฅผ ๋Œ€ํ™”ํ˜• IFX์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ณต์›๋จ.

- ๋น„๋””์˜ค ํ™”๋ฉด(ํ”Œ๋žซ ์™ธ๋ถ€ URL) IFX์˜ ๋ชจ์–‘์„ ์ˆ˜์ •ํ•˜์—ฌ ์ค‘์•™์— ํ‘œ์‹œ๋œ ํˆฌ๋ช… ์ŠคํŠธ๋ฆฝ์„ ์ œ๊ฑฐํ•จ.

*์ด๋ชจ์ง€*

- ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ชจ์ง€๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ด๋ชจ์ง€ ํŒจ๋„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ์ด๋ชจ์ง€๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ์„ธ์…˜์œผ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*์ด๋ฒคํŠธ*

- ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ข…๋ฃŒํ•œ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๋„๋ก ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•จ.

*๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜*

- ์ผ๋ถ€ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ˆ„๋ฝ๋œ ๋ฒˆ์—ญ์ด ์ถ”๊ฐ€๋จ.

- ์‚ฌ์šฉ์ž๊ฐ€ PC VR ์žฅ์น˜์—์„œ ๋ฐ”ํƒ• ํ™”๋ฉด์„ ๊ณต์œ ํ•  ๋•Œ ์ผ๋ถ€ ์–ธ์–ด์— ๋Œ€ํ•ด ๋‚˜ํƒ€๋‚˜๋Š” ์ค‘์ฒฉ ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•จ.

*๋ฏธ๋””์–ด*

- ๋ฏธ๋””์–ด๋ฅผ ์žฌ์ƒํ•  ๋•Œ MacOS ์žฅ์น˜์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ™์œ™๊ฑฐ๋ฆฌ๋Š” ์†Œ๋ฆฌ๊ฐ€ ๋“ค๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- 360 ๋น„๋””์˜ค ๋ฃธ์—์„œ 360 ๋น„๋””์˜ค๋ฅผ ๋ณผ ๋•Œ ๊ณต์œ  ํ™”๋ฉด ํŽ˜์ด์ง€์— ๊ฒน์น˜๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ๊ณต์œ ๋œ ํŒŒ์›Œํฌ์ธํŠธ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ํฌํ•จํ•œ ๋…นํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฏธ๋””์–ด ํ™”๋ฉด ์•ž์— ๋‹ค๋ฅธ ์•„๋ฐ”ํƒ€๊ฐ€ ์›€์ง์ด๋Š” ๊ฒƒ์„ ๋ณธ๋‹ค๋ฉด ํ•ด๋‹น ์•„๋ฐ”ํƒ€๋Š” ์‹œ๊ฐ์ ์ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋’ค์— ๋‚จ๊น๋‹ˆ๋‹ค.

*๊ฐœ์ธ ๊ฒฝ๊ณ„*

- ์•„๋ฐ”ํƒ€์™€ ๋™์‹œ์— ์‚ฌ์šฉ์ž์˜ ํƒœ๋ธ”๋ฆฟ์ด ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*๋ ˆ์ฝ”๋”ฉ*

- ๊ธฐ๋ก์ด IFX๋กœ ๋กœ๋“œ๋œ ํ›„ ์„ธ์…˜์— ์ฐธ์—ฌํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ก์„ ๋ณผ ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*์Šค๋ƒ…์ƒท*

- ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ IFX ์Šค๋ƒ…์ƒท์ด ์„ธ์…˜์— ๋กœ๋“œ๋  ๋•Œ ์—ฌ์ „ํžˆ ์›๋ž˜ ์ด๋ฆ„์„ ํ‘œ์‹œํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*์Šคํ‹ฐํ‚ค ๋…ธํŠธ*

- Windows ๋ฐ MacOS ์žฅ์น˜์—์„œ ์ด์ „์— ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ์ค‘๊ฐ„์— ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค*

- ์•„๋ฐ”ํƒ€๊ฐ€ ์›€์ง์ด๋Š” ํ”Œ๋žซํผ์ด๋‚˜ ๊ฐ์ฒด์— ์žˆ๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์„ธ์…˜ ๋‚ด ๋ฉ”๋‰ด์˜ ์ผ๋ถ€์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ๋กœ๋”ฉ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ์ค„ ์ œ๋ชฉ์ด ๋ถ€๋ถ„์ ์œผ๋กœ ๋Š๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์•„๋ฐ”ํƒ€์˜ ๋จธ๋ฆฌ ์œ„์— ๋‚˜ํƒ€๋‚˜๋Š” ํ•˜๋“œ ๋ฎคํŠธ ์•„์ด์ฝ˜์œผ๋กœ ์ธํ•ด ๋ฌผ์ฒด์™€ ํ’๊ฒฝ์„ ํ†ตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ๋ฏธ๋””์–ด ๋กœ๋“œ ์Šคํ”ผ๋„ˆ์˜ ์ผ๋ถ€๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅ๋œ ๋น„๋””์˜ค ๋งํฌ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฐ€์ƒ ํ‚ค๋ณด๋“œ์˜ ์ œ๋ชฉ์„ ์ˆ˜์ •ํ•จ.

- ๋น„๋””์˜ค ๋งํฌ ๋˜๋Š” ์›น ๋งํฌ๋ฅผ ๋กœ๋“œํ•˜๋Š” ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ฝ˜ํ…์ธ  ์žฌ์ƒ์ด ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ ์ฝ˜ํ…์ธ ๊ฐ€ ์žฌ์ƒ ์ค‘์ด๋ผ๋Š” ํ‘œ์‹œ๊ฐ€ ๊ณ„์† ํ‘œ์‹œ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

*VR ํ—ค๋“œ์…‹*

- PICO ๋ฐ VIVE ํ—ค๋“œ์…‹์˜ ์„ธ์…˜ ๋‚ด ๋ฉ”๋‰ด์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ์•„๋ฐ”ํƒ€์˜ ์†์ด ๊ณ„์† ๋ณด์ด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- PICO ๋ฐ VIVE ํ—ค๋“œ์…‹์—์„œ ํ•ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

- PICO ํ—ค๋“œ์…‹์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํฌํ„ธ๋กœ ์ˆœ๊ฐ„์ด๋™ ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.

 

*๊ณต์ง€*

- ENGAGE XR์€ ๋”์ด์ƒ ์˜คํ˜๋Ÿฌ์Šค ํ€˜์ŠคํŠธ 1, ํ”ผ์ฝ” ๋„ค์˜ค 2, VIVE ํฌ์ปค์Šค ํ”Œ๋Ÿฌ์Šค ์žฅ์น˜๋ฅผ ํฌํ•จํ•˜์—ฌ 2020๋…„ ์ด์ „์— ์ถœ์‹œ๋œ ๋…๋ฆฝํ˜• VR ํ—ค๋“œ์…‹์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ์ œ์กฐ์‚ฌ์˜ ์ง€์›์ด ๊ณ„์† ์ฒ ํšŒ๋˜๊ณ  ํ˜„๋Œ€ VR์˜ ์ˆ˜์š”๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ๊ณ„์†ํ•ด์„œ ์ฐธ์—ฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์•ˆ์ •์„ฑ์ด๋‚˜ ์„ฑ๋Šฅ์€ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

Release v3.2.1

์ˆ˜์ •์‚ฌํ•ญ

*๋กœ๊ทธ์ธ*

- PC ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์งํ›„์— ๋‹ค๋ฅธ ์žฅ์น˜์— ๋กœ๊ทธ์ธํ–ˆ๋‹ค๋Š” ์ž˜๋ชป๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋กœ๊ทธ์•„์›ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

- ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ VIVE ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'๋ฉ”ํƒ€๋ฒ„์Šค > Engage VR' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Engage VR] Release v3.1  (0) 2022.12.03
[Engage VR] Release v3.0  (0) 2022.10.30
728x90

์›๋ณธ - https://learnopengl.com/Getting-started/Creating-a-window

 

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

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

์ฆ‰, ์ฐฝ์„ ๋งŒ๋“ค๊ณ , ์ปจํ…์ŠคํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋‹คํ–‰ํžˆ๋„, ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฝค ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŠนํžˆ OpenGL์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

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

GLUT, SDL, SFML, GLFW ๋“ฑ์ด ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

LearnOpenGL์—์„œ๋Š” GLFW๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์„ค์ •์€ GLFW์˜ ์„ค์ •๊ณผ ์œ ์‚ฌํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

 

GLFW

GLFW๋Š” C๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํŠนํžˆ OpenGL์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

GLFW๋Š” ํ™”๋ฉด์— ์ƒํ’ˆ์„ ๋ Œ๋”๋งํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ํ•„์ˆ˜ํ’ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

 

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

์ด ์ฐฝ์—์„œ๋Š” GLFW ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰, ๊ตฌ์ถ• ๋ฐ ์—ฐ๊ฒฐํ•˜๋Š” ๋‹จ๊ณ„๋ณ„ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์—์„œ๋Š” Microsoft Visual Studio 2019 IDE๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(๋” ์ตœ์‹  Visual Studio ๋ฒ„์ „์—์„œ๋„ ํ”„๋กœ์„ธ์Šค๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค).

Visual Studio(๋˜๋Š” ์ด์ „ ๋ฒ„์ „)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ IDE์—์„œ๋„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

GLFW ๋นŒ๋“œํ•˜๊ธฐ

GLFW๋Š” ์›น ํŽ˜์ด์ง€์˜ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GLFW๋Š” ์ด๋ฏธ 2019๋…„๊นŒ์ง€ Visual Studio 2012์šฉ์œผ๋กœ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ์ด์ง„ํŒŒ์ผ๊ณผ ํ—ค๋” ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ์™„์ „์„ฑ์„ ์œ„ํ•ด ์†Œ์Šค ์ฝ”๋“œ์—์„œ GLFW๋ฅผ ์ง์ ‘ ์ปดํŒŒ์ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•œ ๋Š๋‚Œ์„ ์ฃผ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†Œ์Šค ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1
๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ 64๋น„ํŠธ ์ด์ง„ ํŒŒ์ผ๋กœ ๋งŒ๋“ค ์˜ˆ์ •์ด๋ฏ€๋กœ ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ ์ด์ง„ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ 64๋น„ํŠธ ์ด์ง„ ํŒŒ์ผ์„
๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค.
cs

 

์†Œ์Šค ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ์••์ถœ์„ ํ’€๊ณ  ๋‚ด์šฉ์„ ์—ฝ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ’ˆ๋ชฉ์—๋งŒ ์ง‘์ค‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ปดํŒŒ์ผ์˜ ๊ฒฐ๊ณผ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • include ํด๋”

์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ๊ฒฐ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ CPU/OS์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์ถคํ™”๋˜์–ด ๊ณ ๊ธ‰ ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(์‹œ์Šคํ…œ์—์„œ ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ).

๊ทธ๋Ÿฌ๋‚˜ ์˜คํ”ˆ ์›”๋“œ์— ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•  ๋•Œ์˜ ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ž์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ IDE ๋˜๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ œ๊ณต๋œ ํ”„๋กœ์ ํŠธ/์†”๋ฃจ์…˜ ํŒŒ์ผ์ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์„ค์ •๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” ์ง€์ •๋œ .c .cpp ๋ฐ .h .hpp ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ๋งŒ์˜ ํ”„๋กœ์ ํŠธ/์†”๋ฃจ์…˜์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋ฒˆ๊ฑฐ๋Ÿฌ์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Cmake๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

CMake

CMake๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ CMake ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ ๋ชจ์Œ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ํ”„๋กœ์ ํŠธ/์†”๋ฃจ์…˜ ํŒŒ์ผ(์˜ˆ: Visual Studio, ์ฝ”๋“œ::๋ธ”๋Ÿญ, Eclipse)์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” GLFW์˜ ์†Œ์Šค ํŒจํ‚ค์ง€์—์„œ Visual Studio 2019 ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” CMake๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

CMake๊ฐ€ ์„ค์น˜๋˜๋ฉด ๋ช…๋ น์ค„ ๋˜๋Š” GUI๋ฅผ ํ†ตํ•ด  CMake๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๋ณต์žกํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— GUI๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

CMake์—๋Š” ์ด์ง„ ํŒŒ์ผ์— ๋Œ€ํ•œ ์†Œ์Šค ์ฝ”๋“œ ํด๋”์™€ ๋Œ€์ƒ ํด๋”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ ํด๋”์˜ ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œํ•œ GLFW ์†Œ์Šค ํŒจํ‚ค์ง€์˜ ๋ฃจํŠธ ํด๋”๋ฅผ ์„ ํƒํ•˜๊ณ  ๋นŒ๋“œ ํด๋”์˜ ๊ฒฝ์šฐ ์ƒˆ ๋””๋ ‰ํ† ๋ฆฌ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

 

์†Œ์Šค ๋ฐ ๋Œ€์ƒ ํด๋”๋ฅผ ์„ค์ •ํ–ˆ์œผ๋ฉด ๊ตฌ์„ฑ ๋‹จ์ถ”๋ฅผ ํด๋ฆญํ•˜์—ฌ CMake๊ฐ€ ํ•„์š”ํ•œ ์„ค์ •๊ณผ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์˜ ์ƒ์„ฑ์ž๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฉฐ Visual Studio 2019๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Visual Studio 16 ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(Visual Studio 2019๋Š” Visual Studio 16์œผ๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค).

๊ทธ๋Ÿฐ ๋‹ค์Œ CMake๋Š” ๊ฒฐ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ ์˜ต์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ํด๋ฆญํ•˜์—ฌ ์„ค์ •์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์…‹ํŒ…์ด ์„ค์ •๋˜๋ฉด ์ƒ์„ฑ์„ ํด๋ฆญํ•˜๋ฉด ๊ฒฐ๊ณผ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ๋นŒ๋“œ ํด๋”์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

Compilation(๋ชจ์Œ์ง‘)

๋นŒ๋“œ ํด๋”์—์„œ GLFW.sin ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ Visual Studio 2019์—์„œ ์—ฝ๋‹ˆ๋‹ค.

CMake๋Š” ์ด๋ฏธ ์ ์ ˆํ•œ ๊ตฌ์„ฑ ์„ค์ •์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์†”๋ฃจ์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

CMake๋Š” 64๋น„ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋„๋ก ์†”๋ฃจ์…˜์„ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ–ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋นŒ๋“œ ์†”๋ฃจ์…˜์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด glfw3.lib๋ผ๋Š” ์ด๋ฆ„์˜ build/src/debug ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ปดํŒŒ์ผ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—๋Š” IDE๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ OpenGL ํ”„๋กœ๊ทธ๋žจ์˜ ํฌํ•จ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์—๋Š” ๋‘ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค:

 

  1. IDE/์ปดํŒŒ์ผ๋Ÿฌ์—์„œ /lib ์™€ /include ํด๋”๋ฅผ ์ฐพ์•„์„œ GLFW์˜ include ํด๋”์˜ ๋‚ด์šฉ์„ IDE์˜ /include ํด๋”์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ glfw3.lib๋ฅผ IDE์˜ /lib ํด๋”์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”์ ํ•˜๊ณ  ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ณ  IDE/์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ƒˆ๋กœ ์„ค์น˜ํ•˜๋ฉด ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ IDE/compiler ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  header files/libraries๋ฅผ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ธํŠธ๋ฅผ ์›ํ•˜๋Š” ์œ„์น˜์— ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด OpenGL ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ—ค๋” ํŒŒ์ผ์„ ๊ฐ๊ฐ ์ €์žฅํ•˜๋Š” Libs ๋ฐ Include ํด๋”๊ฐ€ ํฌํ•จ๋œ ๋‹จ์ผ ํด๋”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹จ์ผ ์œ„์น˜(์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ) ๋‚ด์— ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค IDE์— ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ํŒŒ์ผ์ด ์›ํ•˜๋Š” ์œ„์น˜์— ์ €์žฅ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ OpenGL GLFW ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ์˜ ์ฒซ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ

๋จผ์ € Visual Studio๋ฅผ ์—ด๊ณ  ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์ง€์ •๋œ ๊ฒฝ์šฐ C++๋ฅผ ์„ ํƒํ•˜๊ณ  ๋นˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•œ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค). 64๋น„ํŠธ๋กœ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์˜ˆ์ •์ด๋ฉฐ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 32๋น„ํŠธ์ด๋ฏ€๋กœ ์ƒ๋‹จ์˜ ๋””๋ฒ„๊ทธ ์˜†์— ์žˆ๋Š” ๋“œ๋กญ๋‹ค์šด์„ x86์—์„œ x64๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ตœ์ดˆ์˜ OpenGL ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ๊ณต๊ฐ„์„ ํ™•๋ณดํ•  ์ˆ˜  ์žˆ์Šต๋‹ˆ๋‹ค!

๋งํ‚น

ํ”„๋กœ์ ํŠธ๊ฐ€ GLFW๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ง์ปค ์„ค์ •์—์„œ glfw3.lib๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ง€์ •ํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” glfw3.lib๋ฅผ ์–ด๋””์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•„์ง ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋จผ์ € ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

IDE๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๊ณ  ํŒŒ์ผ์„ ํฌํ•จํ•ด์•ผ ํ•  ๋•Œ ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•˜๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜ ํƒ์ƒ‰๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์œผ๋กœ ํด๋ฆญํ•œ ๋‹ค์Œ ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด VC++ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

 

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

 

์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ๋งŒํผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ๋ถ€ํ„ฐ IDE๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ—ค๋” ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. GLFW์˜ Include ํด๋”๊ฐ€ ํฌํ•จ๋˜๋Š” ์ฆ‰์‹œ <GLFW/..>๋ฅผ ํฌํ•จํ•˜์—ฌ GLFW์˜ ๋ชจ๋“  ํ—ค๋” ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋””๋ ‰ํ† ๋ฆฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

VS๊ฐ€ ์ด์ œ ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Linker ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด GLFW๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋ง์ปค์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์ด glfw3.lib์ด๋ฏ€๋กœ ์ด๋ฅผ Additional Dependencies ํ•„๋“œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ˆ˜๋™ ๋˜๋Š” <Edit> ์˜ต์…˜ ์‚ฌ์šฉ) ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผํ•  ๋•Œ GLFW๊ฐ€ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. GLFW ์™ธ์—๋„ OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งํฌ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜์ง€๋งŒ ์šด์˜ ์ฒด์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Windows์—์„œ์˜ OpenGL

Windows์—์„œ OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ opengl32.lib๋Š” Visual Studio๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜๋Š” Microsoft SDK์™€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด ์žฅ์—์„œ๋Š” VS ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์œˆ๋„์šฐ์— ์žˆ์œผ๋ฏ€๋กœ ๋ง์ปค ์„ค์ •์— opengl32.lib๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ 64๋น„ํŠธ ๋“ฑ๊ฐ€๋Š” 32๋น„ํŠธ ๋“ฑ๊ฐ€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ opengl32.lib๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

Linux์—์„œ์˜ OpenGL

Linux ์‹œ์Šคํ…œ์—์„œ๋Š” ๋ง์ปค ์„ค์ •์— -IGL์„ ์ถ”๊ฐ€ํ•˜์—ฌ libGL.so ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ Mesa, NVidia ๋˜๋Š” AMD dev ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ GLFW ๋ฐ OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋ง์ปค ์„ค์ •์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด GLFW์˜ ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
#include <GLFW/glfw3.h>
cs
1
GCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•˜๋Š” Linux ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช…๋ น์ค„ ์˜ต์…˜์€
lglfw3 -IGL -IX11 -lpthread -IXr -IXi -ldl์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฉด
์ •์˜๋˜์ง€ ์•Š์€ ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
cs

์ด๊ฒƒ์œผ๋กœ GLFW์˜ ์„ค์ • ๋ฐ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

GLAD

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

1
2
3
4
5
6
7
// define the function's prototype
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// find the function and assign it to a function pointer
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// function can now be called as normal
unsigned int buffer;
glGenBuffers(1&buffer);
cs

์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด๊ณ  ์•„์ง ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋Ÿฌ์šด ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•˜๊ฒŒ๋„, GLAD์™€ ๊ฐ™์ด ์ธ๊ธฐ ์žˆ๊ณ  ์ตœ์‹ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

GLAD ์„ค์ •ํ•˜๊ธฐ

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

GLAD ์›น ์„œ๋น„์Šค๋กœ ์ด๋™ํ•˜์—ฌ ์–ธ์–ด๊ฐ€ C++๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  API ์„น์…˜์—์„œ 3.3์ด์ƒ์˜ OpenGL ๋ฒ„์ „์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœํŒŒ์ผ์ด Core๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  Generate a loader ์˜ต์…˜์ด ์„ ํƒ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ๋ช…์„ ๋ฌด์‹œํ•˜๊ณ  ์ƒ์„ฑ์„ ํด๋ฆญํ•˜์—ฌ ๊ฒฐ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์ฏค GLAD๋Š” ๋‘ ๊ฐœ์˜ ํฌํ•จ ํด๋”๊ฐ€ ํฌํ•จ๋œ zip ํŒŒ์ผ๊ณผ ํ•˜๋‚˜์˜ glad.c ํŒŒ์ผ์„ ์ œ๊ณตํ–ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จ ํด๋”(glad ๋ฐ KHR)๋ฅผ ๋ชจ๋‘ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณต์‚ฌํ•˜๊ณ (๋˜๋Š” ์ด ํด๋”๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค) glad.c ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์—๋Š” ํŒŒ์ผ ์œ„์— ๋‹ค์Œ ํฌํ•จ ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
#include <glad/glad.h> 
cs

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

 

 

๋ฐ˜์‘ํ˜•
728x90

์›๋ณธ - https://learnopengl.com/Getting-started/OpenGL

 

์—ฌ์ •์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋จผ์ € OpenGL์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

OpenGL์€ ์ฃผ๋กœ ๊ทธ๋ž˜ํ”ฝ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” API(Application Programming Interface)๋กœ์จ ํ›„๋ณด๋กœ ๊ฑฐ๋ก ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ OpenGL ์ž์ฒด๋Š” API๊ฐ€ ์•„๋‹ˆ๋ผ ํฌ๋กœ๋…ธ์Šค ๊ทธ๋ฃน์ด ๊ฐœ๋ฐœํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์–‘์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

 

OpenGL ์‚ฌ์–‘์€ ๊ฐ ๊ธฐ๋Šฅ์˜ ๊ฒฐ๊ณผ/์ถœ๋ ฅ๊ณผ ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๋งˆ๋ จํ•˜๋Š” ๊ฒƒ์€ ์ด ์‚ฌ์–‘์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋‹ฌ๋ ค์žˆ์Šต๋‹ˆ๋‹ค.

OpenGL ์‚ฌ์–‘์—๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด์ด ๋‚˜์™€ ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์‹ค์ œ ๊ฐœ๋ฐœ๋œ OpenGL ๋ฒ„์ „์€ ๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์–‘๊ณผ ์ผ์น˜ํ•˜๋Š” ํ•œ(๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋™์ผํ•œ) ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์‹ค์ œ OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋Œ€๊ฐœ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ ์ œ์กฐ์—…์ฒด์ž…๋‹ˆ๋‹ค.

๊ตฌ์ž…ํ•œ ๊ฐ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋Š” ํ•ด๋‹น ์นด๋“œ์šฉ ํŠน๋ณ„ํžˆ ๊ฐœ๋ฐœ๋œ OpenGL ๋ฒ„์ „์ธ ํŠน์ • OpenGL ๋ฒ„์ „์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Apple ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ๋•Œ OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Apple์ด ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ฉฐ Linux ์•„๋ž˜์—๋Š” ๊ทธ๋ž˜ํ”ฝ ๊ณต๊ธ‰์—…์ฒด์˜ ๋ฒ„์ „๊ณผ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์• ํ˜ธ๊ฐ€์˜ ์ ์‘์ด ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

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

 

Khronos๋Š” ๋ชจ๋“  OpenGL ๋ฒ„์ „์— ๋Œ€ํ•œ ๋ชจ๋“  ์‚ฌ์–‘ ๋ฌธ์„œ๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ๋…์ž๋Š” ์—ฌ๊ธฐ์—์„œ ๋ฒ„์ „ 3.3์˜ OpenGL ์‚ฌ์–‘(์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๋ฒ„์ „)์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ์–‘์€ OpenGL์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์ข‹์€ ์ฝ์„๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค(๊ตฌํ˜„์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค).

๋˜ํ•œ ์‚ฌ์–‘์€ ๊ธฐ๋Šฅ์˜ ์ •ํ™•ํ•œ ์ž‘๋™์„ ์ฐพ๋Š”๋ฐ ์œ ์šฉํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

์ฝ”์–ด ํ”„๋กœํŒŒ์ผ vs ์ฆ‰์‹œ ๋ชจ๋“œ(๊ณ ์ • ํ•จ์ˆ˜ ํŒŒ์ดํ”„๋ผ์ธ)

์˜›๋‚ ์—๋Š” OpenGL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ž˜ํ”ฝ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ธ ์ฆ‰์‹œ ๋ชจ๋“œ(๊ณ ์ • ํ•จ์ˆ˜ ํŒŒ์ดํ”„๋ผ์ธ์ด๋ผ๊ณ ๋„ ํ•จ)๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

OpenGL์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์— ์ˆจ๊ฒจ์ ธ ์žˆ์—ˆ๊ณ  ๊ฐœ๋ฐœ์ž๋“ค์€ OpenGL์ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ํฌ๊ฒŒ ํ†ต์ œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฒฐ๊ตญ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์›ํ–ˆ๊ณ , ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์‚ฌ์–‘์ด ๋” ์œ ์—ฐํ•ด์กŒ๊ณ , ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ทธ๋“ค์˜ ๊ทธ๋ž˜ํ”ฝ์„ ๋” ๋งŽ์ด ํ†ต์ œํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์ • ํ•จ์ˆ˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ๋˜ํ•œ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

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

์ด ๋ชจ๋“œ๋Š” ์˜ค๋ž˜๋œ ๋ชจ๋“  ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•œ OpenGL์˜ ์‚ฌ์–‘์˜ ํ•œ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

 

OpenGL์˜ ํ•ต์‹ฌ ํ”„๋กœํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ๋•Œ OpenGL์€ ํ˜„๋Œ€์  ๊ด€ํ–‰์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•ฉ๋‹ˆ๋‹ค.

OpenGL์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค OpenGL์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๊ทธ๋ฆฌ๊ธฐ๊ฐ€ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

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

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

ํ˜„๋Œ€์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ OpenGL๊ณผ ๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง„์ •์œผ๋กœ ์ดํ•ดํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์†Œ ์–ด๋ ต๊ธด ํ•˜์ง€๋งŒ ํ›จ์”ฌ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ๊ณผ ํšจ์œจ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ํ›จ์”ฌ ๋” ๋‚˜์€ ์ดํ•ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๊ฒƒ์€ ๋˜ํ•œ ์ด ์ฑ…์ด ํ•ต์‹ฌ ํ”„๋กœํ•„ OpenGL ๋ฒ„์ „ 3.3์— ๋งž์ถฐ์ง„ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ์ด ๋” ์–ด๋ ต์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๋…ธ๋ ฅํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ˜„์žฌ OpenGL 4.6์„ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์—์„œ ์ƒ์œ„ ๋ฒ„์ „์˜ OpenGL์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenGL 4.6์ด ์ถœ์‹œ๋œ ์ƒํƒœ์—์„œ OpenGL 3.3์„ ์ œ๊ฐ€ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์€ ๋น„๊ต์  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. 3.3 ์ดํ›„ ๋ฒ„์ „์˜ ๋ชจ๋“  OpenGL์€ OpenGL์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  OpenGL์— ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฒ„์ „์€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„ ๋” ํšจ์œจ์ ์ด๊ฑฐ๋‚˜ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋“  ๊ฐœ๋…๊ณผ ๊ธฐ์ˆ ์ด ์ตœ์‹  OpenGL ๋ฒ„์ „์—์„œ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋ฏ€๋กœ OpenGL 3.3์„ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

์–ธ์ œ๋“ ์ง€ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•˜๋ฉด ์ตœ์‹  OpenGL ๋ฒ„์ „์˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

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

 

ํ™•์žฅ

OpenGL์˜ ํฐ ํŠน์ง•์€ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋Š” ํ™•์žฅ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ๊ณ ๊ธ‰ ๋˜๋Š” ํšจ์œจ์ ์ธ ๊ทธ๋ž˜ํ”ฝ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ข…์ข… ํ™•์žฅ์ด ์ธ๊ธฐ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋งค์šฐ ์œ ์šฉํ•œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— OpenGL ๋ฒ„์ „์˜ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

๊ฐœ๋ฐœ์ž๋Š” ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „(๋˜๋Š” OpenGL ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ™•์žฅ์ด ์žˆ๋Š”์ง€ ๋ฌธ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

 

1
2
3
4
5
6
7
8
if(GL_ARB_extension_name)
{
    // Do cool new and modern stuff supported by hardware
}
else
{
    // Extension not supported: do it the old way
}
 
cs

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

์ƒํƒœ ๋จธ์‹ 

OpenGL์€ ๊ทธ ์ž์ฒด๋กœ ๋Œ€๊ทœ๋ชจ ์ƒํƒœ ์‹œ์Šคํ…œ์œผ๋กœ, OpenGL์ด ํ˜„์žฌ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๋ณ€์ˆ˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

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

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

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

 

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

OpenGL์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋Œ€ํ˜• ์ƒํƒœ ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š” ํ•œ, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์€ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์˜ค๋ธŒ์ ํŠธ

OpenGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” C๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋งŽ์€ ํŒŒ์ƒ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ํ•ต์‹ฌ์ ์œผ๋กœ๋Š” C๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ์ถ”์ƒํ™” ์ค‘ ํ•˜๋‚˜๋Š” OpenGL์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

 

OpenGL์˜ ๊ฐœ์ฒด๋Š” OpenGL ์ƒํƒœ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ต์…˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋„๋ฉด ์ฐฝ์˜ ์„ค์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ์ฒด์˜ ํฌ๊ธฐ, ์ง€์›๋˜๋Š” ์ƒ‰์ƒ ์ˆ˜ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ์ฒด์˜ ํฌ๊ธฐ, ์ง€์›๋˜๋Š” ์ƒ‰์ƒ ์ˆ˜ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ์ฒด๋ฅผ C์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1
2
3
4
5
struct object_name {
    float  option1;
    int    option2;
    char[] name;
};
cs

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

 

1
2
3
4
5
6
// The State of OpenGL
struct OpenGL_Context {
      ...
      object_name* object_Window_Target;
      ...      
};
cs
1
2
3
4
5
6
7
8
9
10
// create object
unsigned int objectId = 0;
glGenObject(1&objectId);
// bind/assign object to context
glBindObject(GL_WINDOW_TARGET, objectId);
// set options of object currently bound to GL_WINDOW_TARGET
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH,  800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// set context target back to default
glBindObject(GL_WINDOW_TARGET, 0);
cs

 

์ด ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ์€ OpenGL๋กœ ์ž‘์—…ํ•  ๋•Œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค.

๋จผ์ € ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ฐธ์กฐ๋ฅผ ID๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ ๊ฐœ์ฒด์˜ ๋ฐ์ดํ„ฐ๋Š” ์”ฌ ๋’ค์— ์ €์žฅ๋จ).

๊ทธ๋Ÿผ ๋‹ค์Œ ๊ฐœ์ฒด(ID ์‚ฌ์šฉ)๋ฅผ ์ปจํ…์ŠคํŠธ์˜ ๋Œ€์ƒ ์œ„์น˜์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ฐฝ ๊ฐœ์ฒด ๋Œ€์ƒ ์œ„์น˜๋Š” GL_WINDOW_TARGET์œผ๋กœ ์ •์˜๋จ).

๋‹ค์Œ์œผ๋กœ ์ฐฝ ์˜ต์…˜์„ ์„ค์ •ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฐฝ ๋Œ€์ƒ์˜ ํ˜„์žฌ ๊ฐœ์ฒด ID๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐœ์ฒด์˜ ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •ํ•œ ์˜ต์…˜์€ objectId์—์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฐœ์ฒด์— ์ €์žฅ๋˜๊ณ  ๊ฐœ์ฒด๋ฅผ GL_WINDOW_TARGET์— ๋‹ค์‹œ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์ฆ‰์‹œ ๋ณต์›๋ฉ๋‹ˆ๋‹ค.

 

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

 

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

์˜ˆ๋ฅผ ๋“ค์–ด 3D ๋ชจ๋ธ ๋ฐ์ดํ„ฐ(์ง‘ ๋˜๋Š” ์บ๋ฆญํ„ฐ)์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐœ์ฒด ์—ญํ• ์„ ํ•˜๋Š” ๊ฐœ์ฒด๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ๋งˆ๋‹ค ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ฆด ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค(์ด๋Ÿฌํ•œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์˜ต์…˜์„ ๋จผ์ € ๋งŒ๋“ค๊ณ  ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค).

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

 

์‹œ์ž‘ํ•˜์ž

์ด์ œ OpenGL์˜ ์‚ฌ์–‘๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, OpenGL์ด ํ›„๋“œ ์•„๋ž˜์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  OpenGL์ด ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ง€์ • ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋”๋ผ๋„ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด ์ฑ…์—์„œ๋Š” ๊ฐ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด OpenGL์„ ์ œ๋Œ€๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์˜ˆ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€ ์ž๋ฃŒ๋“ค

  • opengl.org : OpenGL์˜ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.
  • OpenGL registry : ๋ชจ๋“  OpenGL ๋ฒ„์ „์— ๋Œ€ํ•œ OpenGL ์‚ฌ์–‘ ๋ฐ ํ™•์žฅ์„ ํ˜ธ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•
728x90

์›๋ณธ ํŽ˜์ด์ง€ - https://learnopengl.com/Introduction

 

๋‹น์‹ ์ด ์ด ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์€ ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์˜ ๋‚ด์ ์ธ ์ž‘์šฉ์„ ๋ฐฐ์šฐ๊ณ  ๋ฉ‹์ง„ ์ด๋“ค์ด ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ˜ผ์ž์„œ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค.

ํ˜ผ์ž์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์žฌ๋ฏธ์žˆ๊ณ , ์ง€๋žต์ด ํ’๋ถ€ํ•˜๋ฉฐ, ๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ํฐ ์ดํ•ด๋ฅผ ์ค€๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ „์ œ์กฐ๊ฑด

OpenGL์€ ์ž์ฒด ํ”Œ๋žซํผ์ด ์•„๋‹Œ ๊ทธ๋ž˜ํ”ฝ API์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์„ ํƒ ์–ธ์–ด๋Š” C++์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์žฅ๋“ค์„ ์œ„ํ•ด์„œ๋Š” C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ณ ๊ธ‰ C++ ์ฃผ์ œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ C++ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋  ํ•„์š”๋Š” ์—†์ง€๋งŒ "Hello World" ํ”„๋กœ๊ทธ๋žจ ์ด์ƒ์˜ ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

C++์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š๋‹ค๋ฉด www.learncpp.com  ์—์„œ ๋ฌด๋ฃŒ ํŠœํ† ๋ฆฌ์–ผ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ, ๋„์ค‘์— ์ˆ˜ํ•™ (์„ ํ˜• ๋Œ€์ˆ˜ํ•™, ๊ธฐํ•˜ํ•™, ์‚ผ๊ฐ๋ฒ•)์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ณ  ํ•„์š”ํ•œ ์ˆ˜ํ•™์˜ ๋ชจ๋“  ํ•„์ˆ˜ ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ €๋Š” ์ˆ˜ํ•™์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ค๋ช…์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋”๋ผ๋„ ๋ถˆ์™„์ „ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ž๋ฃŒ๋ฅผ ๋ณด๋‹ค ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์ž๋ฃŒ์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

OpenGl๋กœ์˜ ์—ฌ์ •์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์ˆ˜ํ•™์  ์ง€์‹์— ๋Œ€ํ•ด ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๊ฑฐ์˜ ๋ชจ๋“  ๊ฐœ๋…์€ ๊ธฐ๋ณธ์ ์ธ ์ˆ˜ํ•™์  ๋ฐฐ๊ฒฝ์œผ๋กœ ํžˆ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ์ˆ˜ํ•™์„ ์ตœ์†Œํ™”ํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š” ํ•œ ๋ชจ๋“  ์ˆ˜ํ•™์„ ์ดํ•ดํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

 

๊ตฌ์กฐ

Learn OpenGL์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ผ๋ฐ˜์ ์ธ ์„น์…˜์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

๊ฐ ์„น์…˜์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋…์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ์—ฌ๋Ÿฌ ์žฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์žฅ์€ ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋…๋“ค์€ ์„ ํ˜•์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋ฅด์ณ์ง€๋ฉฐ(๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ง€์‹œ๊ฐ€ ์—†๋Š” ํ•œ ์œ„์—์„œ ์•„๋ž˜๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค) ๊ฐ ์žฅ์—์„œ ๋ฐฐ๊ฒฝ ์ด๋ก ๊ณผ ์‹ค์ œ์ ์ธ ์ธก๋ฉด์„ ์„ค๋ช…ํ•œ๋‹ค.

 

๊ฐœ๋…์„ ๋” ์‰ฝ๊ฒŒ ๋”ฐ๋ฅด๊ณ  ์ถ”๊ฐ€๋œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ฑ…์—๋Š” ์ƒ์ž, ์ฝ”๋“œ ๋ธ”๋ก, ์ƒ‰์ƒ ํžŒํŠธ ๋ฐ ๊ธฐ๋Šฅ ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ•์Šค

1
์ดˆ๋ก์ƒ‰ ๋ฐ•์Šค ์ƒ์ž์—๋Š” OpenGL ๋˜๋Š” ๋‹น๋ฉดํ•œ ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ ๋˜๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ/ํžŒํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด
์žˆ์Šต๋‹ˆ๋‹ค.
cs
1
๋นจ๊ฐ„ ๋ฐ•์Šค ์ƒ์ž์—๋Š” ๊ฒฝ๊ณ  ๋˜๋Š” ๊ธฐํƒ€ ์ฃผ์˜ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
cs

์ฝ”๋“œ

์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ๋ฌธ์ด ๊ฐ•์กฐ๋œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์–ด๋‘์šด ํšŒ์ƒ‰ ์ƒ์ž์— ์žˆ๋Š” ์ˆ˜๋งŽ์€ ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ์„ ์›น ์‚ฌ์ดํŠธ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค;

1
// ์ด ๋ฐ•์Šค๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
cs

์ด๊ฒƒ๋“ค์€ ์ฝ”๋“œ ์กฐ๊ฐ๋งŒ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š”ํ•˜๋‹ค๋ฉด ์ฃผ์–ด์ง„ ์ฃผ์ œ์— ํ•„์š”ํ•œ ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒ‰์ƒ ํžŒํŠธ

์ผ๋ถ€ ๋‹จ์–ด๋Š” ๋‹ค๋ฅธ ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์ด ๋‹จ์–ด๋“ค์ด ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์˜ : ๋…น์ƒ‰ ๋‹จ์–ด๋Š” ์ •์˜, ์ฆ‰ ๋” ์ž์ฃผ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์˜ ์ค‘์š”ํ•œ ์ธก๋ฉด/์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ : ๋นจ๊ฐ„์ƒ‰ ๋‹จ์–ด๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„ ๋˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜ :  ํŒŒ๋ž€์ƒ‰ ๋‹จ์–ด๋Š” ๋ชจ๋“  OpenGL ์ƒ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

OpenGL ํ•จ์ˆ˜ ์ฐธ์กฐ

ํŠนํžˆ LearnOpenGl์˜ ๊ธฐ๋Šฅ์€ ์ฝ˜ํ…์ธ ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ OpenGL์˜ ๊ธฐ๋Šฅ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์›น์‚ฌ์ดํŠธ์— ๋ฌธ์„œํ™”๋œ ์ฝ˜ํ…์ธ ์—์„œ ๊ธฐ๋Šฅ์„ ๋ฐœ๊ฒฌ๋  ๋•Œ๋งˆ๋‹ค, ๊ทธ ๊ธฐ๋Šฅ์€ ์•ฝ๊ฐ„ ๋ˆˆ์— ๋„๋Š” ๋ฐ‘์ค„๊ณผ ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค๋ฅผ ๊ธฐ๋Šฅ ์œ„์— ์˜ฌ๋ ค๋†“์œผ๋ฉด ์ž ์‹œ ํ›„ ํŒ์—… ์ฐฝ์— ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ๊ฐœ์š”๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค๋ฅผ glEnable ์œ„์— ์˜ฌ๋ ค ๋†“์œผ๋ฉด ๋™์ž‘์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‹œ์ž‘ ์„น์…˜์œผ๋กœ ์ด๋™ํ•˜์—ฌ OpenGL ์—ฌ์ •์„ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค!

๋ฐ˜์‘ํ˜•
728x90

Release v3.1

2022๋…„ 11์›” ๋‘˜์งธ์ฃผ

 

์ถ”๊ฐ€

*์ด๋ชจ์ง€*

- ์‚ฌ์šฉ์ž๊ฐ€ ์„ธ์…˜ ๋‚ด ๋ฉ”๋‰ด ๋˜๋Š” VR ์†๋ชฉ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ชจํ‹ฐ์ฝ˜์„ ์„ ํƒํ•˜์—ฌ ๋ฐ˜์‘์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Œ

*๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜*

- ์ŠคํŽ˜์ธ ์–ธ์–ด๋ฅผ ์ง€์›ํ•จ

*ENGAGE LINK*

- ์ค‘์•™๊ด‘์žฅ ํ—ฌํ”„๋ฐ์Šคํฌ์— ํ˜ธ์ถœ๋ฒจ์„ ์ถ”๊ฐ€ํ•ด ๊ณต๊ฐ„์— ์ง€์›์š”์›์ด ์—†์–ด๋„ ์ด์šฉ์ž๊ฐ€ ๋„์›€์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

 

๊ฐœ์„ ์‚ฌํ•ญ

*์•„๋ฐ”ํƒ€*

- ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์•„๋ฐ”ํƒ€๊ฐ€ ์™„์ „ํžˆ ๋‹ค์šด๋กœ๋“œ ๋ ๋•Œ๊นŒ์ง€ ์ž๋ฆฌ ํ‘œ์‹œ์ž ์•„๋ฐ”ํƒ€๋ฅผ ๊ตฌํ˜„ํ•จ

*๋กœ๋”ฉ ์”ฌ*

- ์‚ฌ์šฉ์ž๊ฐ€ ์œ„์น˜๋ฅผ ์ „ํ™˜ํ•  ๋•Œ ์žฌ์ƒ๋˜๋Š” ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ต์ฒดํ•˜์—ฌ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ ๋”์šฑ ํŽธ์•ˆํ•˜๊ฒŒ ๋งŒ๋“ฌ

*์ด๋ฉ”์ผ*

- ์‚ฌ์šฉ์ž์˜ ์ „์ž ๋ฉ”์ผ ์ฃผ์†Œ ํ™•์ธ ์š”์ฒญ ๋ฐ ์ด๋ฒคํŠธ ๋“ฑ๋ก ํ™•์ธ๊ณผ ๊ฐ™์€ ์•Œ๋ฆผ ์ „์ž ๋ฉ”์ผ์— ํฌํ•จ๋œ ๋งํฌ ๋ฐ ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ

*์›€์ง์ž„*

- VR ๊ธฐ๊ธฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์ด๋™ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ ํŒ์—…์„ ํ†ตํ•ด ์ž์œ ๋กœ์šด ์ด๋™์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•จ

*๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ*

- ํ”Œ๋žซํผ์˜ ์•ˆ์ •์„ฑ์— ๋„์›€์ด ๋˜๋Š” ์ค‘์š”ํ•œ ์—…๋ฐ์ดํŠธ ๋ฐ ๊ฐœ์„ ์‚ฌํ•ญ์„ ์ ์šฉํ•จ

 

์ˆ˜์ •์‚ฌํ•ญ

*์•„๋ฐ”ํƒ€*

- ์ „์ฒด ๋™์ž‘ ์ถ”์ ์„ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๊นจ ์œ„์น˜๋ฅผ ์ˆ˜์ •ํ•จ

- ๊ธฐ๋ณธ ์•„๋ฐ”ํƒ€์™€ ์ „์‹  ์•„๋ฐ”ํƒ€๋ฅผ ์ „ํ™˜ํ•  ๋•Œ ์•„๋ฐ”ํƒ€์˜ ๋จธ๋ฆฌ ํšŒ์ „์ด ์‹ฌํ•˜๊ฒŒ ๊บฝ์ด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- ๋นจ๊ฐ„์ƒ‰ ํ…์ŠคํŠธ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ถ€์žฌ์ค‘ ์•Œ๋ฆผ์„ ์ˆ˜์ •ํ•จ

- ์‚ฌ์šฉ์ž์˜ ๋‚ด ์–ผ๊ตด ์ปฌ๋ ‰์…˜๊ณผ ํ• ๋‹น๋œ ์ด๋ฆ„์ด ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์„ ์ˆœํ™˜ํ•  ๋•Œ ์•„๋ฐ”ํƒ€ ํŽธ์ง‘๊ธฐ์— ๋‚ด ์–ผ๊ตด์ด ์ž˜๋ชป ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*์•Œ๋ฆผ*

- ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ธ์ถœ, ์ฐฉ์„ ๋˜๋Š” ๋…น์Œ๋˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋””์˜ค ์นด์šดํŠธ๋‹ค์šด์„ ๋ณต์›ํ•จ

*์˜๊ตฌ ์„ธ์…˜*

- ์ตœ๋Œ€ ์˜๊ตฌ ์„ธ์…˜ ํ• ๋‹น๋Ÿ‰์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๋ฃน์˜ ์˜๊ตฌ ์„ธ์…˜ ์ค‘ ํ•˜๋‚˜์— ๊ฐ€์ž…ํ•  ์ˆ˜  ์—†๋„๋ก ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- ์‚ฌ์šฉ์ž๊ฐ€ ์˜๊ตฌ ์„ธ์…˜์— ๊ฐ€์ž…ํ•  ๋•Œ๊นŒ์ง€ ์˜๊ตฌ ์„ธ์…˜์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*๋‚ด์šฉ ํŽธ์ง‘๊ธฐ*

- ๋‚ด์šฉ ํŽธ์ง‘๊ธฐ๋ฅผ ๋‚˜๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ์ž…๋ ฅํ•˜๋ฉด ํŒŒ์ผ ์ด๋ฆ„ ๋ฐ ์žฅ๋ฉด ์ œ๋ชฉ๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žฌ์„ค์ •๋จ

- ์ฝ˜ํ…์ธ  ํŽธ์ง‘๊ธฐ์— ์žˆ๋Š” ๋™์•ˆ ์ง€์›๋˜๋Š” ์œ„์น˜์—์„œ ๊ณ ํ•ด์ƒ๋„ ๋น„๋””์˜ค๋ฅผ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ

*ENGAGE LINK*

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

*์žฅ์น˜ ์ •๋ณด*

- ์‚ฌ์šฉ์ž ํŽ˜์ด์ง€์—์„œ ํƒ์ง€๋œ Steam PC VR ์žฅ์น˜ ๋ชฉ๋ก์ด ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ ๊ตฌํ˜„

*๋ฏธ๋””์–ด ๊ณต์œ *

- ๋ฏธ๋””์–ด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋™์•ˆ ํฌํ„ธ์„ ํ†ตํ•ด ์ด๋™ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€์ƒ์—์„œ ๋ฏธ๋””์–ด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- 3D ํฌ๋กœ๋งˆํ‚ค ๋น„๋””์˜ค์˜ ๋ชจ์–‘์„ ๊ณ ์นจ

- ์›น ๋งํฌ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋˜๋Š” ํŒŒ์›Œํฌ์ธํŠธ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ํ‘œ์‹œ์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋…๋ฆฝํ˜• VR ์žฅ์น˜์˜ ๋ชจ๋ฐ”์ผ ์›น ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์„ ๋ณต์›ํ•จ

*LITE ์œ ์ €*

- ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์„ธ์…˜์— ๊ฐ€์ž…ํ•  ๋•Œ ์ผ์‹œ์ ์œผ๋กœ LITE ์‚ฌ์šฉ์ž๋กœ ์‹๋ณ„๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*๋ชจ๋“  VR ์žฅ์น˜*

- ์„ธ์…˜์„ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ํฌํ„ธ์— ๋“ค์–ด๊ฐˆ ๋•Œ ๊ฒ€์€์ƒ‰์œผ๋กœ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€๋„๋ก ์ „ํ™˜์„ ์ˆ˜์ •ํ•จ

*PC VR ์žฅ์น˜*

- ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ˆˆ์˜ ๋ณด๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ์ŠคํŒ€ VR ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ตฌํ˜„ํ•จ

*VIVE ์žฅ์น˜*

- ์„ธ์…˜์—์„œ ๋น„๋””์˜ค๋ฅผ ์žฌ์ƒํ•  ๋•Œ VIVE Focus Plus ํ—ค๋“œ์…‹์ด ์ถฉ๋Œํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜*

- ์„ธ์…˜ ๋‚ด ๋ฉ”๋‰ด์˜ ์‚ฌ์šฉ์ž ํŽ˜์ด์ง€์—์„œ ์ •๋ ฌ ์˜ต์…˜์— ๋Œ€ํ•œ ๋„๊ตฌ ์„ค๋ช…์˜ ๋ชจ์–‘์„ ์ˆ˜์ •ํ•จ

- UI์— ๋ˆ„๋ฝ๋œ ํ˜„์ง€ํ™” ๋ฌธ์ž์—ด์ด ์ถ”๊ฐ€๋จ

- ์ง€์—ญํ™”๋œ ๊ธด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ณต๊ฐ„์— ๋Œ€ํ•ด ENGAGE LINK ๋งต์˜ ๋ ˆ์ด๋ธ” ๋ฐฐ์น˜๋ฅผ ์ˆ˜์ •ํ•จ

*์ด๋ฒคํŠธ*

- ์ด์ „ ์š”์ฒญ์ด ํ—ˆ์šฉ๋œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์ œ๊ฑฐ๋จ

 

Release v3.1.1

2022๋…„ 11์›” ๋‘˜์งธ์ฃผ

 

์ˆ˜์ •์‚ฌํ•ญ

*์ด๋ชจ์ง€*

- ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ด๋ฒคํŠธ์—์„œ ์ด๋ชจ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ์Œ

*๋ฏธ๋””์–ด ๊ณต์œ *

- URL ๋ฆฌ๋””๋ ‰์…˜์—์„œ ๋กœ๋“œ๋œ ๋น„๋””์˜ค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ๋ช‡ ์ดˆ ์ „์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์žฌ์ƒ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

*์Œ์„ฑ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜*

- ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ด๋ฒคํŠธ์— ์ž˜๋ชป๋œ VoIP ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ์Œ์†Œ๊ฑฐ ์ƒํƒœ๋กœ ์ž ๊ทธ์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜*

- UI์— ๋ˆ„๋ฝ๋œ ํ˜„์ง€ํ™” ๋ฌธ์ž์—ด์ด ์ถ”๊ฐ€๋จ

 

๋ฐ˜์‘ํ˜•

'๋ฉ”ํƒ€๋ฒ„์Šค > Engage VR' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Engage VR] Release v3.2  (0) 2023.02.25
[Engage VR] Release v3.0  (0) 2022.10.30
728x90

์›๋ฌธ :https://learn.microsoft.com/en-us/windows/mixed-reality/altspace-vr/world-building/world-building-getting-started

1. ์›”๋“œ ์ƒ์„ฑ ์‹œ์ž‘ํ•˜๊ธฐ

*๋‚˜๋งŒ์˜ ์ƒˆ๋กœ์šด AltspaceVR ์›”๋“œ ๋งŒ๋“ค๊ธฐ*

์ด ๊ฐ€์ด๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ Altspace VR World๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค!

์•„๋ž˜ ์ง€์นจ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋“œ์…‹์˜ Altspace VR ์•ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1) AltspaceVR ์›น์‚ฌ์ดํŠธ์—์„œ ์›”๋“œ ์ƒ์„ฑํ•˜๊ธฐ

1. ๋ฌด๋ฃŒ Altspace VR ๊ณ„์ •์„ ์•„์ง ๋“ฑ๋กํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ€์ž…ํ•ฉ๋‹ˆ๋‹ค.

2. Altspace VR์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ํŠœํ† ๋ฆฌ์–ผ์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐํ•˜๋ ค๋ฉด Altspace VR ์•ฑ์„ ์—ด๊ณ  ๋ฉ”์ธ ํ™”๋ฉด์—์„œ Tutorials๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

3. Altspace VR ์•ฑ์—์„œ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ๊ฐ€์„œ Main Menu๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

4. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‹จ์˜ Settings ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

5. General ํƒญ์˜ Enable Worlds Beta ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค๋ฉด ํ•˜๋‹จ์˜ ๋ฉ”๋‰ด์—์„œ WORLDS๋ผ๋Š” ์•„์ด์ฝ˜ ๋ฐ”๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  My Worlds ์˜ต์…˜์ด AltspaceVR ์›น์‚ฌ์ดํŠธ์—์„œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

6.  https://altvr.com/ ๋กœ ๋“ค์–ด๊ฐ€์„œ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

7. ์ƒ๋‹จ์˜ ๋ฉ”๋‰ด ๋ฐ”์—์„œ More ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„์— Worlds ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

8. Worlds ๋ฉ”๋‰ด ๋ฐ”์—์„œ My Worlds๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

9. Create Universe ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

10. Create Universe ํ™”๋ฉด์—์„œ ๋‹น์‹ ์˜ ์„ธ๊ณ„์˜ ์ด๋ฆ„๊ณผ ์„ค๋ช…์„ ์ ์Šต๋‹ˆ๋‹ค.

11. ์›”๋“œ์— ์†Œ์œ ์ž๋งŒ ์ฐธ์—ฌํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด Private ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

12. Choose File ๋ฒ„ํŠผ์„ ํ†ตํ•ด Image๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ์›น์‚ฌ์ดํŠธ์™€ VR์—์„œ ์„ธ๊ณ„๋ฅผ ํ™๋ณดํ•˜๋Š”๋ฐ ์“ฐ์—ฌ์ง‘๋‹ˆ๋‹ค.

13. Profile Image์— ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ์›น์‚ฌ์ดํŠธ์™€ VR์—์„œ ์„ธ๊ณ„๋ฅผ ํ™๋ณดํ•˜๋Š”๋ฐ ์“ฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Universe Page์— Image๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

14. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ํ…์ŠคํŠธ ์ƒ์ž๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค : ์œ ํŠœ๋ธŒ ๋น„๋””์˜ค ์•„์ด๋””, ํŠธ์œ„ํ„ฐ Handle, ํƒœ๊ทธ

15. Create Universe ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

์„ธ๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋‚˜์„œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์™ผ์ชฝ ์•„๋ž˜์— ๋‹ค์Œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์„ธ๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•จ)

16. Create World ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

17. World์˜ ์ด๋ฆ„๊ณผ ์„ค๋ช…์„ ์ ์Šต๋‹ˆ๋‹ค.

18. Privacy Setting์— ๋”ฐ๋ผ Private ๋‚˜ Unlisted๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

*์ฃผ์˜*
์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๊ฐœ์ธ ์„ธ๊ณ„๋Š” ์†Œ์œ ์ž ๋˜๋Š” Universe ๊ด€๋ฆฌ์ž๋งŒ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชฉ๋ก์— ์—†๋Š” ์„ธ๊ณ„๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ UI์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ช…์‹œ์ ์ธ ์ดˆ๋Œ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ๋ชจ๋‘ ์„ ํƒํ•˜์ง€ ์•Š์œผ๋ฉด ์„ธ๊ณ„๊ฐ€ ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค.
๊ณต์šฉ ์›”๋“œ๋Š” ์›”๋“œ ๋ฉ”๋‰ด์™€ ์นœ๊ตฌ ๋ชฉ๋ก์—์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

19. ์›ํ•œ๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ํ…์ŠคํŠธ ์ƒ์ž์™€ ๊ณ ๊ธ‰ ์˜ต์…˜์„ ์ฑ„์›๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ƒํ™ฉ๋ณ„ ์—ญํ• 

๊ณ ๊ธ‰ ํฌ๋งท

20. ํ™”๋ฉด ์˜ค๋ฅธ์ชฝ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ๊ฐ€์ƒํ™” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Altspace VR์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์˜ ํ…œํ”Œ๋ฆฟ(OWNER ๋ผ๋ฒจ์ด ๋ถ™์–ด์žˆ๋Š”)๋ฅผ ๋ณด๋ ค๋ฉด ํ™”๋ฉด ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค.

21. Create World ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

์›”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์•„๋ž˜์˜ ๋ชฉ๋ก๋“ค์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ENTER NOW ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ

- ์ฐฝ ์™ผ์ชฝ ์•„๋ž˜์— ์žˆ๋Š” ์›”๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

- POST MESSAGE ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Œ

- ๋ชจ๋“  custom ์›”๋“œ๋ฅผ ๋ณด๋ ค๋ฉด Universe ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€์•ผํ•˜๋Š”๋ฐ ๊ทธ ๋•Œ Universe ์ด๋ฆ„์„ ํด๋ฆญํ•˜๋ฉด ๊ฐ€๋Šฅํ•จ

 

2) AltspaceVR ์•ฑ์—์„œ ์›”๋“œ ๋ณด๊ธฐ

1. Altspace VR ์•ฑ์—์„œ WORLDS ๋‹จ์ถ”๋ฅผ ํด๋ฆญํ•œ ๋‹ค์Œ ์œ„์ชฝ ๋ฉ”๋‰ด ๋ชจ์Œ์—์„œ MY WORLDS๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด FEATED WORLDS ์ฐฝ์ด ํ‘œ์‹œ๋˜๊ณ  Altspace VR ์›น์‚ฌ์ดํŠธ์—์„œ ๋งŒ๋“  ์›”๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

2. ์ž‘์„ฑํ•œ ์›”๋“œ ์œ„๋กœ ์ปค์„œ๋ฅผ ์ด๋™ํ•˜๋ฉด ENTER ๋ฐ INFO๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

INFO ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์„ธ๊ณ„์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒํ–ˆ์œผ๋ฉด Info ํ™”๋ฉด์˜ ์™ผ์ชฝ ์•„๋ž˜์— ์žˆ๋Š” ENTER ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

 

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์ฒซ ๋ฒˆ์งธ Altspace VR ์›”๋“œ, ๋‹น์‹ ๋งŒ์˜ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ์†Œ์…œ VR ๊ฒฝํ—˜์„ ๋งŒ๋“ค๊ณ  ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค! ๋ฐฐ์น˜ํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด๊ฐ€ ํฌํ•จ๋œ ํ‚คํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ World Editor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

3) ์›”๋“œ ๊ณต์œ ํ•˜๊ธฐ

1. ๊ณต์œ ํ•  ์‚ฌ๋žŒ์ด ์žˆ๋Š” ๊ณณ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  ์›”๋“œ ๋˜๋Š” ์ด๋ฒคํŠธ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด:

  โ— Altspace VR ์•ฑ์˜ ๊ธฐ๋ณธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ  ๋ฒ„ํŠผ ๋ชจ์Œ์—์„œ ๊ฒ€์ƒ‰์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  โ— ์ด๋ฒคํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  โ— ์™ผ์ชฝ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ์˜ ์„ค๋ช… ์•„๋ž˜์— ์žˆ๋Š” Enter ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

2. ์ด๋ฒคํŠธ๋ฅผ ์ž…๋ ฅํ•œ ํ›„ ์™ผ์ชฝ ํ•˜๋‹จ ๋ชจ์„œ๋ฆฌ์— ์žˆ๋Š” ๋ฉ”๋‰ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

... ๋‹จ์ถ” ํ‘œ์‹œ์ค„์—์„œ ์›”๋“œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

3. ์ƒ๋‹จ ๋ฉ”๋‰ด ๋ฐ”์—์„œ MY WORLDS๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

4. ์›”๋“œ๋ฅผ ์ฐพ์€ ๋‹ค์Œ ๊ทธ ์œ„์— ์ปค์„œ๋ฅผ ๋†“๊ณ  ์ •๋ณด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

5. ํฌํƒˆ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ Portal ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

6. ์‚ฌ์šฉ์ž๊ฐ€ ํฌํ„ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒํ‹ฐ์— ์ฐธ์—ฌํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

7. ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋ฉด ํฌํ„ธ์„ ๋‹ค์‹œ ์„ ํƒํ•˜์—ฌ ๊ท€ํ•˜์˜ ์›”๋“œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

8. ํŒŒํ‹ฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ๋ถ„์˜ ์นœ๊ตฌ๋“ค์€ ์—ฌ๋Ÿฌ๋ถ„์ด ์„ธ์ƒ์„ ๋ฐ”๊ฟ€ ๋•Œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์„ธ์ƒ์˜ ๋ณ€ํ™”๋ฅผ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐฝ์˜๋ ฅ์œผ๋กœ ๊ทธ๋“ค์„ ํ˜„ํ˜น์‹œํ‚ค์„ธ์š”.

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

2022.10.28

 

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

*๋ณดํ˜ธ์žฅ์น˜*

- ๋‘ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€๊นŒ์ด ์ ‘๊ทผํ•˜๋ฉด ์„œ๋กœ ๋ณด์ด์ง€ ์•Š๋„๋ก ๊ฐœ์ธ ๊ฒฝ๊ณ„ ์‹œ์Šคํ…œ ๊ตฌํ˜„

*ํ˜ธ์ŠคํŠธ ์ œ์–ด*

- ์„ธ์…˜์—์„œ ๊ฐœ์ธ ๊ฒฝ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ˜ธ์ŠคํŠธ์—๊ฒŒ ์ œ๊ณต

- ํ˜ธ์ŠคํŠธ์— ์ „์ฒด ๋ชธ์ฒด์™€ ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚˜๋Š” ์•„๋ฐ”ํƒ€์™€ ์ €์ „๋ ฅ ์žฅ์น˜์˜ ๊ธฐ๋ณธ ๋ชธ์ฒด์™€ ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚˜๋Š” ์•„๋ฐ”ํƒ€๋ฅผ ์„ค์ •ํ•˜๋Š” ์ œ์–ด ๊ธฐ๋Šฅ ์ œ๊ณต

- ์„ธ์…˜์—์„œ LITE ์‚ฌ์šฉ์ž๋ฅผ ์Œ์†Œ๊ฑฐํ•˜๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ

- LITE ๊ณ„์ •์„ ์‹๋ณ„ํ•˜๋Š” ์„ธ์…˜์˜ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์— ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•จ

*์ขŒ์„*

- ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ ์ขŒ์„์—์„œ ๋‹ค๋ฅธ ์ขŒ์„์œผ๋กœ ์ˆœ๊ฐ„์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

*๊ณ„์ • ๊ด€๋ฆฌ*

- ์‚ฌ์šฉ์ž๊ฐ€ Engage ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๊ณ„์ • ์‚ญ์ œ ๊ฐ€๋Šฅ

*๋ฐ์Šคํฌํ†ฑ ์žฅ์น˜*

- ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ปจํŠธ๋กค์„ ํ‘œ์‹œํ•˜๋Š” Windows ๋ฐ์Šคํฌํ†ฑ ์žฅ์น˜์— ์˜ค๋ฒ„๋ ˆ์ด ๋ฐ ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์„ ์ถ”๊ฐ€ํ•จ

*์ด๋ฒคํŠธ*

- ์ด๋ฒคํŠธ์— ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ผ€ํŒ… ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ

๋งž์ถคํ˜• ์†”๋ฃจ์…˜์€ Engage ํŒ€์„ ํ†ตํ•ด์„œ๋งŒ ์ œ๊ณต๋จ

*๋ฏธ๋””์–ด*

- 3D ํฌ๋กœ๋งˆํ‚ค ๋น„๋””์˜ค ์ง€์›์ด ์ถ”๊ฐ€๋จ

- ๊ณต์œ  ํ™”๋ฉด์„ ํ†ตํ•ด ๋กœ๋“œ๋œ ๋น„๋””์˜ค๋ฅผ ๋ฃจํ”„ํ•˜๋Š” ์˜ต์…˜ ์ถ”๊ฐ€

*UI*

- ์„ธ์…˜ ๋‚ด ๋ฉ”๋‰ด์˜ ์‚ฌ์šฉ์ž ํŽ˜์ด์ง€์— ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, ๊ฐ€์ž… ์ˆœ์„œ, ์ด๋ฆ„, ์•„๋ฐ”ํƒ€ ์œ ํ˜•, ์žฅ์น˜ ์œ ํ˜• ๋˜๋Š” ํ˜ธ์ŠคํŠธ ์ƒํƒœ๋ณ„๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ

*Meta Quest ์žฅ์น˜*

- Meta Quest Pro ํ—ค๋“œ์…‹ ์ง€์›์ด ์ถ”๊ฐ€๋จ

- Unity XR ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—…๋ฐ์ดํŠธ๋จ

- ์ง€์›์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Oculus for Business๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๋Š” ํ—ค๋“œ์…‹์šฉ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณ„๋„ ๋ฒ„์ „์„ ๋งŒ๋“ฌ

*Steam*

- ์ตœ์‹  Unity XR ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋จ

 

๊ฐœ์„ ์‚ฌํ•ญ

*์•„๋ฐ”ํƒ€*

- ์•„๋ฐ”ํƒ€์˜ ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ด

- ๋ฐ์Šคํฌํ†ฑ๊ณผ PC VR ์ด์™ธ์˜ ๊ธฐ๊ธฐ์— ๋‚˜ํƒ€๋‚˜๋Š” ์ „์‹  ์•„๋ฐ”ํƒ€์˜ ์ˆ˜๋ฅผ ์ตœ๋Œ€ 5๊ฐœ๋กœ ํ‘œ์ค€ํ™”ํ•จ

- ๊ธฐ๋ณธ ์•„๋ฐ”ํƒ€์—์„œ ํฐ์ƒ‰ ์˜ท์˜ ๋ฐ๊ธฐ๋ฅผ ๊ฐ์†Œ ์‹œํ‚ด

*์ฝ˜ํ…์ธ  ์—๋””ํ„ฐ*

- ๊ณก์„  ํŽธ์ง‘๊ธฐ์—์„œ ํ‚ค๋ฅผ ์„ ํƒํ•˜๊ณ  ์ˆซ์ž ์ž…๋ ฅ ๋ฐ ์Šคํ”ผ๋„ˆ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๋ฐ ๊ฐ’ ์†์„ฑ์„ ๋ชจ๋‘ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ

- ์›๊ณก์„  ํŽธ์ง‘๊ธฐ์—์„œ ํ‚ค๋ฅผ ์„ ํƒํ•˜๊ณ  ์ˆ˜์ง ๋˜๋Š” ์ˆ˜ํ‰ ์ถ•์œผ๋กœ๋งŒ ์ด๋™์„ ์ œํ•œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ

- ๋„ํ”„ ์‹œํŠธ ๋ฐ ์›๊ณก์„  ํŽธ์ง‘๊ธฐ์— ํ‘œ์‹œ๋œ ์‹œ๊ฐ„์„ ์ฃผ ํƒ€์ž„๋ผ์ธ๊ณผ ์ผ์น˜์‹œํ‚ด

- ์›๊ณก์„  ํŽธ์ง‘๊ธฐ์—์„œ ํŠธ๋ž™์„ ์ˆจ๊ธฐ๋Š” ์˜ต์…˜์ด ์ถ”๊ฐ€๋จ

- ๋‚ด์šฉ ํŽธ์ง‘๊ธฐ๋ฅผ ์ž‘์„ฑ ๋ฐ ํŽธ์ง‘ ํŽ˜์ด์ง€์˜ ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•จ

- ํŽ˜์ด๋“œ ์ธ ๋ฐ ํŽ˜์ด๋“œ ์•„์›ƒ ๊ธฐ๊ฐ„์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์‹œ๊ฐ„ ๊ธธ์ด๋ฅผ ์ปฌ๋Ÿฌ IFX๋กœ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ

- ํ˜„์žฌ ํ”Œ๋ ˆ์ด ํ—ค๋“œ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋„๋ก 'ํ”„๋ ˆ์ž„ ์„ ํƒ' ๊ธฐ๋Šฅ์˜ ๋™์ž‘์ด ์—…๋ฐ์ดํŠธ๋จ

- ๊ฐœ์ฒด ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘ ์œ„์น˜์— ์ถ”๊ฐ€๋œ ์ž๋™ ์ƒ์„ฑ ํ‚คํ”„๋ ˆ์ž„์„ ์ œ๊ฑฐํ•จ

- ๋…นํ™”์— ์บก์ฒ˜๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…นํ™”์— ์ ์šฉ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฃจํ”„ ์ปจํŠธ๋กค์„ ๊ตฌํ˜„ํ•จ

*์ด๋ฒคํŠธ*

- ์ฝ˜์„œํŠธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•จ(๋งž์ถคํ˜• ์†”๋ฃจ์…˜์€ Engage ํŒ€์„ ํ†ตํ•ด์„œ๋งŒ ์ œ๊ณต๋จ)

- ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ˜์„œํŠธ ์ด๋ฒคํŠธ์— ์žˆ์„ ๋•Œ ์„ธ์…˜ ๋‚ด ๋ฉ”๋‰ด์—์„œ ์ดˆ๋Œ€ ๋‹จ์ถ”๋ฅผ ์ œ๊ฑฐํ•จ

- ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋“ฑ๋ก ๋งˆ๊ฐ ๋‚ ์งœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ

- ์ด๋ฒคํŠธ ๋ชฉ๋ก ํŽ˜์ด์ง€์— ์ฝ˜์„œํŠธ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๊ฐ€์šฉ์„ฑ ํ‘œ์‹œ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งค์ง„ ๋ฐ ์ œํ•œ๋œ ๊ฐ€์šฉ์„ฑ์„ ์‹๋ณ„ํ•จ

*์œ„์น˜*

- ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ์„ธ์…˜์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์œ„์น˜๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ

*์˜ค๋””์˜ค*

- ํฌํ„ธ์„ ํ†ต๊ณผํ•  ๋•Œ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ์Œ์†Œ๊ฑฐ ์ƒํƒœ๋ฅผ ์ง€์†๋˜๋„๋ก ์„ค์ •ํ•จ

- ํ˜ธ์ŠคํŠธ๊ฐ€ ์Œ์†Œ๊ฑฐ ์ž ๊ธˆ ์ œํ•œ์„ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์Œ์†Œ๊ฑฐ๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ์•Œ๋ฆผ์ด ์ถ”๊ฐ€๋จ

*์„ธ์…˜*

- ๊ทธ๋ฃน์ด ๊ณต์šฉ ์„ธ์…˜์„ ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต์šฉ ์„ธ์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ

- ์‚ฌ์šฉ์ž๊ฐ€ ์„ธ์…˜์— ์ฐธ์—ฌํ•˜๊ฑฐ๋‚˜ ํฌํ„ธ์„ ํ†ตํ•ด ์ด๋™ํ•  ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋กœ๋”ฉ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•จ

- ์‚ฌ์šฉ์ž๊ฐ€ ํ•ญ์ƒ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜๊ตฌ ์„ธ์…˜์— ์ฐธ์—ฌํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ์„ 

*๋ฏธ๋””์–ด*

- ์ปจํŠธ๋กค์ด ํ˜ธ๋ฒ„์— ๋‚˜ํƒ€๋‚˜๋„๋ก ์„ธ์…˜ ๋‚ด ๋ฉ”๋‰ด์—์„œ ๋น„๋””์˜ค ํฌ๊ธฐ๋ฅผ ์ตœ๋Œ€ํ™”ํ•จ

- ๋น„๋””์˜ค๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ๋กœ ํ‘œ์‹œ๋˜๊ณ  16:9 ๊ฐ€๋กœ ์„ธ์œจ ๋น„์œจ ๊ณต์œ  ํ™”๋ฉด์„ ์ฑ„์šฐ๋„๋ก ๋Š˜์–ด๋‚˜์ง€ ์•Š๋„๋ก ๊ณต์œ  ๋ฏธ๋””์–ด์˜ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ๊ฐœ์„ ๋จ

*๋ฉ”๋‰ด ์Šคํฌ๋ฆฐ*

- ๋ฉ”๋‰ด ํ™”๋ฉด์„ ์žฌ์„ค๊ณ„ํ•˜๊ณ  ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•จ

*๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ*

- ํ”Œ๋žซํผ์˜ ์•ˆ์ •์„ฑ์— ๋„์›€์ด ๋˜๋Š” ์ค‘์š”ํ•œ ์—…๋ฐ์ดํŠธ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ ์šฉํ•จ

*UI*

- ํ•ญ์ƒ๋œ ์„ธ์…˜ ๋‚ด ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•จ

- ์‚ฌ์šฉ์ž ํŽ˜์ด์ง€์˜ ๊ถŒํ•œ ์•„์ด์ฝ˜์— ๋„๊ตฌ ์„ค๋ช…์ด ์ถ”๊ฐ€๋จ

- ๋‚˜์—ด๋œ ์‚ฌ์šฉ์ž์˜ ๊ฐœ๋ณ„ ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ํŽ˜์ด์ง€๋กœ ๋ฐ”๊ฟˆ

- [์‚ฌ์šฉ์ž] ํŽ˜์ด์ง€์—์„œ [์ดˆ๋Œ€] ๋‹จ์ถ”์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•จ

- ์ƒˆ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด ์ง€์นจ ํŒจ๋„์ด ์ถ”๋ผ๋จ

- ๋ฐ์Šคํฌํ†ฑ ๋ฐ VR ๊ธฐ๊ธฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ์ปค์„œ๋ฅผ ๋” ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด๋‹ค ์ •ํ™•ํ•œ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ

- ์ฝ˜ํ…์ธ  ์žฌ์ƒ ์ปจํŠธ๋กค์„ ์„ธ์…˜ ๋ฉ”๋‰ด์˜ ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•จ

 

์ˆ˜์ •์‚ฌํ•ญ

*์•„๋ฐ”ํƒ€*

- ๊ธฐ๋ณธ ์•„๋ฐ”ํƒ€์— ๋จธ๋ฆฌ๊ฐ€ ๋Œ์ถœ๋˜์ง€ ์•Š๋„๋ก ๋‚จ์„ฑ ํ—ค๋“œ ์Šค์นดํ”„(ghutrah and agal)๋ฅผ ์กฐ์ •ํ•จ

- ํŠน์ • ์˜์ƒ์œผ๋กœ ์—ฌ์„ฑ ์•„๋ฐ”ํƒ€์˜ ์–ด๊นจ์— ๋ˆˆ์— ๋ณด์ด๋Š” ์†”๊ธฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋งˆ์ด ํŽ˜์ด์Šค(My Face)๋ฅผ ์„ ํƒํ•จ

- ์•„๋ฐ”ํƒ€๊ฐ€ ํŠน์ • ์ œ์Šค์ฒ˜๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์•„๋ฐ”ํƒ€์˜ ํŒ”์ด ์ผ๋ถ€ ์˜ท์„ ํ†ตํ•ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•จ

- ์•„๋ฐ”ํƒ€์˜ ๋‹ค๋ฆฌ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ๋“œ๋ ˆ์Šค์™€ ์Šค์ปคํŠธ์˜ ์—ฌ์„ฑ ์ฐฉ์„ ์ž์„ธ๋ฅผ ๊ณ ์นจ

*์ฝ˜ํ…์ธ  ์—๋””ํ„ฐ*

- ์‚ฌ์šฉ์ž๊ฐ€ ํšจ๊ณผ ์˜ต์…˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํŽธ์ง‘ํ•  ๋•Œ ์ŠคํŽ˜์ด์Šค๋ฐ”๋ฅผ ๋ˆŒ๋Ÿฌ 3์žฌ์ƒ์„ ์‹œ์ž‘ํ• ์ˆ˜ ์—†๋„๋ก ๋ง‰์Œ

- Gizmo๋กœ ์Šค์ผ€์ผ๋ง๋œ ๊ฐ์ฒด๊ฐ€ ์ƒˆ ์Šค์ผ€์ผ์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•จ

- ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์ด๋ฆ„์ด ์‹œ๊ฐ„ ํ‘œ์‹œ ๋ง‰๋Œ€์— ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•จ

- 3D ๋ชจ๋ธ์˜ ๋ฃจํŠธ์— ํฌํ•จ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋•Œ๋ฌธ์— Content Editor์—์„œ 3D ๋ชจ๋ธ์— ์ ์šฉ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์„ธ์…˜์—์„œ ์žฌ์ƒ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- ๋„ํ”„ ์‹œํŠธ์— ์žˆ๋Š” ๋™์•ˆ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ณ„์† ์žฌ์ƒํ•˜์ง€๋งŒ ํƒ€์ž„๋ผ์ธ ์‹œ๊ฐ„ ์นด์šดํ„ฐ๊ฐ€ ์ •์ ์ธ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*๋ฏธ๋””์–ด*

- 360 ๋น„๋””์˜ค ๋ฃธ์—์„œ ๋ณผ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ์Šคํ…Œ๋ ˆ์˜ค ๋น„๋””์˜ค์˜ ์„ ํƒ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์™ผ์ชฝ-์˜ค๋ฅธ์ชฝ ๋ˆˆ ํ• ๋‹น ์ˆ˜์ •

- ๋ฏธ๋””์–ด ์žฌ์ƒ์ด ์‹คํŒจํ•˜๊ณ  ํ›„์† ๋ฏธ๋””์–ด๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- ๋น„๋””์˜ค ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ œ๋ชฉ์— ampersands ํ‘œ์‹œ๋ฅผ ์ˆ˜์ •ํ•จ

- ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์Šคํฌํ†ฑ์„ ๊ณต์œ ํ•œ ๋‹ค์Œ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ „ํ™˜ํ•  ๋•Œ ์—ฐ๊ฒฐ๋œ ์›น์บ ์ด ํ™œ์„ฑํ™”๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- IFX ํ™”๋ฉด์ด ๋ฐ˜ํˆฌ๋ช…ํ•ด์ง€๊ณ  ๋’ค์— ๋ฌผ์ฒด๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*ํ˜ธ์ŠคํŠธ ์ œ์–ด*

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

*IFX*

- ์‚ฌ์šฉ์ž๊ฐ€ ์•‰์•„ ์žˆ๋Š” IFX ์˜์ž์˜ Gizmo์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•จ

*๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜*

- ๋ˆ„๋ฝ๋œ ํ˜„์ง€ํ™” ํ…์ŠคํŠธ๋ฅผ Gizmo์— ์ถ”๊ฐ€ํ•จ

- ์ผ๋ถ€ ์–ธ์–ด์—์„œ ๊ณต์œ  ํ™”๋ฉด ํŽ˜์ด์ง€์— ๋‚˜ํƒ€๋‚˜๋Š” ์ค‘๋ณต ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•จ

*PLUS ๊ตฌ๋…*

- ์˜๊ตญ์ด ๋ถ€๊ฐ€๊ฐ€์น˜์„ธ ๋ชฉ์ ์œผ๋กœ EU์— ๋ถ„๋ฅ˜๋˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐํ•จ

*ํฌํƒˆ*

- ๋™์ผํ•œ ํฌํ„ธ์„ ํ†ตํ•ด ๋™์ผํ•œ ๋Œ€์ƒ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘๋ณต ๋Œ€์ƒ ์„ธ์…˜์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

*๋ ˆ์ฝ”๋”ฉ*

- ๊ธฐ๋ก์ด ๋„ˆ๋ฌด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ ์ €์žฅํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- ๊ธฐ๋ก ํŽ˜์ด์ง€์—์„œ ๊ณต์œ  ํ™”๋ฉด์œผ๋กœ ์ž˜๋ชป ๋ถ„๋ฅ˜๋œ ํ™œ์„ฑ ํƒญ์˜ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•จ

*Vive ์žฅ์น˜*

- VIVE Focus 3 ์žฅ์น˜์— ์ƒˆ๋กœ ์„ค์น˜ํ•œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ UI์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

- VIVE Flow 3 DoF ์ปจํŠธ๋กค๋Ÿฌ ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ๋ ˆ์ด๋ธ”์„ ์ˆ˜์ •ํ•จ

 

---------------------------------------------------------------------------------------------------------------------------

์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ  ๊ฐœ์„ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

์กฐ๊ธˆ ๋” ๋‹ค์–‘ํ•œ ๋ฉ”ํƒ€๋ฒ„์Šค ํ”Œ๋žซํผ๋“ค์„ ์ฐพ์•„๋ด์•ผํ•˜๊ฒ ์ง€๋งŒ ์—…๋ฐ์ด๋ฅผ ํ†ตํ•ด ๊ณ„์† ๊ฐœ์„ ํ•ด์ค€๋‹ค๋ฉด ๊ดœ์ฐฎ์€ ๋ฉ”ํƒ€๋ฒ„์Šค ํ”Œ๋žซํผ์ผ์ง€๋„

๋ฐ˜์‘ํ˜•

'๋ฉ”ํƒ€๋ฒ„์Šค > Engage VR' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Engage VR] Release v3.2  (0) 2023.02.25
[Engage VR] Release v3.1  (0) 2022.12.03
728x90

ํด๋ž˜์Šค์™€ ๋‹คํ˜•์„ฑ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”๊ฐ€ ์„ค๋ช…ํ•ด๋‹ฌ๋ผ

 

์•Œ๊ณ  ์žˆ๋Š” ๋””์ž์ธํŒจํ„ด์— ๋Œ€ํ•ด ๋งํ•ด๋ด๋ผ

1) ์‹ฑ๊ธ€ํ†ค

 

์‹ฑ๊ธ€ํ†ค๊ณผ ์ „์—ญ๋ณ€์ˆ˜์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

 

ํ•ด์‹œ๋งต(hash_map)์ด ๋ฌด์—‡์ธ๊ฐ€?

- ํ•ด์‹œ๋งต์€ ์ €์žฅ์€ ๋Š๋ฆฌ์ง€๋งŒ ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„ ๋งต ์ธํ„ฐํŽ˜์ด์Šค๊ณ„์—ด์˜ ๋Œ€ํ‘œ์ ์ธ ํด๋ž˜์Šค

- ํ‚ค(key)์™€ ๊ฐ’(value)์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง

- ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ map, set์— ๋น„ํ•ด ๋น ๋ฆ„

  โ— map,set์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ : ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ž๋ฃŒ ์ €์žฅ์„ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
  โ— hash_map, hash_set์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ : ์ •๋ ฌ์ด ํ•„์š” ์—†์œผ๋ฉฐ ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์›ํ•  ๋•Œ

- ๋นˆ๋ฒˆํ•œ ์ž๋ฃŒ ์‚ฝ์ž…, ์‚ญ์ œ์˜ ๊ฒฝ์šฐ์™€ ์ €์žฅํ•œ ์ž๋ฃŒ๊ฐ€ ์ ์„ ๋•Œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์™€ ๊ฒ€์ƒ‰ ์‹œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ

 

์ •์ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด์ ์€?

- ์ •์ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹คํ–‰ํ•  ๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋Š” ๋ฐ˜๋ฉด ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋กœ๋“œ๋˜๋Š” ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์„ ์•„๋‚„ ์ˆ˜ ์žˆ์Œ

- ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋งค๋ฒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฃผ์†Œ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์กด์žฌํ•ด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ๋Š๋ฆผ

 

๊ฐ’ ์ „๋‹ฌ ๋ฐฉ์‹์— ์–ด๋– ํ•œ ์ฐจ์ด์ ์ด ์žˆ๋Š”๊ฐ€

value๋กœ ์ „๋‹ฌ

- ์–•์€ ๋ณต์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง

reference๋กœ ์ „๋‹ฌ

- ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง

 

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ๋งํ•ด๋ณด๋ผ

 

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋งํ•ด๋ณด๋ผ

 

ํ˜•๋ณ€ํ™˜์„ ์“ฐ๋Š” ์ด์œ ์— ๋Œ€ํ•ด ๋งํ•ด๋ณด๋ผ

 

๋ฐ˜์‘ํ˜•

+ Recent posts