2014년 12월 17일

실시간 포토리얼리즘을 위한 열망

저자: * Lasse Rode

소개

제 이름은 Lasse Rode, xoio 스튜디오에 속해 있으며, 건축 및 제품 마케팅용 시각화 및 삽화를 전문으로 하는 소규모 대행사에서 근무하고 있습입니다. 보통 저희는 3ds Max 같은 어플리케이션을 활용하는 일종의 '전통적' 방식의 3D 환경 작업을 합니다. 새로운 렌더링 엔진이 나올 때마다 지속적으로 확인하고 있으며, 현재는 Corona Renderer, V-Ray, Octane 을 사용하고 있습니다. 각 엔진마다 저마다의 장점이 있기에 항상 각각 최적의 용도에 맞는 것을 쓰도록 노력하고 있습니다.

제가 볼 때 이 업계에 큰 흐름이 몇 가지 있는데, (포토)리얼리즘을 향한 열망과 실시간은 아닐지언정 더욱 빠른 속도입니다. 렌더링 결과물이 렌더 팜을 거쳐 나오는 것을 기다리지 않아도 되었으면 하는 것은 항상 꿈같은 일이었습니다. 애니메이션 렌더링이라면 말할 것도 없지요!

오랫동안 '실시간' 이라는 것의 큰 단점은, 미리 렌더링된 고정 이미지나 애니메이션에 비할 때 얻을 수 있는 퀄리티가 조악하다는 것이었습니다. 즉 흥미로운 개념이기는 했지만, 시각화 맥락에 적용시켜 볼 때는 상상조차 하기 힘들어 보였습니다. 솔직히 '게임같은' 느낌때문에 건축 및 브랜드 계통의 수준 높은 고객의 구미를 맞추기가 어려웠습니다.

이러한 부분이 빠르게 바뀌고 있습니다. 오늘날의 실시간 엔진으로 얻을 수 있는 결과물은, 매우 아름다워지고 그럴싸해 진 것입니다!

왜 언리얼 엔진인가?

UE4 발매 소식은 우리 업계에 많은 관심을 모았고, 가능성은 무한해 보였습니다. PBR (물리 기반 렌더링) 머티리얼 시스템과 사용하기 쉬운 임포트 파이프라인을 통해 언리얼 엔진에 모델을 가져오기가 쉽다는 점은, 저희에게 있어 매우 구미가 당기는 요인이었습니다. 거기에 얻을 수 있는 결과물의 퀄리티는 덤이지요! 몇 주 전 입소문을 모았던 (마켓플레이스 에서도 다운로드 가능한) Koola 의 작업물을 보셨다면, 언리얼 엔진 4 로 감명깊은 퀄리티를 낼 수 있다는 데 대해 저희만큼 확신을 가질 수 있을 것입니다.

다음 글에서는 마켓플레이스에서 다운로드 가능한 Berlin Flat 씬을 만드는 데 사용한 작업방식에 대한 요약 및 그 과정에서 알게 된 몇 가지 기법과 꼼수를 공유하고자 합니다. 몇몇은 제가 직접 알아낸 것이고, 몇몇은 제가 웹에서 찾은 정보를 통해 얻어낸 것입니다. 언리얼 엔진 forum문서는 물론, 엔진에 딸려오는 시작용 콘텐츠를 비롯해 마켓플레이스에서 받을 수 있는 애셋과 씬 모두 귀중한 자료의 보고입니다.

Berlin Flat

2013 년 초, 3ds Max 와 Corona Renderer 를 사용하여, 베를린에 있는 역사적 건물 아파트 층 이미지 시리즈를 만들었습니다. 컬러 매핑 처리를 유연하게 할 수 있어서, 전체적으로 매우 하얀 느낌을 끌어내는 데 정말 도움이 되었습니다. 바로 그때문에 UE4 를 시도해 보기로 했습니다.

UE4 가 우울한 라이팅에 번잡한 텍스처 상황의 씬에 성공적으로 사용되는 것을 봤거든요. 순백의 인테리어에 정교한 그림자나 GI 를 얻어내는 것이 그리 쉽지 않을 것이라고 생각했었습니다.

그리고 솔직히, 까다로운 작업이었습니다!

Realtime Berlin Flate

위는 3ds Max 와 Corona Renderer 로 렌더링한 원본 중 하나입니다. 전체 세트를 살펴보려면, 여기를 클릭하세요.

아무튼 처음부터 시작하겠습니다:

원본 씬

original scene

전체 모델링 작업은 3dsmax 로 빠르게 하고, 제가 실제로 한 디테일 작업은 최종 이미지에 보이는 부분만이었습니다. 이러한 접근법은 물론 실시간 환경에서는 가능하지 않은 것이지요. 그 씬을 언리얼 엔진용으로 용도 변경하기 위해서는 범위를 약간 줄여야 했습니다. 전체 공간을 가다듬고 디테일을 보강하려면 테스팅 목적으로는 시간이 너무 많이 걸렸을 것이기 때문입니다.

방은 두 개만 익스포트하기로 결정했습니다. 위 스크린샷 아랫 부분에 보이는 것들이지요.

지오메트리를 언리얼 엔진용으로 익스포트하기

이 작업은 몇 가지를 염두에 두기만 한다면! 매우 쉽습니다.

약간은 분리를 시키는 것이 좋습니다. 왜냐면 라이트매스는 모든 오브젝트에 대해 별도의 맵 속에 계산되므로, 특히 벽이나 천정같은 커다란 평면 오브젝트의 큰 값에 대해서는 약간 조심하는 것이 좋습니다. 그때문에 실제로 보이는 부분인 벽의 안쪽 면만 익스포트했습니다.

나중에 벽이 천정과 교차하도록 상단과 하단을 약간 추가했습니다. 그렇게 하면 빛샘 현상을 방지하기에 좋은데, 라이팅 부작용은 지오메트리가 접하거나 교차하지 않을 때 발생하기 때문입니다. 부산한 텍스처가 많은 음울한 씬에서는 문제가 되지 않지만, 저희가 얻어내려는 순백의 공간은 특히나 구석 부분에 가급적 정교한 GI 를 내는 것이 중요합니다.

exporting the geometry for Unreal Engine

두 번째로 어려웠던 점은, 언리얼 엔진의 라이트매스 계산시 GI 가 저장될 채널에 대해 펼친 UV 좌표를 만드는 것이었습니다. 3ds Max 에서는 UV 채널 2 가 될 것입니다.

채널 1 은 디퓨즈, 러프니스, 노멀 등의 다른 모든 텍스처에 사용됩니다. 언리얼 엔진의 채널 번호는 0 부터 시작하므로 처음에는 조금 헛갈릴 수 있습니다만, 익숙해지면 꽤나 단순합니다.

주: 펼치기는 라이트맵 채널에 대해서만 중요합니다! 텍스처 채널의 경우, 큐브형 매핑이든 원통형 매핑이든 어떤 매핑도 괜찮습니다. 대부분의 경우 3ds Max 의 단순한 “플래튼 매핑” 으로 충분한 UV 좌표를 만드는 데 충분합니다.

lightmap channel

맥스 씬에서처럼 UE4 에서 씬을 조합하려면, 익스포트시 전체 “스페이스” 를 제자리에 놔두어야 오브젝트의 좌표를 정렬하기가 쉬워지므로 좋습니다. 의자나 다른 애셋같은 단일 오브젝트의 경우, 한 번만 익스포트한 다음 언리얼 엔진 씬에서 인스턴스로 만드는 것이 매우 편안합니다. 그러기 위해서는 3ds Max 씬의 중앙 근처로 이동시키는 것이 좋은데, 언리얼 엔진에 새로 생기는 오브젝트의 피벗이 그 위치가 되기 때문입니다.

chair 1

chair 2

보시면 LOD 단순화 없는 하이 폴리 지오메트리를 사용하고 있습니다. 물론 이와 같은 작은 씬에만 추천할 만한 것이지만, 스무딩 작업 이후이고 가구 선이 짜글거리지 않도록 하기 위해서이므로, 여기서는 이치에 맞습니다. 틀림없이 최적화의 여지는 있을테지만 말입니다 ;).

애셋이 하나의 오브젝트로 병합되었는지, 나중에 UE4 의 다양한 머티리얼 처리를 위해 각기 다른 머티리얼-ID 가 할당되었는지 확인하세요!

그런 다음 지오메트리를 .fbx 로 저장하고서 언리얼 엔진 에디터로 넘어갑니다!

언리얼 엔진 4 로 임포트하기

언리얼 엔진 4 로 FBX 파일을 임포트하는 작업은 매우 부드럽게 넘어갑니다! 몇 단계에 걸쳐서 진행했는데요.

이치에 맞도록 다양한 파일을 준비했습니다:

  • 방의 지오메트리는 별도의 FBX 파일에 담았습니다.
  • 애셋마다 각기 다른 파일로, 각각 오브젝트가 몇 개씩 들어 있습니다.

“Combine Meshes” (메시 합침) 옵션을 꺼서 오브젝트가 하나의 메시로 굽는 것이 아닌 별도의 파일로 받도록만 해 주세요!

Combine Meshes

머티리얼

저는 매우 단순무식해서 단순한 구성을 매우 선호합니다! 약간은 철학적인 이야기이지만 최소한의 노력으로 무언가를 이뤄내는 것이, 반 년 뒤에 열었더니 기억도 이해도 안가는 구성을 사용한 씬보다 훨씬 낫습니다.

그래서 이 셰이더 예제는 매우 단순하게 디퓨즈 맵과 채도감소 및 검정색과의 블렌딩으로 이루어져 있습니다. 그런 다음 당황하지 않고 동일한 맵을 색 보정한 뒤 반전시켜 머티리얼의 러프니스 채널에 넣으면~ 끝! :-D

Materials

여기에 노멀 맵까지 하면 과도한 것이겠지만, 마음껏 씬의 머티리얼을 직접 탐험해 보세요!

Normal Map

여기서는 나무 머티리얼이 의자와 탁자에 적용된 것이 보입니다. 바삭한 무광 반사면의 어둡게 염색된 나무가 나무의 구조 및 텍스처를 드러내고 있습니다.

이 그림에서는 관심가는 머티리얼이 두 개 더 보이는데, 태양빛에 후광을 받는 커튼, 즉 양면 머티리얼입니다.

back-lit sunlight

Shading Model 을 “Subsurface” 로 설정하고 1 미만의 상수 노드를 추가한 다음 머티리얼의 오파시티 프로퍼티에 연결해 주면 이 효과를 얻을 수 있습니다.

전경의 병에는 매우 단순한 유리 머티리얼이 적용되어 있습니다:

foreground material

디퓨즈 컬러는 꽤나 어둡고, 러프니스는 0 에, 스페큘러 값은 높습니다. 불투명도와 굴절 제어를 위해 값이 1.5 인 Fresnel 노드를 들여오기도 했습니다. 좀 더 복잡한 방법으로 더욱 사실적인 유리를 만들 수야 있지만, 이 정도면 충분히 훌륭한 유리입니다. 제어하는 데 애를 좀 먹어서는 절대 아닙니다! :)

참고로 왼편의 디테일 탭에서 “Two Sided” 를 체크하고, Translucency Lighting Mode 를 “TLM Surface” 으로 설정했습니다.

TLM Surface

여기서도 보여드리고픈 머티리얼 한 가지는 바닥인데, 노멀 맵이 적용된 유일한 것이기 때문입니다.

Material for Floor

여기 보면 머티리얼이 디퓨즈 컬러, 러프니스 텍스처, 노멀 맵으로 정의되어 있습니다.

디퓨즈 컬러는 단순한 매우 연한 회색으로, 4 상수로 정의된 것입니다.

러프니스는 약간 더 복잡해 보입니다. 왼편에는 스케일이 다른 동일 맵이 세 번, TexCoord 노드와 함께 보입니다. 그런 다음 각각의 빨강 채널을 다른 것과 곱한 다음 알파로 연결하여 Lerp (선형 보간) 노드로 연결하여 값을 블렌딩합니다. 이 예제에서는 0.3 과 0.2 로 바닥 판자에 미묘한 노이즈 섞인 반사면을 내고 있습니다. 그런 다음 “Power” 노드로 미세조정하여 딱 맞는 양의 러프니스를 내고 있습니다.

노멀 맵은 다시 한 번 TexCoord 영향을 받은 뒤 “FlattenNormal” 노드를 통해 적당양만큼 플래튼 시켜 머티리얼에 미묘한 안도감을 심어줬습니다.

애셋 준비하기

씬에 애셋을 드롭하기 전, 항상 지오메트리 에디터 안에서 머티리얼을 적용하는 것이 좋습니다. 그렇게 한 번만 해 줘도, 필요에 따라 메인 씬에서 각기 다른 머티리얼을 적용할 수 있습니다. 빠른 프로세스로: 여기서 중요한 점은, 오브젝트에 각기 다른 머티리얼 ID 를 적용시켜 놔야 그들이 속한 각기 다른 머티리얼을 넣을 수 있습니다!

Preparing Assets

씬 만들기

일종의 간단한, 조립 작업입니다. 먼저 방 지오메트리를 끌어 놔야 합니다. 가장 좋은 방법은 필요한 모든 부속을 비어있는 씬에 끌어 놓는 것입니다. 그 후 모든 가구와 애셋을 환경에 배치해야 합니다.

Building the scene

여기서 외벽의 뒷면이 보일 수도 보이지 않을 수도 있습니다. 위에서 설명했듯이, 라이트매스 계산 향상을 위해 단면이기 때문입니다.

정확히 그 목적으로 커다란 오브젝트의 라이트맵 해상도는 높게 설정하는 것도 좋습니다. 벽의 경우 저는 2048 로 설정했습니다.

Lightmap for large objects

위에 언급했듯이, 빛샘 현상은 문제가 될 수 있습니다. 예방을 위해 씬 군데군데 검정 박스를 놓았습니다. 밖에서 보면 약간 지저분해 보이지만, 안에서 보면 더욱 깨끗해 보입니다. ;)

black boxes around whole scene

라이팅과 라이트매스

라이팅 역시 꽤나 단순한 구성입니다. “Koola 메소드” 를 사용했는데요. 태양과 창 앞에 스포트 라이트가 달린 면을 조합하여 스카이 라이트를 시뮬레이션해 낸 것입니다. 꽤나 효과도 좋고, 조절하기도 쉽습니다!

이제 글로벌 일루미네이션 계산을 위해 중요한 미세조정 작업이 딱 몇 가지 있습니다:

Global illumination tweak

바운스 라이트와 간접광 퀄리티를 극적으로 향상시켰습니다. 스무딩도 0.6 으로 감소시켰습니다. 디테일은 더욱 강조되면서, 그림자는 그리 많이 씻겨나가지 않습니다.

간접광을 다이내믹 섀도우로 설정하여 그림자 품질을 높이기도 했습니다. 나중에 애니메이션에서 라이트를 움직이도록 할 때도 중요한 부분입니다!

getting better shadows with dynamic shadow

'빌드' 전 마지막 단계는, '라이팅 퀄리티' 를 'Production' 으로 설정하는 것입니다!

Lighting Quality to Production

모든 곳의 라이팅이 부드러워 집니다!

사실 처음 여기까지 왔을때는 조금 흥분이 되더군요! 사실상 이 엔진의 가장 큰 장점이, 여러분을 흥분시킨다는 점입니다! 실시간으로 내 '렌더링' 작품 안으로 들어갈 수 있다는 것은, 정말이지 기쁜 순간이었습니다!

'포스트 프로세싱'

매우 뛰어난 기능 중 하나라면, 색 보정과 카메라 이펙트를 에디터 안에서 바로 적용해 볼 수 있다는 것입니다. 글로벌 세팅에 대해서는 PostProcessVolume 으로 가능합니다. 채도감소, 프린지와 비녜트, 블룸에 약간의 미세조정을 한 다음 자동 노출 최소 최대치를 1 로 설정하여 꺼 주고, 노출 편향치를 1.42 정도로 설정하여 전체적인 밝기를 올렸습니다. 렌즈 플레어도 추가해 줬더니 실시간으로 벌어지는 효과가 정말 엄청나더군요!

Post Processing

애니메이션 셋업

씬 내부를 자유로이 이동할 수 있다는 것 때문에 애니메이션 작업이 매우 쉽고 즐거운 작업이 되었습니다. 바로 실시간 환경의 즉각적인 피드백 때문입니다. 복합적인 소프트웨어를 자주 사용하는 입장에서, 통합된 마티네 툴에 그리 오래지 않아 적응하여 애니메이션 셋업 작업을 시작했습니다. 먼저 마티네 액터 셋업 작업입니다.

Setting up the Animation

마티네를 열면 트랙 부분과 커브 에디터가 있는 창이 보일 것입니다.

카메라와 애니메이션 셋업 작업은 말 그대로 매우 쉽습니다. 모션은 키 프레임으로 제어되며, 커브는 다른 애니메이션 소프트웨어와 마찬가지였습니다. '컷' 작업 역시도 마티네 에디터 안에서 바로 가능했습니다.

공간을 천천히 움직이는 카메라를 둘 정도 만들었습니다. 하는 작업을 정확히 볼 수 있으니, 컷의 타이밍이나 카메라 이동 속도를 미세조정하는 데 정말 큰 도움이 됩니다!

created a couple cameras

카메라 궤도 역시 에디터에서 바로 보면서 즉석에서 수정 가능합니다!

마티네에서 대략적인 '컷' 작업을 완료한 후, 전체 애니메이션을 avi 로 익스포트한 뒤 프리미어에서 미세조정하여 음악에 맞췄습니다.

결론

3ds Max 에서 익스포트하는 것으로 시작하여 언리얼 엔진 4 로 임포트한 뒤, 셰이딩과 라이팅을 조정하고 애니메이션을 만든 다음 유튜브에 게시하기까지 이르는 전체 프로세스가 약 하루 정도 걸렸습니다. 이런 속도는 건축 시각화(ArchVIZ) 업계에 듣도보도 못한 것으로, 언리얼 엔진 4 가 시각화 작업에도 주로 사용될 수 있다는 잠재력을 매우 많이 반영하고 있다 봅니다.

이미지 '제작'에 있어서 렌더링 시간이 없다는 것은, 창작 프로세스를 정말이지 매우 유연하고 자유롭게 만들어 줍니다. 자신의 동작에 대란 빠른 피드백이야 말로 진짜 혁명인 것입니다!

저희는 이러한 유형의 제작 및 작업방식을 저희 일상 작업 및 환경 전반적으로 적용하는 가능성에 대해 항상 생각하고 테스트합니다.

수없이 많을 그 적용 방법을 탐험할 생각에 몹시 흥분이 됩니다!

제 동기나 과정에 대한 이해가 조금이나마 전해졌으면 하는 바람으로, Berlin Flat 씬도 많이 즐겨주시기 바랍니다 ;)

Lasse 드림.

xoio