유니티 퀄리티 설정 - yuniti kwolliti seoljeong

기본적으로 좋은 레벨(environment)디자인과 캐릭터 디자인 등 아트워크가 되야 하겠습니만, 저도 초보일 때, 이렇게 칙칙한 느낌밖에 안돼는 건가 싶을 때가 있었습니다.
사실 그 때는 그래픽이 문제가 아니라 당장 게임이 돌아가도록 구현하는 방법을 배우는데 몰두해 있어서 그닥 신경을 쓰지도 않았습니다만, 어느정도 유니티를 익히고 난 후, 다른 게임들이나 튜토리얼 등을 보니 그래픽 수준이 달라도 너무 다른데 제 프로젝트는 아무리 해도 흉내내기도 쉽지 않더군요.
어느 튜토리얼에서 보고 알게 되었는데, 포스트 프로세싱과 라이트 베이킹을 전혀 몰랐던게 문제였습니다.
사실 Light 를 Baking 하는 것은 단순히 내가 구성한 Light들을 씬 전체적으로 묻어나도록 하는 것만이 아니죠. 여기에는 GI를 사용해서 씬 전체를 Lighting해서 Baking 할 수 있다는 큰 차이점이 있습니다.
그렇기에 그래픽 차이는 엄청나게 다릅니다. ^^;
그걸 모르니 아무리 뭘 건드려봐도 칙칙한데서 벗어나기가 힘들었습니다.

다음은 블룸이펙트 등으로 대변되는 포스트 프로세싱 입니다.
이는 CG 애니메이션에도 적용되는 이야기인데요.
사실 CG 애니메이션 초보자는 맥스, 마야같은 3D 툴을 배우고는 이 안에서 애니메이션을 만들고, 편집 소프트웨어에서 영상을 편집해서 CG애니메이션을 완성하는 파이프라인 워크플로우만을 알고 있는 경우가 많습니다.
어떻게 해서든 마야 같은 3D 툴 내에서 라이팅, 렌더링 퀄리티와 수준을 올려야 사용 애니메이션 수준이 나올 수 있다고 생각하는데, 저도 그랬습니다^^
특히 제가 CG를 시작한 당시에서 꽤나 오랜동안 그 분야의 대부분이 포스트 프로세싱에 관심을 두질 않았습니다.
지금은 Nuke, AfterEffects 드에서 작업하는 디지털 포스트 프로세싱에 대해서 워낙 알려지긴 했습니다만.
프로덕션 수준과 가장 크게 다른점은 Nuke 등에서 포스트 프로세싱을 더해주느냐 하는데 있다고 말 할 수 있을 정도로 차이가 나곤하는데, 게임도 그렇습니다.

솔직히 현재의 기준으로는 정말 많이 따라오기는 했습니다만, 여전히 유니티보다는 언리얼이 그래픽 적으로 좀 더 나은 것 같습니다.

그런데 각 엔진의 초기 작업 화면에서 보여지는 만큼 차이가 나는 것은 아닙니다.

무슨 말인가 하면, 유니티를 가지고 프로젝트를 처음 시작했을 때의 그래픽 퀄리티는 말할 수 없이 조잡합니다.
여기엔 그래픽 품질을 올려줄 수 있는 도구들이 아무것도 장착되지 않은 상태라서 그렇습니다.
반면에 언리얼의 경우는 프로젝트를 시작할 때부터 매우 간단해 보이는 씬이라도 뭔가 라이팅이나 그래픽적인 퀄리티가 유니티와 너무나 수준이 달라보입니다.
이 이유는 언리얼은 기본적으로 포스트프로세싱이 적용된 화면에서 시작하도록 되어 있기 때문입니다.
그 바람에 언리얼은 작업환경이 기본적으로 엄청 무겁습니다. 고사양 작업환경이 요구되는 이유기도 하죠.

유니티도 언리얼같은 느낌을 낼 수 있는데, 현재 버전에서 해 줄 수 있는 것들을 간단히 정리하면,

1. Gamma -> Linear 로 바꿔서 컬러스페이스를 바꿔줄 수 있습니다. (OpenGL ES2.0 이전에선 지원되지 않아서 모바일 사용은 제약이 좀 있다고 할 수 있겠습니다)

2. Lighting 에서 Global Illumination 과 Final Gather 등과 여러 환경 옵션을 Baking 해주면 엄청나게 그래픽적으로 향상됩니다. 사실 Light 세팅이란 것이 Scene의 Look을 향상시키는데 워낙 절대적이어서, CGI에 관련된 어디에나 Lighting 전문 아티스트가 존재할 정도이죠. 당연히 Scene을 어떻게 Lighting 하느냐에 따라 수준은 매우 크게 차이가 나긴 합니다만...
(또 Light mapping은 모바일에서도 사용이 되는 기능입니다. 다만 해상도 등 모바일에 적절한 세팅을 사용합니다)

3. 포스트 프로세싱을 적용합니다.
이전에는 유니티에서 제공하는 포스트프로세싱이 그럭저럭이긴 했지만, 그렇게 뛰어나진 않아서 에셋스토어에서 찾아 보시면 매우 품질이 뛰어난 판매되는 에셋들을 구입해 사용하기도 했습니다.
 요즘은 좋아진 것이 유니티 데모(ADAM같은)에서 사용되었던 최고 품질의 포스트 프로세싱 에셋을 유니티에서 제공해서, 매우 좋은 품질의 무료에셋스토어를 받으실 수 있는데, 위 영상에서 보여주듯이 에셋스토어 가셔서 post processing stack으로 검색하시면, 유니티에서 직접 제공하는 에셋을 받아서 사용하실 수 있습니다. (GitHub로 가시면 v2를 받으실 수도 있는데 사용법은 약간 다릅니다)
조금 안타까운점은 이 포스트프로세싱 모두를 맘껏 모바일에서 사용할 수는 없는 것인데, 모바일 하드웨어도 워낙 빠르게 좋아지기 때문에, 점점 수용할 수 있는 부분이 넓어지고는 있습니다. (사실 최고품질 수준인 post processing stack의 경우 블룸같은 기능을 모바일에서 사용 가능할지 모르겠습니다. 저도 아직은 테스트해보질 않았습니다. 요즘은 블룸정도는 모바일에서도 도입하곤 하는데, 저의 경우는 기존까지는 에셋스토어에서 모바일용으로 최적화된 에셋을 사용해 왔습니다)

4. 여러가지 좋은 쉐이더를 개발하거나 사용하는 것입니다. 위 영상에서는 에셋스토어의 UBER Shader를 소개했네요...(저도 구입해서 갖고 있긴 합니다만, 모바일을 개발하다보니 아직은 Z버퍼 사용외에는 크게 도움이 되지는 않고 있습니다만) 이 밖에도 아주 많은 고품질 쉐이더 들이 있습니다.

06
19

Unity/프로그래밍

유니티 실시간으로 퀄리티 세팅 바꾸기 ( Unity Quality setting in runtime )

반응형

 

QualitySettings.antiAliasing = antialiasing*2; // 0 : 안함 / 2 : x2 / 4 : x4 인것에 주의.

QualitySettings.masterTextureLimit = 0; // 텍스쳐 정상사이즈
QualitySettings.masterTextureLimit = 1; // 반사이즈

QualitySettings.vSyncCount = 1; // 수직동기화 ON        
QualitySettings.vSyncCount = 0; // 수직동기화 OFF

Application.targetFrameRate = 30; // 30프레임
Application.targetFrameRate = 60; // 60프레임

AudioListener.volume = 0.5f; // 볼륨 0~1f

 

반응형

공유하기

게시글 관리

구독하기맨텀

저작자표시 비영리 변경금지

'Unity > 프로그래밍' 카테고리의 다른 글

유니티 Unity ABC 파일 alembic 파일 넣기  (0)2018.11.13유니티 구조체 인스펙터 창에서 보기 Unity struct inspector  (0)2018.11.11Touch Ray로 3d오브젝트 선택하기  (0)2018.06.11텍스트 타이핑 효과  (0)2018.06.08유니티 터치 줌, 이동 Unity Touch UI Zoom and Panning  (1)2018.06.07

COMMENT 0

 

  • 이 글엔 댓글이 아직 없습니다.

secret

WRITE

Web GL이 기본적으로 전체화면 취소 버튼에 Escape가 할당되어 있어서 그런지 Escape 버튼이 조금 오락가락한다. Web GL에서 테스트하는데 한 번 눌러서 작동하지 않는다면 두세 번 눌러보자. 

 

보면 단축키 탭도 있는데 이건 지금 하기엔 키 할당 되어있는 기능도 거의 없어서 나중에 한다.

 

이거 만드는 과정에서 UI 관련하여 꽤 공을 많이 들였는데 글로 작성하려니 재미도 없고 시간도 오래 걸리고 쓸데없는 내용만 길어져서 생략했다.

WebGL에서 직접 조작해보고 깃허브 코드 보면서 궁금한 게 있다면 언제든지 질문 바란다.

 

일단 언급만 해두자면...

- 켜진 캔버스는 Escape 버튼(ESC)으로도 닫을 수 있다. 여러 개 켜져 있으면 역순으로 꺼진다.

- 그래픽 설정은 변경해도 바로 반영되지 않는다. 적용 버튼을 눌러야 한다. 변경한게 있는데 그냥 닫으려 하면 경고하고 적용 버튼을 누르면 15초 안전장치가 마련되어 있다.(단, Web GL은 해상도 및 전체 화면 여부 변경이 플레이어 내에서 불가하다.)

- 사운드 및 게임플레이 관련 설정은 수치를 조절하면 즉시 반영 및 저장된다.

- 주변에 들어가면 BGM이 재생되는 핑크색 박스가 3개 있다. BGM 재생 및 페이드 교체 테스트 용도로 만들었다.

 

 

유니티 퀄리티 설정 - yuniti kwolliti seoljeong

esc를 누르면 나오는 일시정지 창.

재시작은 뭔가 허전해서 넣었다.

종료는 Web GL 플랫폼에선 비활성화되도록 해놓았다. 다른 플랫폼에선 작동한다.

 

설정을 들어가자

 

유니티 퀄리티 설정 - yuniti kwolliti seoljeong

탭은 심플하게 구성.

설정에서 건든 것은 다음에 게임을 다시 켜도 저장되어있어야 하므로 PlayerPrefs에서 데이터를 관리한다.

좌상단의 디버깅용 저장 값 초기화 버튼은 그걸 초기화시켜준다.

개발 도중 값의 사용처가 바뀐다든가 등의 이유로 이전 값이 그대로 오면 난감한 경우 사용하기 위함이다.

 

UI 배경을 반투명으로 하니 일시정지 창이랑 겹쳐서 별로 이뻐 보이진 않는데 그래픽 변화를 보다 잘 보이게 하기 위해 그냥 반투명으로 뒀다.

그래픽은 애초에 신경 쓰지 않기로 했으니 미관 문제는 넘어가자

 

그래픽 설정에서 변경 가능한 부분은 해상도, 전체 화면, 주사율, 텍스처, 그림자, 안티앨리어싱, 수직 동기화, 비등방성 필터링이 있다.

이 설정들이 선정된 이유를 묻는다면

 

유니티 퀄리티 설정 - yuniti kwolliti seoljeong

별거 없다. 그냥 Unity 퀄리티 세팅에서 변경 가능한 옵션들이 위와 같다. (해상도나 주사율 등은 퀄리티 세팅과 무관하지만 디스플레이 영역도 그냥 포함했다)

 

디테일한 설정들은 제외하고 다른 게임에서도 흔히 볼 수 있는 대표 그래픽 요소들만 가져왔다.

 

여기서 더 많은 요소를 조정하고 싶다면 PostProcessing이나 쉐이더 요소를 건드릴수 있는 옵션이 있으면 좋겠지만 이 프로젝트는 그래픽을 신경 쓰지 않으니 넘긴다.

 

위에 나열한 그래픽 설정 요소들은 전부 유니티 API로 변경이 가능하다.

        //그래픽 설정 변수
        private static int resolutionWidth;       //해상도 너비
        private static int resolutionHeight;      //해상도 높이
        private static int fullScreenMode;        //전체 화면               //0: 전체화면, 1: 전체 창보드, 3: 윈도우 (2도 전체 창모드이나 MAC 전용이라 제외)
        private static int framerate;             //주사율
        private static int textureQuality;        //텍스처                  //0 ~ 2, 0이 제일 고해상도 텍스처 사용
        private static int shadowQuality;         //그림자                  //0 ~ 3, 3이 제일 고해상도 텍스처 사용
        private static int antiAliasing;          //안티앨리어싱            //0: 안함, 2: x2, 4: x4, 8: x8
        private static int vSync;                 //수직동기화              //0: 끄기, 1: 켜기
        private static int anisotropicFiltering;  //비등방성 필터링         //0: 끄기, 2: 켜기
         
         
        //그래픽 변경 적용
        Screen.SetResolution(resolution.Item1, resolution.Item2, (FullScreenMode)fullScreenMode);
        Application.targetFrameRate = framerate;
        QualitySettings.masterTextureLimit = textureQuality;
        if (shadowQuality == -1)
        {
                QualitySettings.shadows = UnityEngine.ShadowQuality.Disable;
                QualitySettings.shadowResolution = ShadowResolution.Low;
        }
        else
        {
                QualitySettings.shadows = UnityEngine.ShadowQuality.All;
                QualitySettings.shadowResolution = (ShadowResolution)shadowQuality;
        }
        QualitySettings.antiAliasing = antiAliasing;
        QualitySettings.vSyncCount = vSync;
        QualitySettings.anisotropicFiltering = (AnisotropicFiltering)anisotropicFiltering;

변수로 위와 같이 두고 적용은 아래와 같이 둔다.

 

resolutionWidth과 resolutionHeight는 각각 resolution.Item1, resolution.Item2에 대응한다.

https://github.com/jab724/Kupa3DRPG/blob/main/Kupa3DRPG_SRC/Assets/01.%20Scripts/Option/Option_Graphic.cs