'도깨비, 붉은사막, 플랜8' 만드는 펄어비스의 차세대 엔진은?

게임뉴스 | 박광석,유희은,남기백 기자 | 댓글: 71개 |



  • 주제 : 차세대 엔진 개발 포스트모템
  • 강연자 : 고광현 - 펄어비스 / 리드 엔진 프로그래머
  • 발표분야 : 개발, 엔진
  • 강연시간 : 2021.11.19(금) 14:00 ~ 14:50
  • 강연 요약 : 고광현 리드 엔진 프로그래머는 R2, 검은사막 리마스터, 검은사막 모바일, 검은사막 콘솔을 개발했으며, 현재 펄어비스 차세대 엔진을 개발하고 있다. 펄어비스의 차세대 엔진에 사용되고 개발됐던 다양한 기술들을 소개하면서 무엇을 목표로 했고, 왜 그런 기술들을 개발했고, 또 어떻게 사용되고 있는지 개괄적으로 설명한다. 또한 이를 이용해 자사의 여러 가지 신규 프로젝트가 어떻게 개발되고 있는지 소개하고 앞으로 어떠한 기술들이 추가적으로 적용될 예정인지 언급한다.



  • ■ 펄어비스는 왜 '차세대 엔진 개발'에 나섰나? - "고품질의 게임을 빠르게, 더 많은 유저들에게 제공하겠다"

    고광현 리드 엔진 프로그래머는 본격적인 발표에 앞서 펄어비스가 왜 차세대 엔진 개발에 착수하게 되었는지에 대해 먼저 이야기했다. 펄어비스가 새로운 게임을 준비할 때 중요하다고 생각하는 기본 가치는 '빠르고 효율적으로 게임을 만들 수 있는가'에 있다. 게임의 품질이 개선될수록 게임 하나를 만들기 위해서 점점 더 많은 시간과 노력, 인력, 그리고 비용이 들어간다. 이는 커다란 리스크라 할 수 있으므로, 이를 효율적으로 하기 위해선 많은 부분이 자동화되어야 했다.

    또한, 프로젝트의 방향성이 오픈 월드 구조에 있다 보니, 사용자가 광활함을 느낄 수 있도록 하기 위한 원경 표현력이, 눈앞에 보이는 광경의 품질 역시 소홀히 할 수 없으므로 근경 표현력 역시 놓칠 수 없는 중요 요소가 됐다.

    이외에도 펄어비스가 동시에 진행 중인 여러 신규 프로젝트들은 물론, 향후에 진행될 프로젝트에까지 두루 쓰일 수 있어야 했고, 다양한 플랫폼에서 구동되도록 하는 것 역시 중요한 가치 중 하나였다. 요컨대 '고품질의 게임을 빠르게, 더 많은 유저들에게 제공할 수 있게 하는 것'이 펄어비스 차세대 게임 엔진의 핵심 가치인 셈이다. 고광현 프로그래머는 이러한 마음가짐으로 엔진을 만들기 시작했으며, 강연을 통해 소개할 여러 기능들이 모두 이러한 요구들을 반영한 결과라고 이야기했다.






    ■ 펄어비스 차세대 엔진의 '라이팅(Lighting)'

    펄어비스 차세대 엔진 기능 소개 첫 번째는 '라이팅(Lighting)'이다. 라이팅은 렌더링의 핵심으로 아주 사소한 것의 표현에서부터 사실적인 화면의 출력에까지 반드시 필요한 요소이자 근간이라고 할 수 있다. 그는 펄어비스의 핵심 가치 중 하나인 '빠른 개발'을 이루기 위해, 프리베이킹(Prebaking)처럼 긴 시간이 필요한 사전 처리들을 최소화할 필요가 있었다며, 그러기 위해 라이팅도 사전 처리 없이 실시간으로 변화하는 환경을 반영할 수 있어야 했다고 설명했다.

    광원에서 직접적으로 보이는 영역인 '직접 조명(Direct Lighting)'은 많은 라이트 처리를 위해서, 또 관리의 용이성 때문에 클러스터드 셰이딩(Clustered Shading)을 적용했고 이는 모두 동적인 광원이다. 화면의 Frustum 영역을 격자로 나누고 이를 '클러스터(Cluster)'라고 지칭했다. 클러스터 영역과 교차하는 광원들을 해당 클러스터의 저장공간에 등록해놓고 조명 계산시 대상 픽셀의 좌표를 통해 클러스터에 접근하여 광원을 얻어 라이팅 하는 방법이다. 몇 가지 광원 종류를 지원하며, BRDF는 GGX Smith를 사용했다.

    면적광(Area Light)은 Point Light나 Spot Light에 비해 무겁지만, 사실적인 표현을 위해 사용될 필요가 있다. 펄어비스의 차세대 엔진은 Approximate Importance Sampling을 일부 최적화하여 사용중이고, Quad, Disk, Tube, Sphere 등의 모양을 제공한다. Point Light, Spot Light와 달리 Shadow Map으론 직접적으로 그림자가 나올 수 없는 구조이기 때문에 Raymarching이나 Raytracing을 이용하여 그림자를 적용했다.



    ▲ 면적광원을 거칠기가 다양한 표면 위에 배치한 후 라이팅을 적용한 이미지



    ▲ 면적광원에서 지원하는 형태의 일부. Tube, Disk, Quad가 배치되어 있다.
    Tube는 형광등이나 광선검에 배치해서 사용할 수 있고, Quad는 전광판 등에 사용할 수 있다.



    ▲ 그림자 처리가 없을 때, 그리고 레이트레이싱, 레이매칭을 이용한 그림자 표현 시의 이미지

    IES 프로필은 광원의 공간상에서의 광분포를 기록한 파일 형식으로, 광원을 배치할 때 IES 프로필을 이용하여 사실적인 형태와 세기를 표현할 수 있다. IES 프로필은 조명 제조사에서 공개하는 경우가 많으므로 접근이 쉬운 편이다.

    펄어비스에서는 좀 더 사실적인 광원 표현을 위해 물리 단위(Physical Units)를 사용했다. 이 경우 조명 제조사에서 공개한 제품들의 물리적인 정보를 포함하여 이미 측정된 광원들의 정보가 많이 있기 때문에 광원을 설정할 때 맞는지 틀린 지 고민할 필요가 없고, 렌더링 시 빛의 절대적인 기준으로 쓰기에 적합하다.

    직접 조명 그림자의 방향광에는 CSM(Cascaded Shadow Map)이 사용됐고, Point와 Spot Light에는 매시브 섀도우(Massive Shadow) 방식이 도입됐다. 또한 Raymarched Shadow 방식을 혼용하여 레이트레이싱 그림자도 지원한다. 여기서 매시브 섀도우는 풀 형태로 텍스쳐 공간이 마련되고, 카메라가 이동하면 카메라와 광원의 거리를 체크하여 가까울수록 더 넓은 영역을 제공하도록 재구성된다. 이를 통해 이론적으로 수백 개의 광원의 그림자를 표현할 수 있다. Point Light는 사면체로 구성하여 육면체보다 더 나은 성능을 달성할 수 있게 됐다.



    ▲ 매시브 섀도우 풀을 출력한 화면. 거리 별로 제공되는 면적이 달라진다.
    Point Light의 그림자가 사면체로 구성된 것도 확인할 수 있다.

    매시브 섀도우도 동적인 개체와 광원의 숫자가 너무 많으면 성능 문제가 발생한다. 펄어비스에서는 이를 방지하기 위해 'Raymarched Shadow' 방식을 고안했다. 간접 조명을 위한 복셀 구조에서 Signed Distance를 얻을 수 있고, 이를 광원방향으로 트레이싱하여 광원을 만나기 전에 히트되는 복셀이 있는지 체크하는 방식이다. 해당 구조에서 표현이 힘든 디테일은 스크린 뎁스를 레이마칭하면서 섀도잉을 체크하게 된다. 이를 통해 클러스터당 32개, 즉 거의 모든 빛의 그림자를 표현할 수 있게 됐다.

    캐릭터의 경우 추가적인 캡슐로 근사하여 정보를 구성하고, Signed Distance를 구할 때 함께 처리하게 된다. Area Light는 모양에 따라 Ray를 생성하고, Point Light나 Spot Light는 광원 크기에 따라 Ray를 생성하여 자연스러운 페넘브라 표현이 가능하게 됐다. 개더링 시에는 중간 결과의 인접 샘플을 활용하여 디노이징(Denoising)을 수행하고, 이를 Temporal Reprojection을 이용해 안정시킨다.

    Raytraced Shadow는 레이마칭과 같은 구조를 사용하지만 교차 판정에 레이트레이싱을 이용한다. Any Hit Query는 상대적으로 빠르고, 지역 광원의 그림자는 비교적 가까운 곳에서 히트되는 경우가 많아 다소 가벼운 편이다.



    ▲ Massive Shadow와 Raymarched Shadow를 적용하면 더욱 디테일한 표현이 가능해진다



    ▲ Raytraced Shadow를 적용한 경우. 하드웨어 지원 여부에 따라 적합한 것을 선택해서 사용할 수 있다.

    간접 조명은 복셀 기반의 형식을 사용하고, 동적으로 계산되며 사전 처리 없이 바로 반영된다. 여기에 SDF(Signed Distance Field)가 추가됐고, 디노이징이 개선됐으며, 레이트레이싱과이 연계 역시 변경점 중 하나라고 볼 수 있다.

    복셀 기반 형식은 클립맵(Clipmap)으로 이루어져 있으며 성능과 품질을 참고하여 각 클립맵당 128 x 64 x 128 크기로 구성됐다. 용도에 따른 다양한 복셀 클립맵이 존재하고, Irradiance Voxel, Indirect Irradiance Cache Voxel, Sky Visibility Voxel, Signed Distance Voxel, Axis-Aligned Distance Voxel 등이 이에 해당한다.

    먼저 Irradiance Voxel은 디퓨즈 라이팅 결과를 저장하는 공간이다. 신 라이팅 결과와 오프스크린 분산처리로 이 결과가 다시 여러 프레임에 걸쳐 반영되어 멀티 바운스 효과를 낸다. 오프스크린 분산처리는 화면에서 보이지 않는 영역 처리를 나타낸다.



    ▲ 장면의 디퓨즈 최종 결과는 Irradiance Voxel에 이런 모습으로 구성된다

    Indirect Irradiance Cache는 알베도가 제외된 디퓨즈 인다이렉트 라이팅만을 저장하여 파티클, 반투명 등 포워드 라이팅에 사용된다. 방향성을 위해 구면조화를 사용하지만 채널 전체를 다루기에는 용량이커서 YCoCg로 인코딩하여 Y만 구면조화로 다루게 된다.

    Density와 Material은 별도의 용도를 위해 저장된다. 이 또한 신 라이팅과 오프스크린 분산 처리를 통해 생성된다. Sky Visibility Voxel은 포워드 라이팅이나 몇몇 부분에서 하늘 가시성 체크가 필요한 경우에 사용되고, Indirect Irradiance Cache Voxel과 함께 생성된다.

    Signed Distance Voxel은 일반적으로 알려진 SDF(Signed Distance Field) 구조와 동일한 형태로, 여러 곳의 충돌 처리나 섀도우 체크 용도로 사용된다.



    ▲ Indirect Irradiance Cache Voxel의 예시 이미지



    ▲ Signed Distance Voxel, Signed Distance Voxel의 예시 이미지

    이때, 펄어비스에서는 빠른 트레이싱을 위해 'Axis Aligned Distance Voxel'이란 것을 고안해냈다. 각 축 방향으로 빈 복셀 수를 저장하여 AABB 영역을 구하고, 레이마칭시 Ray와 AABB의 교차지점까지 건너뛰어 가속시키는 구조다. A 채널에는 오파시티, 캐릭터 캡슐 인덱스 등의 부가 정보가 저장된다. 2 Pass를 통해 계층적으로 병합하는 방식으로 생성하고 표면에 평행하게 진행되는 트레이싱에 유리하다. 단독 트레이싱으로도 러프한 오클루션을 구할 수 있으며, 디퓨즈 간접 조명을 위한 원거리 표현에 사용한다.

    레이트레이싱은 Closest Hit Query로 별도 셰이딩 없이 복셀 캐시를 이용해 성능을 높였다. 여기에도 역시 임포턴스 샘플링이 사용됐고, 히트 디스턴스만 저장한 후, 이를 이용해 히트 포지션을 구해 Irradiance를 샘플하는 방식이다.

    앞서 소개된 방식을 타일로 나뉜 화면 영역에 3-Band SH를 이용하여 저장하고, SVGF(Spatio-Temporal Variance Guided Filter)를 적용 후 Bilateral Upsampling 한다. 타일 중심과 거리가 멀어 샘플을 구할 수 없을 경우, Indirect Irradiance Cache Voxel을 사용한다. 이때 SH Dominant Direction 기반으로 Bilateral Sampling을 적용하게 된다.



    ▲ 레이마칭을 이용한 화면. 아래는 여기에 디노이징과 SSAO, 레이트레이싱을 적용했을 때의 화면이다

    스페큘러 간접 조명은 가장 디테일한 SSR(Screen Space Reflection)을 우선으로 한다. 하지만 SSR에서 구할 수 있는 정보가 없다면 해당 위치 부근은 디퓨즈처럼 복셀을 이용하고, 이 또한 정보가 없다면 큐브맵을 사용한다. 큐브맵 구성시에는 뎁스까지 기록하고, 이를 이용해 레이마칭하여 값을 구하게 된다. 큐브맵은 Parallax 오류를 최소화하기 위해 원경 위주로 사용한다. 각 재질별로 다른 BRDF를 사용하는데, 각 BRDF에 맞는 임포턴스 샘플링 수행하며 머리카락이나 의상의 경우, Anisotropic PDF를 미리 계산하여 사용한다.

    스페큘러 간접 조명의 디노이징은 Recurrent Blur, Wavelet Filter를 사용하고 Temporal Reprojection을 통해 안정화한다. Recurrent Blur는 Pre Blur와 Disocclusion Fix를 처리하는데 사용되고, Post Blur를 Wavelet Filter로 대체하여 디테일을 살리면서 노이즈는 감소시켰다.



    ▲ Recurrent Blur, Wavelet Filter를 모두 접목하면 디테일이 더 잘 처리되는 것을 확인할 수 있다



    ■ 펄어비스 차세대 엔진의 '대기(Atmosphere)' 처리

    펄어비스 차세대 엔진의 대기(Atmosphere) 표현에는 구름 해상도를 높이기 위한 프레임 분산 방식과 업스케일링 개선이 추가로 적용됐다. 여기서 핵심은 다양한 대기 현상을 각각 처리하는 것이 아닌, 대기 표현에 필요한 항목들을 한 번에 처리하는 방식이다. 이를 통해 하늘, 태양, 달. 구름, 안개, 빛줄기 등의 표현이 가능해진다. 여기에 Multi-Scattering을 지원하고 근거리, 원거리 방식을 혼합하여 표현하는 것이 특징이다.

    근거리의 경우 Froxel이라고 불리는 Frustum Aligned Voxel이 사용됐다. 방향광 이외에 지역 광원들의 라이팅과 그림자가 포함되고, 방향광 그림자의 경우 Cascaded Shadow Map을 이용한다. 각 광원이 대기 혹은 안개를 비추며 발생하는 그림자는 Froxel내에 주입된 안개의 Density를 광원 방향으로 짧게 누적시켜 계산한다. 원한다면 다양한 모양의 안개 볼륨을 배치할 수 있으며 클러스터에 안개 볼륨 정보를 구성해 최적화했다. 



    ▲ Froxel을 이용한 햇살 표현 이미지 예시

    Froxel로 원거리를 표현하는 것은 메모리나 성능면에서 적합하지 않으므로, 원거리 레이마칭을 통해 나머지 영역을 표현하게 된다. Air/Aerosol Density를 이용하면 방향광의 감쇠 정도를 알 수 있고 이를 이용해 직접 조명에 쓰일 방향광의 세기를 근사할 수 있다.

    여러가지 테이블과 구름 밀도 정보, 높이 안개 정보, 행성 정보, 대기의 두께, 대기의 상태, 공기 밀도, 수분 밀도, 태양의 각도 등을 이용하여 원거리 레이마칭을 수행하고, 산란 공식을 이용해 적분을 수행하면 Aerial Perspective와 구름, 높이 안개, 빛 줄기, 파란 하늘까지 전부 표현할 수 있다. 이렇게 한 번에 처리하게 되면 개별 처리 후 혼합 시 나올 수 있는 단절이나 어색함을 해소할 수 있어 자연스러운 대기 표현이 가능하다.







    ▲ 같은 위치에서의 맑은 날, 해질녘, 습도가 높은 날을 표현한 예시 이미지

    레이마칭은 무거운 작업이기 때문에 낮은 해상도에서 따로 수행되며, 모두가 한 번에 계산되기 때문에 전체 화면 해상도에 맞는 업스케일링이 필요하다. 펄어비스에서는 이를 위해 새로운 업스케일링 방식을 고안해냈다.

    4x4 픽셀을 하나의 타일 영역으로 묶고, 해당 타일에 16개의 뎁스 슬라이스를 구성한다. 뎁스 슬라이스는 레이마칭 과정에서 지나는 지점이 타일 내에 있는 픽셀의 뎁스 부근일 때 기록되며 이후 풀스크린에서 해당 뎁스에 맞는 슬라이스를 샘플하면 자연스럽게 업스케일링된다.



    ▲ 나뭇가지처럼 복잡한 부분도 날카롭게 업스케일링 되는 것을 알 수 있다

    다음으로 소개된 것은 '유체(Fluid)'다. 고광현 개발자는 유체 시뮬레이션을 통해 안개나 연기의 자연스러운 움직임을 표현하려고 했다며, 파티클 시스템에서 Density와 Velocity가 Inject되면 나머지는 유체 시뮬레이션 통해 자연스럽게 연출된다고 설명했다. 렌더링은 Froxel을 통해 표현됐고, 캐릭터 같은 주변 개체들이 움직일 때 상호작용 하도록 구현됐다.



    ▲ 파티클 시스템을 통해 Inject 되도록 설정한 Emitter를 설치한 화면 예시. 사실적인 움직임을 확인할 수 있다



    ▲ 캐릭터와의 상호작용 예시. 개체 표면이 유체를 밀어내는 것을 볼 수 있다



    ■ 펄어비스 차세대 엔진의 '기하학(Geometry)'과 '물리(Physics)'

    펄어비스가 중요하게 생각하는 '사용자가 광활함을 느낄 수 있도록 하기 위한 원경 표현력'의 해법으로 펄어비스 차세대 엔진에는 개체를 레벨에 대량으로 쉽게 배치하고, 멀리서도 표현할 수 있도록 하는 기능이 추가됐다. 특히 밭이나 숲을 구성할 때 개별 개체를 일일이 배치하는 것이 아닌 영역 설정이나 재질 설정으로 간단히 대량 구성이 가능하도록 했고, 이를 표현하기 위해 세분화된 LOD와 향상된 기능의 임포스터가 사용됐다.



    ▲ 화면 속에 보이는 나무와 작물 대부분은 직접 배치한 것이 아닌, 설정에 의해 자동으로 생성된 것이다

    펄어비스는 대량 배치 시스템 이외에도 레벨 구성을 자동화할 수 있는 부분에는 최대한 자동화를 구현했다. 근거리 표현에서도 재질이나 영역 등 여러 가지 조건들로 실시간으로 자동 구성되는 기능을 추가했고, 설정 변경 시 바로 바로 그 변화를 확인할 수 있다. 필요하다면 성능 옵션에 따라 밀도 조절도 가능하다.





    ▲ 근거리 표현에서 실시간 설정 변경을 적용한 예시 이미지

    또한 개체를 개체의 표면에 생성시키는 기능을 이용하여 다양한 느낌을 표현할 수 있다. 표면에 생성시키려는 개체나 밀도 등의 정보를 조절하면, 변경점을 실시간으로 확인할 수 있다.



    ▲ 간단한 설정으로 풀로 가득 덮힌 집을 만들 수 있다. 디테일 추가 혹은 오래된 재질 표현에 활용된다

    아주 먼 원경 표현은 거대한 월드의 공간감을 느끼게 하는데 아주 중요한 역할을 한다. 하지만 앞서 소개된 방식을 사용하면 극단적으로 멀리 있는 개체의 표현이 매우 무거워진다. 이를 해결하기 위해 펄어비스 엔진에서는 레벨별로 프록시를 구성했고, 더 효율적으로 먼 개체를 표현하기 위해 계층적으로 프록시를 추가 구성했다. 상위 계층부터 탐색하여 프록시 영역이 로드 범위에 걸치면 하위 계층 프록시를 탐색하여 로드하는 방식으로 월드 전체를 출력하는 것이 가능하다.

    원경 뿐만 아니라 근경 표현도 매우 중요한데, 이를 위해 더 세밀한 기하 표현과 높이맵을 통한 Displacement 처리가 추가됐다. 여기에 그림자 처리까지 추가하여 극단적인 그림자 디테일을 표현할 수 있게 됐다.



    ▲ Displacement 적용으로 사실성을 높여주는 디테일 차이를 확인할 수 있다

    다음으로 '물리(Physics) 환경 구현'에 대한 소개가 이어졌다. 펄어비스의 차세대 엔진으로 제작될 여러 게임들에서는 다양한 이동수단을 지원할 예정인데, 현재까지 구현되고 있는 타입으로는 4륜 자동차와 마차, 배, 모터바이크 등이 있다.

    펄어비스에서는 피직스 엔진으로 하복 시스템을 사용하고 있는데, 하복에서 제공하는 탈것 시스템을 여러 측면에서 필요에 맞게 개선한 것이 특징이다. 고광현 개발자는 오버랩 체크, 롤 제어 등 시뮬레시연 안정성을 추가로 확보해야 했고, 이륜차의 경우 주행의 자연스러움과 윌리 등의 구현을 위해 여러 외력을 추가해야 했다고 설명했다. 이외에도 속도에 따른 스티어링의 Stiffness 조절, 차량에 착석한 캐릭터의 시뮬레이션, 그리고 차량의 파괴 등 여러 개선이 적용됐다.



    ▲ 개선을 거친 탈것 시스템으로 신규 프로젝트 '플랜8' 에서 차량 테스트를 진행하는 모습

    포즈 리깅은 보통 모델러가 원하는대로 DCC 툴에서 Animation Constraints나 Wire Parameters등으로 자유롭게 설정한다. 예를 들어 메카닉 캐릭터에 연결된 기어나 피스톤처럼 부수적인 움직임이 포즈 리깅에서 비롯된다고 볼 수 있다. 이렇게 설정된 데이터를 추출하여 엔진에서 실시간으로 적용하면 게임에서 사용하는 여러 가지 IK/포즈-모디파이어가 캐릭터의 큰 움직임을 수정하더라도 연결된 기어나 피스톤의 움직임을 정확하게 표현할 수 있게 해준다. 또한, 캔디랩 같은 Skinned Mesh의 스키닝 아티팩트를 제거하기 위한 헬퍼본 셋팅에도 사용된다.





    ▲ '플랜8'에 적용된 예시. IK를 통해 연결되어 있는 피스톤이 설정에 따른 제약 조건을 만족시키면서 움직이고 있다

    '브레이커블(Breakable)'은 파괴할 수 있는 개체를 설정하는 기능이다. 일반적인 개체에 파편을 미리 베이킹하면, 이는 자동으로 브레이커블 개체로 설정된다. 서브메쉬별로 물리 재질을 설정할 수 있으며, 강체 시뮬레이션에서 발생한 충격으로도 파괴가 일어날 수 있다.

    큰 개체가 충격에 의해 파괴될 때 해당 충격이 가해진 부분은 파괴되지만, 나머지 부분은 본래의 모습을 유지하기 마련이다. 이후 형태가 남아있던 부분들에 파편에 의한 추가 파괴가 발생하는데, 이러한 일련의 과정을 자연스럽게 구현하기 위해 펄어비스 엔진에서는 계층적인 브레이커블 구조를 적용했다.



    ▲ '붉은 사막'의 공성전 이미지. 개별 개체 파괴와 그 연쇄 충격으로 또 다른 파괴가 발생한다



    ▲ 펄어비스 엔진에 적용된 계층적인 브레이커블 구조를 확인할 수 있다

    옷감 시뮬레이션은 보다 안정적인 시뮬레이션을 위해 PBD(Position Based Dynamics)를 이용했고, GPU 기반으로 만들기 위해 Jacobi 방식을 채택했다. 이외에도 Solver Iteration 최소화를 위해 Long Range Attachments 방식을 사용했으며, Contact Plane 예측을 통한 충돌 계산 단순화 방식이 적용됐다. 이를 통해 상대 속도가 큰 상황에서의 충돌 검출 성공률이 높아졌다.



    ▲ 옷감은 물론, 머리카락과 장신구에도 같은 구동 방식이 적용됐다

    물리 환경 소개 이후에는 이밖에 차세대 엔진에 적용된 여러 기타 시스템에 대한 소개가 이어졌다. 먼저 먼저 일반적으로 많이 쓰이는 Material System을 도입하여 아트에서 셰이딩을 제어하고, 리소스화 할 수 있도록 했다. 기본적으로 버텍스와 픽셀을 제어할 수 있으며, 변화시켜야 하는 항목은 파라미터로 설정하고, 다양한 루트로 이를 제어할 수 있다. 또한, 타임라인이 포함된 시퀀스 에디터를 통해 다양한 연출을 구성할 수도 있다.



    ▲ '도깨비' 속 이 장면도 Material System으로 연출됐다

    조명과 시간은 물론, '날씨 변화'도 월드를 표현하는 데 있어 굉장히 중요한 요소라고 할 수 있다. 차세대 엔진에서는 다양한 날씨 표현이 가능하며, 아티스트는 파티클 시스템과 연동을 통해 원하는 형태로 이를 이용할 수 있다. 진흙탕이나 눈이 쌓이는 시스템도 구현할 수 있으므로, 다양한 월드 구성이 가능해진다.


    ▲ 쌓인 눈은 캐릭터의 자취를 따라 표면이 변화한다. 동일한 방식이 진흙에도 적용된다

    엔진에는 길찾기나 AI를 위한 솔루션도 필요하다. 고광현 개발자는 2019년 GDC를 통해 발표했던 복셀 네비게이션을 더 발전시켜 개선했고, 장애물 극복 기능이나 다량의 개체가 그룹별로 이동하게 해주는 '플로우 필드' 기능이 추가됐다고 소개했다. 해당 기능은 대규모 인원이 추적하는 상황에 사용할 수 있다.

    이외에도 캐릭터간 충돌 회피 기능과 이동 경로가 개선됐고, 동적인 Agent 크기 대응을 위한 데이터 구조 개선이 이루어졌다. 앞서 공개됐던 '도깨비'의 트레일러 영상에 등장하는 차량과 보행자의 도로 이동이나 신호 시스템도 새롭게 추가된 사양이다. 이를 통해 교통의 흐름을 표현하는 것이 가능하다.

    자연스러운 표현을 위해서는 주변 개체와의 상호작용 기능도 필요하다. 강체 시뮬레이션으로 표현하기 어려운 나무, 풀, 파티클 등의 개체에 적용된다. 캐릭터의 이동으로 풀이 밟히거나 낙엽이 차일 수 있고, 액션이나 마법, 폭발 등으로 충격파가 전달되어 물리적으로 충격을 주기도 한다. 펄어비스 엔진에서는 공기에 힘이 가해질 때 플루이드 시뮬레이션을 통하여 공기의 흐름을 계산하고 이 흐름을 다시 개체에 적용하는 방식으로 구현됐다.

    ▲ 낙엽을 제작할 때 영향을 얼마나 받을 것인지, 낙엽 자체의 물리량은 어떻게 되는지 설정할 수 있다

    이외에도 바람에 따라 주변 환경이나 개체의 움직임이 영향을 받게 된다. 나무, 옷감, 머리카락도 모두 영향을 받으며, 파티클 시스템에서는 바람 값을 참조해 영향을 처리하고, 아티스트는 얼마나 혹은 어떤 식으로 영향을 받을지 설정할 수 있다.

    ▲ 바람의 세기에 따라 나뭇잎과 옷, 머리카락이 영향을 받는 모습을 확인할 수 있다

    물의 파문에 대한 표현도 적용됐다. 펄어비스의 게임 엔진에서는 Discrete Wave Equation을 활용하여 물의 파문을 수치적으로 계산했다. 이 과정에서 Finite Difference Method가 쓰였으며, 더욱 자연스러운 연출을 위해 움직이는 개체 표면에서 웨이브가 생성되도록 구현했다. 그는 앞서 유체에서 이용했던 움직이는 개체의 정보가 여기서도 그대로 활용된다고 설명했다.



    ▲ 개체의 표면에서 발생하는 파문이 물의 경계에서 다시 반사되어 또 다른 파문을 일으킨다

    고광현 개발자는 발표를 통해 펄어비스의 차세대 엔진에서 개발했던 몇 가지 기능들을 소개했지만, 이는 전체 중 일부에 불과하다며, 앞으로도 해야 할 일들이 많이 남아있다고 이야기했다. 이어서 무엇보다도 '원활한 게임플레이'를 위한 최적화가 중요하다며, 최적화에 더 많은 노력을 기울일 것이라는 포부를 전했다. 펄어비스는 신작 프로젝트들이 진행되면서 나오는 요청 사항들을 차세대 엔진에 하나씩 반영하고, 추후 더 많은 플랫폼에서 구동될 수 있도록 개발을 이어나갈 계획이다.



    댓글

    새로고침
    새로고침

    기사 목록

    1 2 3 4 5