게임 심화편 베타타입 버전 2
여러분 안녕하십니까 FPS 게임 제작에 박현상입니다
이번 단원에서는 라이트 매핑과
최적화에 대한 강의를 진행해보겠습니다
베타 버전에 이르러 개발을 하다 보면
자연스럽게 그래픽 리소스를
프로젝트에 많이 추가하게 됩니다
하지만 리얼타임 렌더링의 환경에서는
무제한적인 리소스 사용은 어렵습니다
따라서 라이트, 3D 메시, 텍스처 등
다양한 그래픽 리소스에 대한 최적화 기법을 통해
원활한 콘텐츠 제공이 가능한 형태로 최적화하는 방법과
그래픽 요소들에 대한 활용 방법에 대하여 학습하겠습니다
라이트 매핑
라이트 매핑에 대한 개념에 대해서 다뤄볼 겁니다
라이트 매핑이라고 하면 일반적으로
라이트, 맵 이 두 가지 단어가 합쳐진 건데
라이트는 문자 그대로 빛이고
무슨 무슨 맵이라는 표현이 붙게 된다면
이것은 여러분들이 텍스처라고 이해를 하셔도
크게 다르진 않습니다
그러면 빛에 대한 이미지 파일이라고
해석이 될 수도 있을 건데요
빛에 대한 정보를 그림 파일로 만들어두는 과정이
라이트맵의 제작 과정입니다
그러면 빛에 대한 정보를 왜 그림 파일로 만드느냐
그거부터 한번 알아보겠습니다
현실에 있는 모든 오브젝트는
기본적으로는 충분한 힘만 있다면 이동이 가능합니다
반면에 리얼타임 엔진을 이용한 콘텐츠에서
모든 오브젝트가 다 물리적인 계산에 의해서 움직이게 된다면
그것은 굉장히 무거운
컴퓨터가 연산을 하는데 굉장히 무겁게 작동하게 되겠죠
그리고 필연적으로 연산이 무거워지면
우리가 흔히 FPS라고 얘기를 하는 Frame Per Second
초당 그려지는 프레임
화면의 장수가 낮아지게 됩니다
FPS 수치가 콘텐츠의 쾌적한 정도를 나타내는
대표적인 지표 중에 하나인데요
유저들이 화면을 바라볼 때 FPS 장르라고 얘기하는
여기에서 얘기하는 FPS는
First Person Shooting의 약자죠
이런 경우에는 60프레임을 기본적으로 목표에 두고 작업하고요
그 외에 약간 영상미를 중시하는
스토리텔링 기반의 콘텐츠라면
30프레임 정도를 기반으로 합니다
그리고 우리가 흔히 보는 TV도 마찬가지고
영화 같은 경우에는 이거보다 낮은 24프레임을 쓰기도 합니다
그래서 유저들이 화면을 바라보는 데 있어서
얼마나 끊김 없이 매끄럽게 보느냐
이것을 FPS 수치를 이용해서 우리가 알 수가 있는데요
초당 60장의 이미지가 넘어간다면 굉장히 부드럽게 느끼겠죠
더군다나 요즘에는 140프레임, 240프레임과 같이
굉장히 높은 프레임 수를 유지하면서
그러한 모니터들이 있기 때문에
유저분들의 눈도 굉장히 높아져 있습니다
하지만 앞서 얘기한 것처럼
모든 오브젝트가 물리적인 충돌이라든가
계산을 항상 하고 있다면
경우에 따라서는 10 프레임, 5 프레임
이런 식으로 뚝뚝 끊기는 화면을 제공할 수밖에 없는데요
그러다 보니 오브젝트를 크게 두 가지로 나눠서 관리를 합니다
첫 번째로는 여러분들이 캐릭터라고 얘기를 하는
움직일 수 있는 오브젝트들
흔히 Dynamic 오브젝트라고 얘기를 하고요
두 번째로는 배경 오브젝트와 같이
움직이지 않는 오브젝트들
그런 것들은 Static 오브젝트라고 얘기를 합니다
움직이는 오브젝트야 당장 그림자라든가 이런 것들이
시시각각 변하니까 우리가 어떻게 할 수는 없는데
움직이지 않는 Static 오브젝트라면
미리 연산에 들어가는 고도의 비용이 필요한 작업들에 대해서
우리가 먼저 계산해 놓고 유저들에게 제공해 줄 수가 있겠죠
그러한 실시간으로 연산되는 부분에서
빛에 대한 계산 그 외에 나머지 내비게이션 메시라든가
이런 식으로 움직일 수 있는 동선에 대한 계산
이런 것들을 먼저 해놓을 수만 있다면
유저분들이 조금 더 쾌적하게 콘텐츠를 즐길 수 있게 될 겁니다
그리고 이러한 라이트맵이라고 하는 것은
기본적으로 움직이지 않는
Static 처리가 되어 있는 오브젝트들을 대상으로 해서
빛에 대한 계산을 미리 하는 겁니다
지금 예시 화면에서 이렇게 보시면
왼쪽은 라이트맵이 그려지지 않은 상태의 화면이고요
오른쪽은 라이트맵이 그려진 상태입니다
보면 여기는 빛에 대한 음영 표시라든가
붉은색 벽이 빛을 건너편 벽에 반사시키는 효과라든가
이런 식으로 굉장히 많은 부분들이
아래쪽에 처마에 의한 어두운 음영에 대한 표시 같은 것들
이런 것들을 이용해서 조금 더 입체감 있고
사실적인 느낌의 배경 이미지를
유저들에게 제공해 줄 수가 있는 것이죠
이것을 위해서 우리가 기존에 받아진 애셋을 활용해서
라이트맵을 만들어 보는 작업을 할 겁니다
여러분들이 지금 보는 화면은
RPG_FPS_game_assets의 Map_v1을 열어놓은 화면입니다
카메라가 없어서 게임뷰에서는
No cameras rendering이라고 나오니까
우선은 이 Scene 뷰를 집중해서 보도록 하겠습니다
여러분들이 맵을 열고 나면
여기 저수조처럼 보이는 물탱크 같은 구조물에
뭔가 이상하게 얼룩덜룩한 이렇게 각진 이상한 모양들의
이미지를 보실 수가 있을 겁니다
실제 RPG_FPS_game_assets_industrial 폴더 내에
Map_v1과 동일한 이름의 폴더가 있습니다
여기에 보면 라이트맵이라고 해서
배치되어 있는 모든 오브젝트들에 대해서
배경 오브젝트들만 있으니까요
라이트맵을, 빛에 대한 그림을 다 텍스처 파일로
미리 그려 놓은 상태를 확인하실 수는 있는데요
이게 임포트 하는 과정에서
약간 데이터에 수정이 일어나면서
지금 보시는 것처럼 일부 맵 데이터가 이렇게 깨져있는 것을
눈으로 볼 수 있게 된 거죠
우리는 이것을 그대로 사용하지 않고요
우리가 작업했던 Main Scene에다가 RPG_FPS 맵을
그대로 이 Scene 파일을 드래그해서 우선 넣도록 할 겁니다
그리고 우리가 테스트용으로 놔뒀던 오브젝트들은
비활성화해서 눈에 보이지 않도록 세팅해놓을 거고요
여기에 배치되어 있는 모든 오브젝트들을 보시게 되면
눈에 보이는 이런 3D 오브젝트들은
전부 다 인스펙터창 우측 상단에
Static이라고 하는 항목이
활성화되어 있는 걸 보실 수가 있습니다
그리고 건물들 오브젝트들 모두 다 Static 처리가 되어있죠
이 Static 항목의 오른쪽 화살표를 눌러보시면
여러 가지 목록이 나오는데요
여기에서 Contribute GI라는 항목이
지금 보시는 것처럼 활성화된 것을 보실 수가 있습니다
이 항목이 활성화되어 있으면
내가 선택한 오브젝트는
라이트맵의 텍스처를 표현해야 할
대상이다라는 뜻으로 이해하시면 됩니다
그래서 여기 있는 모든 배경 오브젝트들은
이미 개발자가 깔끔하게 정리를 해서
전부 다 Static 처리가 되게끔 세팅이 되어있습니다
그래서 이것을 그대로 드래그해서
우리가 작업하는 캐릭터가 있는
Main Scene에다가 드래그해서 올려놓고요
Map_v1이라고 하는 것은 오른쪽 클릭해서
Remove Scene을 해줍니다
그리고 Save는 하지 않도록
Don't Save 버튼을 누르겠습니다
그러면 아까 전에 이상하게 보였던
저수조의 이미지 같은 것들이
없어진 상태를 확인하실 수가 있죠
여기에서 우리는 라이트맵을 만들어 볼 건데
그전에 라이트에 대한 세팅이 조금 필요합니다
Map_v1의 게임 오브젝트 안쪽에는
파티클도 있고 3D 오브젝트도 있고 라이트 항목이 있습니다
원래 유니티 Scene에서는 기본 Scene을 생성하고 나면
Directional Light와 Main Camera가
기본으로 제공이 되죠
그래서 Directional Light가 하나가 더 추가되어 있기 때문에
라이트 항목 자체를 지워줘서
우리는 Main Scene에서 기본 제공하던
라이트만 가지고 사용할 건데요
라이트맵이라고 하는 것은 기본적으로
라이트의 정보를 텍스처로 만드는 과정입니다
그래서 라이트가 있다고 했을 때
지금 빛의 방향이 이렇게 나오고 있죠
그리고 오브젝트가 이렇게 그림자를 만드는
빛의 방향에 따라서 음영이 지는 것들이 있는데
그러면 이렇게 바닥에 그림자가 생성이 됐을 때
이 그림자에 대한 정보뿐만 아니라
오브젝트 자체에서 밝은 면과 어두운 면에 대한
이러한 정보들까지도 모두 다 그림 파일로 만들게 됩니다
이제 라이트맵에 대한 기본적인 준비 사항에 대해서 알아봤고요
본격적으로 라이트맵을 만들어 볼 건데
Window - Rendering - Lighting 항목으로 갑니다
그리고 Scene에서 라이팅 세팅 애셋이라는 부분이
만약에 비어 있다면 이 부분을 제가 잠깐 지워보겠습니다
비어 있다면 New 버튼을 눌러서 새로 생성해 주시면 됩니다
New Lighting Settings라고 새로 생성이 되었죠
그리고 여러 가지 옵션들이 있는데
일단은 라이팅 모드를 Subtractive로 바꿔줄 겁니다
그리고 라이트맵이라는 과정은
원래 정교한 빛의 계산을 하는 것이기 때문에
시간이 굉장히 오래 걸리는 작업인데요
여기는 Direct Samples를 절반으로 16이 되겠죠
Indirect 간접광에 대한 Samples도 절반
Environment도 마찬가지
마지막으로 Lightmap Resolution 부분도
이것을 12 정도로 낮춰서
결과가 빨리 나올 수 있게끔 바꿔봤습니다
실제로 기본 세팅 값을 가지고
현재 맵에 대한 라이트맵을 생성하게 되면
40분이 넘는 시간이 걸립니다
현업에서는 경우에 따라서 하루 종일 걸리거나
밤새도록 라이트맵을 생성하는 일도 더러 있습니다
근데 우리는 그렇게까지 오랜 시간을 쓸 수는 없으니까
이 정도로만 세팅을 하고 그리고 중요한 건데
Directional Light에 모드 부분을 보면
리얼타임으로 되어있죠
이것을 Mixed 혹은 Baked 둘 중에 하나로 바꿔줘야 됩니다
저는 Mixed로 설정을 해놓겠습니다
왜냐하면 리얼타임이라고 하는 건 빛에 대한 계산을
현재 내가 선택한 Directional Light에 대한 계산을
실시간 계산만 하겠다는 뜻입니다
Baked는 라이트맵을 구울 때
보통 Bake 한다는 표현을 합니다
Bake 한다는 건 텍스처로 만든다는 의미고요
Bake를 한다고 했을 때에만
Directional Light의 정보를 가져다 쓰겠다는 뜻입니다
근데 Directional Light는 기본적으로는
태양과 같은 역할을 하기 때문에
Dynamic 오브젝트한테도 영향을 주고
Static 오브젝트한테도 영향을 줘야 돼서
그 두 가지에 모두 영향을 줄 수 있는
Mixed로 세팅을 하는 게 일반적입니다
그러고 나서 준비가 끝났다면 Scene을 저장을 하고요
Ctrl+S를 눌러서 저장을 하고
Generate Lighting 버튼을
라이팅 창의 가장 하단에 있죠 눌러 줄 겁니다
라이트맵이 생성되는 동안 우측 하단에
얼마큼의 시간이 소요되는지가 나오고요
지금은 시간이 차츰차츰 줄어들고 있죠
그리고 라이트맵이 Bake 되는 중에
Global illumination이라고 하는 개념에 대해서
먼저 여러분들께 설명해 드리겠습니다
앞서서 이 Static 옵션에서
Contribute GI라고 하는 항목을 확인했었죠
그 GI의 약자가 Global illumination입니다
일반적으로 빛이라고 하는 것은 태양빛처럼
물체 같은 곳에 직접적으로 닿는 Directional이 있고요
직접광이 물체에 부딪혀서 튕겨나가서
다른 오브젝트에 영향을 주기도 합니다
이것을 Indirect라고 얘기를 합니다
또한 이 빛이 나중에 바깥으로 빠져나가서
하늘에 부딪혀서 다시 내려오기도 합니다
Sky에서 공기 중에 떠다니는 입자에 부딪히는 거죠
그래서 단순히 Directional Light에 의한 효과뿐만 아니라
Sky에서 구름에 부딪히든 혹은 대기에 부딪히든
이렇게 난반사되서 사방에서 들이치는 빛 같은 경우에는
우리는 이것을 GI(Global illumination)라고 부릅니다
그래서 기본적으로 라이트맵을 그린다고 하는 것은
태양과 같은 Directional Light의 직접적인 빛뿐만 아니라
그것이 여러 번 반사가 돼서 사방에서 들이친다는 전제에서
이렇게 Global illumination까지 포함해서
Bake를, 텍스처를 생성하는 것이죠
이 아래쪽에 있는 샘플이라고 하는 것들이 대부분은
우리가 결국 그림 파일로 만든다는 것은
하나의 픽셀 데이터로 계산을 한다는 것인데요
이 픽셀을 무슨 색깔로 표현할지
여러 개의 빛에 대한 정보를 가져오는 것
그것을 우리는 흔히 샘플이라고 얘기를 합니다
한마디로 Directional Light에 대한 계산을 위해서
16개의 샘플이 필요한 거고요
Indirect를 위해서 혹은 Environment를 위해서
수백 개의 샘플을 사용하겠다는 뜻이 되는 겁니다
이 아래쪽에는 그런 수많은 샘플의 정보를 취합해서
어떠한 이미지를 생성할 거냐라는 것인데
여기에서 보면 Lightmap Resolution 항목을 보시면
Texels per unit이라는 표현이 나옵니다
1unit 현실에서는 1m를 기준으로
유니티에서의 1unit을 만들어 놨죠
이 1unit을 그리는 데 있어서 몇 Texel
텍스처에서의 픽셀 이것을 Texel이라고 얘기를 합니다
한마디로 1m의 공간을 표현하는 데 있어서
몇 픽셀을 가져다가 표현을 할 거냐
당연히 Texel의 수가 높으면
훨씬 더 정교한 빛의 표현이 가능한데
그림자라든가 이런 것들도 훨씬 더 정교해지는데
대신 그만큼 시간이 오래 걸리게 됩니다
이 1m를 12개로 쪼개서 표현하겠다는 뜻이 되는 것이고요
이제 설명에 맞춰서 빛에 대한 계산이 다 끝났습니다
여기에서 보시면 앞서서
잠깐 기즈모를 끄도록 하겠습니다
이런 식으로 좀비라든가 이런 것들은
Dynamic 오브젝트이기 때문에 그림자에 대한 계산을
실시간으로 하고 있고요
배경 오브젝트는 Static이었죠
그러다 보니까 움직이더라도 그림자가 바뀌지 않습니다
마찬가지죠 여기 있는 저수조를 움직이더라도
그림자가 바뀌지 않습니다
왜냐하면 이것은 이런 식으로
미리 그림 파일로 만들어졌기 때문입니다
이게 바로 라이트맵이라고 하는 그림 파일인데요
그중에서도 저수조가 차지하고 있는 영역이
Baked Lightmaps 항목에 의해서 노란색으로 표시되고 있죠
오픈 프리뷰 버튼을 눌러서 확인하실 수 있고
Window에 Lighting 패널에서도
Baked Lightmaps이라는 항목을 통해서
현재 총 0번부터 4번까지 총 5장의 이미지로
라이트맵이 생성된 것을 확인하실 수가 있습니다
제가 사용했던 Subtractive라는 방법은
빛에 대한 그림자나 밝은 면이나 모든 것들을
하나의 이미지에 표현하겠다는 뜻이 되는 거고요
좀 더 정확하게 한 종류의 이미지에
표현하겠다는 뜻이 되는 거고
여기에서 Baked Indirect를 하면
간접광에 대한 정보만 표현을 하겠다
그래서 그림자와 같이 직접적으로 생기는
Direct Light 효과에 의해서 생기는
그림자 같은 것들은 빼고 간접광에 대한 것만 그리겠다
그러다 보니 Baked Indirect를 하게 되면
그림자는 포함이 되지 않기 때문에
밝고 어두운 면에 대한 정보만 그려지고
라이트를 바꾸면 그림자의 정보가 바뀔 수 있습니다
대신 텍스처를 한 장 더 쓰게 되는 거고요
Shadowmask 같은 경우에는 총 3장의 이미지를 통해서
그림자와 밝은 면, 어두운 면, GI 이런 것들을
3장의 이미지를 사용해서 표현하기 때문에
라이트맵 방식 중에서 시간도 제일 오래 걸리고
가장 무거운 축에 속하는 방식입니다
그래서 일반적으로 유니티 매뉴얼 상으로
모바일 게임과 같이 굉장히 라이트한
사양이 낮은 플랫폼을 타겟팅 할 때는 Subtractive로
높은 사양을 타겟팅 할 때는 Shadowmask와 같은 옵션으로
베이킹을 하는 것이 좋다고 되어있고요
이런 식으로 라이트에 대한 정보는
한 종류로 정리가 되는데
옵션들 중에 이런 3D 오브젝트들이 월드상에서
어느 방향을 바라보고 있는지에 대한 정보도
이렇게 별도로 더 추가된 것을 확인하실 수가 있죠
그래서 이러한 정보들이 우리가 얘기하는
라이트맵을 Bake 한 겁니다
현재 라이트맵 생성은 끝났는데요
굉장히 어둡고 칙칙한 느낌이 들죠
그런 이유 중에 하나는 지금 환경상의 Sky가
유니티의 기본 Sky이기 때문입니다
Sky에 대해서 약간 우리가 설정을 해줄 필요가 있습니다
우선은 RPG_FPS_game_assets - Texture 항목에서
Skybox 항목을 보도록 하겠습니다
여기 보면 구름이 끼어 있는 하늘의 이미지가 보이죠
Window - Rendering - Lighting 패널에서
Scene 바로 옆에 있는 두 번째 Environment에다가
Skybox_v9를 드래그해서 연결해 줍니다
그러면 지금 보시는 것처럼 우리의 배경화면에
Skybox가 변경이 된 것을 확인하실 수가 있는데
혹시라도 변경된 Skybox가 안 보이시는 분들은
뷰포트에서 여기 있는 Toggle 버튼을 이용해서
껐다 켰다가 가능하니까 참고하시고요
일반적으로 라이트맵을 구울 때
환경에 깔려 있는 Sky에 붉은색 혹은 푸른색
이런 정보들도 같이 구워줘야
이게 조금 더 자연스러운 라이팅을 만들 수가 있는데
이전에는 그러한 라이팅에 사용할 만한
Sky 정보가 충분하지 않았기 때문에
상대적으로 좀 칙칙한 결과를 갖게 된 것이고요
이것을 제가 새로 Generate Lighting을 해서
Skybox가 적용됐을 때도
한번 비교해서 보여드리도록 하겠습니다
Skybox를 설정해 놓은 상태에서
Generate Lighting 버튼을 눌러주겠습니다
Skybox에 라이팅 정보를 받아오기 위해서는
Environment Lighting 항목의 소스 부분이
Skybox로 되어있어야 그 정보를 가지고 와서
라이트맵을 생성하는 데 참고하는 것이고요
기본적으로는 Environment Light의 타입을
결과에 따라서 내가 임의로 수정할 수도 있습니다
두 가지 결과물이 나왔는데요
우선은 위에 있는 이미지가
기본 유니티 Skybox의 결과입니다
여기 화면에는 들어가 있는데
이거는 나중에 집어넣었을 때 찍은 스크린샷이고
유니티의 Skybox
아래쪽에 있는 것은 실제 우리가 적용했던
Skybox 버전 9를 이용해서 Bake 한 건데
크게 차이는 없죠
아마 여기에서 눈에 두드러지는 차이라고 해봐야
이쪽 그림자 쪽의 디테일이 조금 더 잘 보이는 정도
여기 있는 몇 가지 포인트 정도만 조금 더 잘 보이는
이 정도의 변화만 미묘하게 있을 뿐입니다
물론 눈이 좀 예리하신 분들은 처음 딱 보더라도
약간 어두운 부분이 조금 밝아졌네 정도의
느낌은 받으실 텐데요
저 같은 경우에는 Skybox에 있는 정보를
직접적으로 가지고 와서 쓰는 것보다 조금 더 좋아하는 게
Gradient라고 하는 옵션을 조금 더 좋아합니다
그래서 약간 번거롭긴 하지만
Gradient는 쉽게 얘기해서
하늘에서 내려오는 빛과 수평에서 내려오는 빛
그리고 빛이 바닥에 부딪혀서 바닥에서부터 튕겨나오는
Sky 그리고 Equator 마지막으로 Ground까지
이렇게 총 세 가지 빛의 방향을 가지고
임의의 색깔을 제가 정해서 표현하는 방식인데요
그래서 저는 이것을 내가 집어넣은 Sky와
그래도 좀 아주 엇나가지 않게
유사한 색감이라든가 빛의 강도를 가질 수 있게끔
이렇게 스포이드를 통해서 Sky에서 가장 밝은 영역에
색이 좀 보이는 이러한 색상을 골라주고요
빛의 세기는 우선은 1 정도로만 하겠습니다
마찬가지로 Equator 같은 경우에는 클릭해서
스포이드로 지평선 부분의 빛의 컬러를
마찬가지로 1 정도로 두고요
마지막으로 Ground 같은 경우에는
바닥에서 많이 차지하는
가장 넓은 면적을 차지하는 색상의 컬러를 찍어서
이렇게 색을 지정해 줍니다
밝게 표현을 했으니까 여러분들이 너무 밝다 싶으시면
Intensity 항목을 조금만 낮춰서
0이어도 기본적인 밝기를 갖고 있기 때문에
1이 너무 밝다면 약간 낮춰서 표현하시는 것도
하나의 방법입니다
1이라고 하는 건 제가 그냥 나중에 조절하기 위한
임의의 기준값을 잡은 것이고요
빛에 대한 계산이 끝나면 세 번째 스샷까지 함께
결과치로 비교해 보도록 하겠습니다
Skybox의 컬러에서 색을 뽑아내서
Gradient로 세팅을 한 상황인데요
지금 보시면 이전에 Skybox를 가져다 썼을 때보다
음영 부분이 훨씬 더 밝아져서
그림자가 그렇게 짙지 않게
티가 나지 않게 은은하게 올라온 것을 보실 수가 있고
Equator에 보면 파란색이
조금 더 강조된 것을 보실 수가 있죠
이거는 사람에 따라서 혹은 상황에 따라서
여러분들이 선택해서 사용하시면 될 것 같습니다
그래픽 최적화 기법
여러분들이 임의의 라이트를 하나 설치해서
또 다른 사용 방법을 하나 보여드릴 건데요
Light - Point Light를 이용해서
기즈모를 활성화하고 Only Baked
Baked라는 것은 기본적으로
무조건 Static 오브젝트한테만 영향을 주게
이렇게 표현이 되는 경우들이 있습니다
약간 붉은색으로 해서 이런 식으로 붉은색 기운이
주변 환경에 조금 묻어나게끔 세팅을 해봤고요
이 상태에서 라이트맵을 한다면
한 가지 문제점이 있습니다
Baked 옵션은 Static 오브젝트한테만 영향을 줍니다
근데 만약에 이렇게 빨간 빛이 비추는 상황에서
Dynamic 오브젝트가 접근을 한다면
아무런 영향도 끼치지 못하게 됩니다
그러면 배경은 빨갛고
Dynamic은 여전히 그냥 하늘의 빛만 받고 있다고 한다면
굉장히 어색한 상황이 되겠죠
이러한 것을 방지하기 위해서
라이트맵에서 라이트를 Bake 했을 때
Bake 된 라이트의 정보를 가지고 있다가
Dynamic 오브젝트한테 전달을 해주는 역할의
게임 오브젝트가 존재합니다
이것을 우리는 라이트 프로브라고 하고요
하이어라키에서 Light 항목에서 맨 아래에 있는
라이트 프로브라고 하는 오브젝트입니다
설치를 하고 월드 영점으로 위치를 바꿔놓겠습니다
그래서 위치에 보면 동그라미 표시들이 있게 되는데요
이 동그라미들을 여러분들이 시작할 만한
적당한 위치에 옮겨 두시고
Edit Light Probe Positions 버튼을 클릭하시면
개별 구체들을 이렇게 선택하는 것이 가능합니다
그래서 라이트 프로브를 배치할 때는
기본적으로 라이트 프로브가 캐릭터를 감쌀 수 있게
점프를 한다면 점프 공간까지 고려해서
이것을 내가 필요한 영역만큼
드래그해서 선택하고 Ctrl+C, V
이런 식으로 Ctrl+C, V 해서 확장해서 복사해서
영역을 넓힐 수가 있습니다 이런 식으로 Ctrl+C, V
빛의 변화가 많다면 간격을 조밀하게 하는 것이고
빛에 대한 변화가 적다면 널찍하게 해도
크게 문제 되지는 않습니다
그래서 라이트 프로브의 단점인데요
유저분들에게 해당되지는 않는데
라이트 프로브는 무조건적으로 연결이 되기 때문에
따로 떨어져서 되지가 않습니다
그래서 이런 식으로 한 번 배치를 하기 시작하면
끊임없이 계속해서 배치를 해야 된다는
단점 아닌 단점을 가지고 있습니다
물론 저는 영상의 길이 때문에
이것에 대해서 전체적으로 하지 않을 건데
지금 보시면 이 삼각형의 범위가 보이고 있죠
이 삼각형 범위 안에 캐릭터가 들어오게 되면
여기에 있는 프로브들이 가지고 있는
현재 위치에 있는 라이트의 정보를
Dynamic 오브젝트한테 뿌려주게 됩니다
그래서 빛의 변화가 많은 영역들
음영이 지는 영역들 이런 부분들에서는
굉장히 조밀하게 깔아줘야 되는 거고요
아니라면 여러분들이 잘 선택해서 간격 조절을 해야겠죠
일반적으로 이런 작업을 레벨 디자이너가
라이트를 잡으면서 진행하게 됩니다 이런 식으로
만약에 잘못 만든 부분이거나 너무 간격이 조밀하다면
이렇게 선택해서 부분적으로는 지워줘도 됩니다
그래도 컴퓨터가 알아서 연결을 해주기 때문이죠
일단 이 정도만 배치를 해놓고
다시 한번 Window - Rendering에 가서
Generate Lighting 버튼을 눌러서
라이트맵을 Bake 해 보겠습니다
라이트를 앞서서 설명한 것보다
조금 더 Intensity 값을 높여서 Bake를 했고요
플레이를 눌러서 실제 이 오브젝트에
어떻게 보이는지 한번 비교해 드리겠습니다
현재는 라이트 프로브의 영역 밖에
좀 더 정확하게는 붉은색 영역 밖에 있기 때문에
라이트의 영향을 안 받는데 이것을 가까이 가면
총신에 붉은색 빛이 도는 게 보이시죠
여기에서 심지어는 붉은색 라이트를
비활성화한다고 하더라도 활성화를 끈다고 하더라도
지금 보시는 것처럼 붉은색의 기운이
여전히 총신에 묻어나는 것을 보실 수가 있습니다
이런 방식으로 라이트 프로브를 사용하게 되는 겁니다
마찬가지 맥락으로 라이트의 리플렉션 프로브도
같은 역할을 하는데요
지금은 현재 아무런 데이터가 없는 상태이기 때문에
이 Bake 버튼을 리플렉션 프로브를 배치하시고
여러분들이 적당한 공간에 놓고 Bake를 누르신다면
주변의 환경을 360도로 캡처를 떠서요
이 캡처된 이미지를 유리나 이런 것처럼
아주 반짝반짝한 질감들한테
여기 가까이서 보겠습니다
옷의 질감을 일부러 좀 과도하게 높여보도록 하겠습니다
Smoothness 값을 이렇게 높여놓고
리플렉션 프로브가 있기 전과 후를 비교해 보면
이런 식으로 텍스처를 잠깐 빼서
None 상태로 만들어두고 메탈릭은 높여서 보면
지금 주변 환경이 비치는 게 확인이 되시죠
리플렉션 프로브가 하는 일은 이렇게
지금은 오브젝트가 없이 주변에만
이런 식으로 빛을 뿌리고 있는데
리플렉션 프로브의 영역 안에 3D 오브젝트가 존재한다면
이제 이걸 낮춰서 3D 오브젝트 주변에 놔두도록 하겠습니다
그렇게 한다면 지금 보시는 것처럼
주변 환경을 마치 직접 반사하는 것 같은
느낌을 만들어 줄 수가 있는데요
실제로는 실시간으로 화면을 반사시키는 것이 아니고
리플렉션 프로브가 가지고 있는 이미지를
반사시키는 것처럼 투영시켜서
보여주는 역할을 하는 겁니다
리플렉션 프로브를 꺼보면 Sky 기본값만 반사가 되죠
그래서 이런 식으로 리플렉션 프로브도 Bake를 해서
이때 만들어지는 건 리플렉션 맵을 만드는 것이고요
그래서 단순히 라이트만 Bake하는 것이 아니고
이러한 프로브와 같이
주변 Bake 된 라이트의 데이터 같은 것들도
따로 미리 계산을 해놓을 수도 있고
리플렉션 프로브처럼 주변 환경의 이미지 같은 것들도
미리 계산을 해서 실시간으로 콘텐츠가 돌아갈 때
하드웨어에서 연산하는 부담감을
좀 줄어들게 만들 수가 있습니다
이러한 일련의 작업들을 대부분 최적화라고 합니다
최적화에서 여러분들이 잊지 마셔야 될 건
단순히 아낀다고 능사가 아니고요
아끼긴 아끼되 그래도 더 좋아 보일 수 있게
혹은 어떠한 기법을 사용하기 전과 후에
커다란 차이를 만들지 않게끔 하면서도
퍼포먼스를 향상시키는 것이죠
최적화 기법에 대해서 좀 알아봤는데
이러한 최적화 기법은
3D 오브젝트를 제작하면서도 사용할 수가 있고요
여러분들이 콘텐츠를 제어하면서
좀비 같은 오브젝트를 세 마리를 쓰는 것보단
한 마리를 쓰는 게 더 리소스는 적게 먹겠죠
세 마리의 체력을 한 마리한테 몰아줘서
10, 10, 10 나눌 거를 30으로 만들어서
한 마리를 잡는데 시간을 더 오래 투자하게 만드는 것도
하나의 방법이고요
단순하게는 최적화라고 하는 게
그래픽에만 해당되지 않는다는 점을
모든 파트가 다 같이 달려들어서 하는
작업이라는 점을 이해하실 필요가 있고요
포스트 프로세싱
무조건 아낀다고 좋은 건 아니기 때문에
때로는 효과를 일부러 더 써서
유저들에게 몰입감 높은 환경을 제공하기도 하는데
대표적으로 쓰이는 게 바로
포스트 프로세스 추가 효과들이기 때문에
카메라에 있는 포스트 프로세싱을
활성화해 줄 필요가 있습니다
아무리 Scene 뷰에서 보인다고 하더라도
포스트 프로세싱이 실제 유저들이 보는 화면에
전달이 안 되면 의미가 없겠죠
그래서 유저들이 보는 화면에도 효과가 표현될 수 있게끔
포스트 프로세싱 체크박스를 활성화해 주시면 됩니다
이러한 포스트 프로세싱 효과를 마찬가지 맥락으로
여기 보면 카메라에 Anti-Aliasing 옵션이
추가로 들어가 있는 걸 보실 수가 있는데요
Anti-Aliasing 같은 경우에도
내가 화면을 어떻게 부드럽게 표현할 것인가를
이렇게 확대해서 보면 현재 No Anti-Aliasing 상태
사실은 실제로 아예 효과가 빠진 건 아니고요
URP에서는 프로젝트 세팅 그리고 그래픽 세팅에서
현재 적용되고 있는 URP의 퀄리티 세팅
HighFidelity 여기에서 URP의 기본 세팅에서 보면
기본적으로는 멀티 샘플링
Anti-Aliasing이라고 하는 게 적용되어 있습니다
이걸 Disabled로 해보면 Anti-Aliasing이 전혀 없는
이런 칼처럼 끊어져 있는 렌더링 결과물을 보실 수가 있는데
이렇게 알고리즘 중에 하나라고 보시면 됩니다 멀티 샘플링
이거 말고 카메라가 가지고 있는
또 다른 종류의 Anti-Aliasing을
적용해서 보는 방법도 있습니다
그래서 이러한 Anti-Aliasing 옵션 같은 경우에는
여러분들이 굳이 중복해서 사용하실 필요는 없기 때문에
기본 제공되는 멀티 샘플링을 사용하시거나
혹은 메인 카메라에 붙어있는
추가적인 Anti-Aliasing을 이용해서
여러분이 눈으로 보기에 조금 더 매끄러운 형태나
혹은 이런 퍼포먼스에 영향이 끼치는 정도를 파악해서
사용하시는 것이 좋습니다
이렇게 화면 전체에 렌더링 되는 결과물을
제어할 수 있는 포스트 효과들이 있고요
이거 말고 이미 렌더링이 다 끝난 화면에
여러 가지 데이터들이 있습니다 사실은
깊이 값이라든가 컬러 값, 위치값, 방향 값
이런 여러 가지 정보들이 있는데
이러한 정보들을 이용해서
간단한 효과를 하나 만들어 보겠습니다
일반적으로는 Core3D 환경상에서는
패키지 매니저를 통해서 포스트 프로세스라는 패키지를
임포트해서 써야 되는 반면에
URP 같은 경우에는 URP 내의 기본 포스트 프로세싱이
Volume을 통해서 생성하고 관리할 수 있게끔 내장되어 있습니다
하이어라키에서 Volume - Global Volume을 클릭해서
맵 전체적으로 영향을 줄 수 있는
포스트 프로세싱을 만들어 보겠습니다
Volume 오브젝트가 만들어지면 New 버튼을 눌러서
현재 비어있는 Profile을 채워줍니다
그러고 나서 Add Override - 포스트 프로세싱에서
내가 원하는 효과를 굉장히 많이
이런 것들을 다 설명할 건 아니고
대표적으로 많이 쓰이는
Bloom 같은 것들을 한번 추가해 보겠습니다
Intensity를 우선 1로 할 건데요
이것을 강도를 1로 하게 되면 지금 보시는 것처럼
Smoothness나 Metallic 값이 굉장히 높은 오브젝트라면
Intensity 1만 된다고 하더라도 이렇게 반짝반짝이는
굉장히 눈 아픈 상황들을 보실 수가 있는데
이때는 Bloom만 만지실 게 아니고
오브젝트가 가지고 있는 질감 자체를 약간씩 수정해서
조금 더 여러분들이 편안하게
반짝임이 덜한 상태로 표현할 수 있는
다른 방법들도 강구하실 필요가 있습니다
Bloom 같은 경우에는 앞서서 디졸브 효과를 만들 때도 보셨다시피
기본적으로는 Emissive 값에 따라서
Emissive의 컬러 값을 우리가 어떻게 하느냐
단순히 색만 밝게 빛나는 게 아니라
Intensity까지 같이 높아진다고 했을 때
지금 보는 것처럼 밝게 빛나는 효과를 확인하실 수가 있죠
이런 식으로 사용하는 것인데
이것은 무조건 강하다고 좋은 건 아닙니다
잠시 라이트 프로브는 설명에 거슬리니까 꺼놓고요
이런 효과 말고도 대표적으로 많이 쓰이는 것 중에
이번에는 Depth Of Field라고 하는 카메라 포커싱을
초점을 맞추는 기술에 대해서 한번 실습해 보겠습니다
우선 Global Volume에서 Bloom 바로 아래에
Add Override 버튼을 클릭해서
포스트 프로세싱에 Depth Of Field를 추가합니다
여기에서 모드를 활성화해 주시면
Off였던 것을 총 두 가지
Gaussian이나 Bokeh 형식으로 할 수가 있는데
Gaussian 같은 경우는 굉장히 쉽게 사용할 수는 있습니다
다만 이 효과는 카메라에서 얼마나
대상이 또렷해 보이느냐를 결정하는 효과이기 때문에
지금과 같이 게임뷰 상에서
여러분들이 약간의 효과가 적용된 것을
넣었다 빼보면 확인할 수는 있지만
우리가 의도한 대로 나오는지는 정확하게 알 수가 없겠죠
그래서 메인 카메라의 위치를 살짝 바꿔서
지금 현재 제가 이렇게
잠깐 기즈모를 끄고 보면
이런 식으로 현재 플레이어가
빨간색 건물과 일직선 상에 놓이게끔
이 위치에다가 카메라를 빠르게 세팅해 볼 겁니다
우선 Scene 뷰의 화면을 이런 식으로 앵글을 잡아놓고요
메인 카메라 그리고 GameObject
Align With View 버튼을 클릭해 줍니다
그러면 내가 선택한 게임 오브젝트가
현재 Scene 뷰에서 바라보는 그 위치와 그 각도
그대로 세팅이 됩니다
이렇게 게임뷰와 Scene 뷰를 비교해 보면
Depth Of Field가 적용되어 있기 때문에
게임뷰는 배경이 좀 흐리게 보이죠
여기에서 좀 세부적인 설정을 위해서
Start와 End 부분을 활성화해 놓겠습니다
Start와 End는 어느 부분부터 선명하게 보일 것인가
그리고 어디 거리까지 선명하게 보일 것인가
이 두 가지를 결정하는 파라미터인데요
Scene 뷰에서 잠깐 카메라를 뷰만 옮기도록 하겠습니다
메인 카메라를 옮기는 게 아니라 뷰만 옮길 건데
여기에서 기즈모를 활성화해서
카메라 위치와 비교를 해 보면
현재 Depth Of Field의 Start 값은 10입니다
그러면 카메라로부터 10m까지는 선명하게 보이게 됩니다
반면에 여기서부터 서서히 흐려지게 되는 것이죠
그래서 여러분들이 이 거리값에 따라서
얼마큼 또렷해 보이고 흐리게 보이느냐를
이러한 파라미터 값을 이용해서 간단하게
좀 더 멀어지면 30m 만큼 또렷하고
멀어지면 그만큼 먼 배경은 뿌옇게 되고
이런 식으로 컨트롤하는 건데
이거는 굉장히 카메라에 대한 지식이나 이해 없이 쓸 수 있는
굉장히 단순한 방법이고요
여기서 Bokeh라고 하는 옵션은
실제 카메라 작동 원리를 기준으로 하기 때문에
보통 세 가지 Focus Distance, Focal Length, Aperture
Aperture라고 하는 건 보통 카메라의 조리개라고 하는
빛이 들어오는 광량을 조절하는 부품입니다
그래서 만약에 Bokeh 형식으로 둔다면
조금 특이한 효과를 우리가 만들어낼 수 있는데
이전에 우리가 리플렉션이나 이런 것들을 하면서
지금 보시는 것처럼 Reflection과 Metallic
Smoothness가 너무 강하게 되면
이런 식으로 빛이 동그랗게 번져보이는 것이 있었죠
여기에서 동그랗게 번져보이는 이 효과
이거 Blade Count를 5로 세팅을 해두고
거리를 조금 조절을 하겠습니다
제가 의도적으로 화면에서
Bokeh라는 현상을 설명하기 위해서
약간 세팅 값을 실제로는 사용하진 않겠지만
굉장히 과도한 값으로 바꿔줬습니다
이를테면 Focus Distance라든가 Focal Length라든가
이런 것들을 바꿨는데
일반적으로 Bokeh라고 하는 효과는
이렇게 하이라이트 되는 빛의 모양을 주목해 주세요
Blade Count가 3이면 삼각형의 모양이고
4면 사각형, 오각형, 육각형 이런 식으로
빛에 맺어지는 동그란 모양이 아니라
이런 식으로 실제 현실에 존재하는 카메라와 같이
이런 식으로 빛이 맺히는 모양을 조절할 수가 있습니다
이러한 빛이 맺히는 모양을 조절하는 필터 기능을
흔히 Bokeh라고 얘기하는 거고요
Depth Of Field에서는 보통 상이 또렷하게 맺히는
이런 대상에 대해서 컨트롤하는 것이기 때문에
조금 더 현실적인 수치를 보여드리자면
우선 잠깐 Stats를 끄고
여기 선명해 보이는 것을 잘 기억해 두세요
이렇게 제가 현재 카메라 위치를 기준으로 해서
5unit 앞에다가 Distance 값을 놨습니다
이 얘기는 현재 카메라가 있으면
여기서 5unit 거리만큼인 여기에 초점을 맞추겠다
카메라의 초점을 선명하게 맞추겠다는 뜻이 되고
그다음에 Focal Length라는
거리 값을 기준으로 해서 이 값이 작아지면 작아질수록
점점 선명해지는 구간이 늘어나게 됩니다
이렇게 보이듯이 Bokeh 효과도 자연스럽게 사라지게 되죠
그래서 Focal Length에 따라서
선명해지는 구간을 끝까지 채운다면
아주 좁은 영역만 선명할 텐데
역으로 Focal Length가 좁아진다면 이런 식으로
그래서 초점을 맞출 오브젝트의 거리를 기준으로 해서
앞뒤로 범위를 결정하는 게 Focal Length입니다
그리고 효과가 얼마나 강하게 들어갈지
그 정도를 조절하는 게 Aperture고요
조금 더 자연스럽게 한다면 이런 식으로
사람의 경우에도 우리가 항상 바라봐야 되는 위치에
딱 초점을 선명하게 유지를 하죠
이것이 유니티에서 기본 제공하는 효과들이고요
그 외에 나머지들은 애셋스토어를 통해서
기능을 확장시킬 수도 있습니다
오브젝트의 경계를 보면 지금 이렇게 그림자가
어두워진 것들을 볼 수가 있는데
여기에 어울리는 효과 중에는
Ambient Occlusion이라고 하는 효과가 있습니다
기존에는 포스트 프로세싱에서 관리했던 반면에
URP에서는 프로젝트 세팅 그리고 그래픽 세팅에서
현재 적용되고 있는 URP의 퀄리티 세팅
HighFidelity 여기에서 렌더링 리스트에 있는
이것을 클릭해 보시면
Screen Space Ambient Occlusion이라고 이미 적용되고 있죠
이것을 꺼보시면 이 경계의 어두운 면에 대한 처리가
현재 조금 약하게 보이게 될 텐데
이걸 다시 켜보면 어두워졌다 밝아졌다 하죠
Ambient Occlusion이라는 얘기는
Ambient 환경에 대해서
Occlusion 차폐가 되어 있다는 뜻인데
한마디로 이렇게 넓게 펼쳐진 면 같은 경우에는
어느 방향에서든 빛이 들이칠 수 있겠죠
반면에 이렇게 꺾인 면이 있다면
반대쪽에서 오는 빛은 못 받을 거고요
빛을 받을 수 있는 영역이 한정되어 있겠죠
이러한 빛을 받을 수 있고 없고에 대해서
시각적으로 표현한 겁니다
그래서 이러한 것들은 기존의 Core3D와 달리
관리하는 주체가 일부 이렇게 바뀌어 있다는 점을
여러분들이 체크하실 필요가 있습니다
모든 기능에 대해서 설명해드리지 못한 것은 아쉽지만
여러분들이 이 강의 앞단에서의 최적화, 뒷단에서의 포스트
이 두 가지를 두고 혼동하실 것 같아서
정리하는 차원에서 말씀드리면
결국에는 최적화와 포스트
포스트 이외에 그래픽 리소스와 관련되어 있는 이런 작업들은
서로 상호 보완적이라고 보시면 됩니다
퀄리티를 높게 표현을 했다
그러면 당연히 최적화가 떨어지겠죠
그러면 그것을 기술로 약간만 높이면서
덜 떨어뜨리는 식으로 간다든가 하는
전반적인 작업에서 잘 맞춰서 설정하실 필요가 있습니다
이번 단원에는 라이트 매핑과 포스트 프로세스의
활용 방법에 대하여 알아봤습니다
라이트 매핑과 연계된 리플렉션 프로브, 라이트 프로브 등
그래픽 최적화를 위한 기능과 함께
리얼타임 엔진에서 그래픽 리소스를 제어하였습니다
포스트 프로세스 등 다양한 기능은
후처리에서 리소스를 잡아먹지만
이러한 효과들이 유저들로 하여금
몰입감을 높이는 효과도 있습니다
단순히 아끼기만 하는 방식이 아닌
효율적인 비주얼 표현을 위한
밸런스를 맞추는 것이 중요합니다
이상으로 라이트맵과 포스트 프로세스에 대한 강의를 마치겠습니다
라이트 매핑(Light Mapping)
오브젝트가 빛을 받았을 때의 정보를 텍스처로 미리 저장하는 형태
스태틱 오브젝트를 대상으로 라이트에 대한 계산을 미리 하여 컴퓨터 계산의 부담을 감소시킴
라이트 세팅 Window - Rendering - Lighting 선택
Lighting Setting Asset 항목의 New 버튼을 클릭해 새로 생성 후 모드를 Subtractive로 변경
Direct Samples: 16, Indirect Samples: 256
Environment Samples: 128, Lightmap Resolution: 12로 설정
Directional Light의 모드를 Mixed로 변경 후 저장하고 Generate Lighting 버튼 클릭
그래픽 최적화 기법 라이트 프로브
Dynamic 오브젝트가 Static 오브젝트와 같은 빛을 받는 것처럼 보이게 하는 오브젝트
하이어라키창에서 Light - Point Light 선택 후 라이트 모드를 Baked로 변경
하이어라키창에서 Light - Light Probe Group 선택 후 월드 영점으로 위치
Edit Light Probe Positions 버튼 클릭 시 각각의 Probe를 선택하여 위치를 변경할 수 있음
필요한 영역만큼 프로브를 드래그하고 Ctrl + C, V를 이용해 확장함
Window - Rendering - Lighting 선택 후 Generate Lighting 버튼 클릭
라이트 비활성화 시에도 프로브가 라이트 정보를 가지고 있어 Dynamic 오브젝트에게 라이팅 효과가 전달됨
리플렉션 프로브
Dynamic 오브젝트가 Static 오브젝트와 같은 빛을 받는 것처럼 보이게 하는 오브젝트
하이어라키창에서 Light - Reflection Probe를 선택하여 추가
Bake 버튼을 클릭해 주변 환경 이미지 캡처 후 Surface Inputs의 Smoothness 수치를 높임
리플렉션 프로브를 3D 오브젝트 주변에 두면 주변 환경을 반사하는 효과를 나타냄
실시간 화면이 아닌 리플렉션 프로브가 가진 이미지로 반사 효과를 줌
라이트 프로브, 리플렉션 프로브의 활용으로 콘텐츠 작동 시 하드웨어의 부담을 줄일 수 있음
포스트 프로세싱 렌더링이 완료된 화면에 적용하는 추가적인 이미지 효과 처리
메인카메라 오브젝트에서 Rendering의 Post Processing에 체크해 활성화시킴
URP는 Volume을 통해 관리되도록 포스트 프로세싱이 내장되어 있음
블룸 효과 네온사인과 같이 빛이 자연스럽게 번지는 효과
하이어라키에서 Volume - Global Volume 선택 후 인스펙터창 Profile의 New 버튼 클릭
Add Override 버튼 클릭 후 Bloom 효과 선택
Depth Of Field 카메라 포커싱 기술을 사용하는 후처리 효과
Global Volume 인스펙터창의 Add Override 버튼 클릭 후 Depth Of Field 효과 선택
모드 활성화 후 Gaussian 모드 선택
하이어라키창의 메인카메라 선택 후 메뉴바의 GameObject - Align With View 선택
Depth Of Field의 Start와 End 항목 값을 설정하고 활성화함
Bokeh 모드 프로퍼티
Blade Count: 사용하는 블레이드 수가 많을수록 Bokeh가 더 둥글게 나타남
Focus Distance: 카메라에서 초점까지 거리를 설정함
Focal Length: 초점을 맞출 오브젝트와 카메라 렌즈 간의 거리를 기준으로 범위를 설정함
Aperture: 효과의 강도를 조절함
엠비언트 오클루전(Ambient Occlusion) 오브젝트가 겹쳐진 경계 부분을 어둡게 만드는 효과
URP에서는 Screen Space Ambient Occlusion이 기본적으로 적용되어 있음