로그인

회원가입 | ID/PW 찾기

취재

[NDC 17] 3on3 프리스타일, '뛰어난 그래픽-게임 최적화' 위한 과정

조이시티 양환의 프로그래머의 '3on3 프리스타일' 아트 포스트모템

노창호(늘보) 2017-04-25 21:38:55

프로젝트의 성장과 함께 실무자들의 성장하는 재밌는 경험을 했다서로 배우고 공유하고무수한 삽질을 함께 공유했다작업을 진행하면서 기술과 데이터 축적의 필요성을 대해 많이 느꼈다때마침 회사에서도 필요를 느껴 팀을 만들었고아티스트 역량 강화를 위한 사내 교육 시스템도 함께 구축됐다.

 

우리는 단순하지만 사실적인 라이팅, 시네마틱이 가능한 영상을 만드는 게 목표였다. 깔끔한 비주얼과 이상적인 퀄리티를 맞추기 위해서 정교하게 만들 필요성이 있었다. 조이시티 양환의 프로그래머를 통해 PS4 플랫폼으로 출시된 길거리 농구 게임 <3on3 프리스타일>(이하 3on3)가 ​글로벌 런칭하기 전까지 원하는 그래픽과 퀄리티를 올리기 위해 노력했던 과정을 들을 수 있었다. / ​디스이즈게임 노창호 기자 


 

조이시티 양환의 프로그래머 

 

 

# 단순하면서도 정교한 그림자 퀄리티를 얻기 위한 노력

 

우리는 단순하지만 사실적인 라이팅, 그리고 시네마틱이 가능한 영상을 만드는 게 목표였기 때문에 언리얼 엔진 4를 선택했다언리얼 엔진 4는 시스템적 적합성퀄리티 좋은 결과물들콘솔로 개발된 레퍼런스를 기반으로 사용하기 편하다.

 

비주얼 콘셉트를 잡기 위해서는 몇 가지 이슈가 있었다단순한 텍스처에서의 그림자 퀄리티를 올리기 위해 구상하는 것이다. 게임 특성상 농구 코트라는 좁은 시야각 안에서 빈번하게 보이는 배경의 퀄리티는 매우 중요한 요소이기 때문이다. 그러나 언리얼 엔진 4는 복잡한 텍스처에서의 그림자 퀄리티는 만족스럽게 표현되지만, 단순한 텍스처에서의 그림자 퀄리티는 불만족스러웠다.

 

 

단순한 텍스처와 복잡한 텍스처에서의 섀도 퀄리티를 비교하면 오른쪽이 우리가 원하는 그림자 퀄리티를 만들기 더 쉬워 보일 수 있다. 그러나 우리 게임 콘셉트와는 맞지 않았다. 우리가 원했던 건 깔끔한 셰이딩이 콘셉트였기 때문이다. 우리가 이상적인 퀄리티를 맞추기 위해선 정교하게 만들 필요가 있었다.

 

단순한 텍스처에서의 섀도 퀄리티와 복잡한 텍스처에서의 섀도 퀄리티는 정교함의 차이가 있다. 

 

그렇다면 깔끔한 비주얼은 어떻게 해야 할까? 다행히 <3on3>는 보여주는 공간이 농구 코트라 한정적이고, 카메라로 비치는 부분은 더욱더 제한적이기 때문에 가능성이 있었다. 그래서 모자란 부분을 보완하고 안 보이는 부분은 간략하게 하는 방식을 택했다. Lightmap Density 조절을 통해 원하는 부분의 해상도를 조절하고, 텍셀 밀도 조절을 통해 이상적인 그림자 퀄리티를 실현하려 했다.

 

  

Lightmap Density에 따른 그림자 퀄리티는 당연히 수치가 높을수록 정교하지만 가격이 비싸지는 단점이 있다. 그래서 잘 보이지 않는 부분은 밀도를 최소로 하여 제작했다. 건물에 가리거나 잘 안 보이는 것들, 그림자가 안 드리워지는 도로, 나뭇잎같이 복잡한 텍스처를 사용하는 것들을 중심으로 말이다. 그리고 일반적인 카메라 방향에서 좋은 퀄리티가 나오도록 밀도를 조절했다. 녹색 경기 코트를 보면 전반적인 게임이 이루어지는 장소이기 때문에 이상적인 텍셀 밀도를 구성했다.

 

경기가 이뤄지는 농구 코트에 집중적으로 이상적인 텍셀 밀도를 구성했다. 

최종적으로 전체적인 픽셀 밀도를 조절하여 이상적인 그림자 퀄리티를 실현했다 물론 이 모든 것들은 퍼포먼스 테스트를 병행하면서 진행했다. 이렇게 한번 기준을 정한 후, 그 기준에 맞춰 나머지 부분들은 쉽게 마무리할 수 있었다.

 

#  텍스처를 좀 더 정교하게 표현하기 위해 다양한 시도

 

이처럼 평범한 설정하면 끝나는 게 있는 반면에, 매번 힘들게 하는 것들이 있다. 그것이 바로 PBR(Physically Based Rendering)이다. 여러분들은 이미 잘 알고 계시겠지만 기본적으로 베이스 텍스처와 노멀 텍스처가 들어간다. 여기에 메탈릭 텍스처와 러프니스 텍스처를 넣어 좀 더 실제와 같이 표현한다. 하지만, 설정값을 수정하면서 텍스처를 만드는 작업에 시간이 너무 많이 소요됐다. 그래서 실시간으로 직접 확인하면서 작업할 수 있는 방법을 구성했다.

 


 

그래서 아래 예시와 같이 노란 부분과 회색 부분에 마스크 텍스처 처리하고, 마스킹 된 영역은 독립적으로 메탈릭과 러프니스를 값을 수치로 조절해 확인하며 작업할 수 있게 제작했다. 이러한 방법으로 우리는 언제든지 쉽게 질감을 바꿔볼 수 있게 됐고, 인스턴스를 통해 비슷한 다른 재질을 재생산할 수 있게 되었다. 그 덕분에 작업이 쉬워지고 리스크가 줄었다

 

 마스크 텍스처를 활용한 방법으로 재질이 어떻게 변하는 지 실시간 확인할 수 있었다.

 

위의 작업을 통해 제작에 들어가는 리소스가 줄었으니, 디테일을 좀 더 끌어올리기 위해 고민했다그래서 노멀 사이즈에 디테일을 넣어봤는데 그 결과물은 아름답지 않았다. 그렇다면 재질의 세부 디테일을 어떻게 하면 좋게 넣을 수 있을까라고 고민한 결과, 우리는 프라이머리 텍스처(기본 형태)와 세컨더리 텍스처(패턴)를 조합해서 사용하기로 했다.

 


 

그래서 프라이머리 텍스처에 세컨더리 텍스처를 타일링(Tiling) 시켜서 적용시켰다. 타일링이란 컴퓨터 그래픽에서 화면상의 특정 영역에도 형태나 패턴이 서로 겹쳐지지 않도록 채워넣는 것을 말한다. 단독으로 텍스처를 사용했을 때와 두 가지 텍스처를 사용했을 때의 퀄리티를 서로 비교해봤을 때, 정교함이나 완성도 면에서 확실히 큰 차이를 보여준다. 그리고 그림자 퀄리티 또한 좋아졌다.

 


 

이러한 방식을 모든 곳에 적용했다. 그리고 확대해서 봐도 꽤 높은 수준의 퀄리티를 보여준다. 이러한 환경을 구축하기 위해서 일반적으로 사용할 만한 패턴 제작이 필요했다. 각각의 실무자들이 따로따로 제작하다보면 중복되는 게 많아지기 때문이다. 그래서 우리는 일정 기간마다 피드백을 주고 받고 범용적으로 사용할 수 있는 텍스처를 모아 '텍스처 데이터 베이스화'를 진행했다

 


 

시스템을 구축한 이후, 우리는 그때그때 필요한 텍스처를 가져다 사용할 수 있게 됐다결과적으로 우리는 적은 비용으로 꽤 근사한 퀄리티를 얻을 수 있었다. 그리고 이렇게 제작된 캐릭터는 따로 가공하지 않고 게임 영상에서 그대로 사용할 수 있었다.

 

<3on3 프리스타일> 오픈 베타 트레일러 

 

#  농구 경기를 구경하는 군중 NPC 300명을 넣기 위해 시도한 방법

 

게임이 이렇게 질적으로 좋은 성과가 나올 무렵 양적으로 해결해야 하는 것들이 생겼다. 게임에서 활기찬 경기장 분위기를 위해 다수의 군중이 필요했다. 위에선 많으면 많을수록, 넣을 수 있을만큼 넣어달라고 말을 했다. 그럼 대략 몇 명 정도로 넣어야 하는지 물어봤더니 300명이라고 하더라.

 


 

우리는 300명을 넣기 위해서 단순한 형태로 군중을 제작했다. 처음 NPC를 게임에 넣고 퍼포먼스 테스트를 한 결과는 굉장히 비관적이었다. 우리가 목표로 잡은 프레임보다 굉장히 낮았기 때문이다

 


 

우리는 먼저 최적화를 위해 NPC를 그룹화했다. 초기엔 4명의 NPC를 하나로 묶어 드로우 콜을 줄이는 데 노력했다. 더 나아가 그 다음엔 16명의 NPC 그룹을 묶었다. 그중 앉아있는 NPC는 다리 본을 제거하고, 일부는 한쪽 팔의 본을 제거했다. 이처럼 불필요하거나 사용빈도가 낮은 부분을 줄여 좀 더 최적화할 수 있었다이렇게 최적화 작업을 진행하고 약 8프레임의 성능 향상을 경험할 수 있었다

 

 

그러나 최적화 작업 이후에도 우리가 목표로 생각한 프레임에 도달하지 못했다. 그래서 각각 NPC에 캡슐 섀도를 적용하기로 했다. 캡슐 섀도는 가상의 캡슐을 생성해 간략한 그림자를 표현해서 매우 저렴한 비용으로 그림자를 만들 수 있는 간단한 방법이다. 우리는 그 당시 꽤나 매력적인 부분이었다. 만들어 놓았던 캐릭터를 그대로 유지한 채로 간단하게 퍼포먼스를 높일 수 있었던 획기적인 방법이었기 때문이다.

 


 

무엇보다도 다행인 것은 NPC에 캡슐 섀도를 적용했을 때 큰 이질감이 없었다는 것이다. 물론 디테일 차이가 있지만 캡슐 섀도의 단순한 형태가 NPC와 꽤 잘 어울렸다이렇게 최적화 작업을 통해 최초 8프레임 도달 이후 추가 작업한 결과, 약 10프레임의 성능 향상을 가져왔다. 이후 추가 작업으로 게임 플레이 시 50프레임 이상을 유지할 수 있게 됐다이렇게 해서 배경과 캐릭터, NPC 작업을 마칠 수 있었다.

 

 


# 언리얼 엔진 4를 이용한 콘솔 게임 개발 후기


마지막으로 언리얼 엔진 4를 이용한 콘솔 게임 개발 후기를 나누고자 한다. 첫 번째로 PS4는 스펙이나 환경적으로 윈도우와는 많이 달랐다. 하지만 매번 플스 개발킷에 넣고 확인하기엔 굉장히 번거로웠기 때문에 PC를 비슷한 사양에 맞춰 사용했다.

 

 

두 번째로 프레임 측정은 프로젝트 전체의 방향에 영향을 줄 수 있을 만큼 중요한 부분이다, 그렇기에 가능하면 올바른 정보를 전달해야 한다. 그래서 우리는 몇 가지 주체를 만들었다. 프레임 측정  MS(밀리 세컨드) 측정할 때 보여주는 수치를 바로 측정하지 않고, 발열이나 데이터 누적 등 다른 요인으로 지연이 발생할 수 있다. 그래서 프레임 안정화 시간을 충분히 두고 프레임을 측정해야 한다. 콘솔은 그나마 발열에서 자유로운 편이지만, 여러분이 모바일 분야를 개발한다면 주의하기 바란다.

 


 

세 번째로 PS4 SDK 업데이트가 진행되면 언리얼 엔진 업데이트도 진행해야 한다. 보통 플스가 개발 키트 버전을 내놓으면, 언리얼 엔진은 그에 맞춰 새 버전의 개발 키트를 추가해준다. 그렇기 때문에 과도한 엔진 커스텀을 하면 마이그레이션이 괴로워질 수 있다. 우리는 엔진을 과도하게 커스텀 하지 않고 필요한 부분에 한해 적용했고, 엔진 밖에서도 해결 가능한 부분을 적극적으로 외부에서 해결하는 식으로 진행했다.

 


 

네 번째로 언리얼 엔진 업데이트에 귀 기울여야 한다. 앞서 말한 마이그레이션도 포함되는 부분이지만 꽤 좋은 기능이 추가되는 경우가 많다. 앞으로 개발해야 하는 기능이 업데이트 이후 자동으로 추가되는 경우도 있고, 고질적인 문제가 해결되는 경우도 굉장히 많다. 그렇기 때문에 현재 언리얼 엔진을 사용하고 있다면 엔진에 향후 패치 계획도 같이 살펴보면 좋을 것이다.