태그 보관물: compositing

[WAYLAND] HARDWARE COMPOSER (in ANDROID)

오늘은 안드로이드에서 HARDWARE COMPOSER (HWC) 라고 부르는 기능에 대해 소개하고자 한다. 사실 이 기능은 안드로이드 3.0 에서 소개된 기능이긴 하지만, 유사한 기능이 데스크탑에서 꽤 오래전부터 사용되어 왔었고, 현재 WESTON 에도 유사한 기능이 들어가있다. 암튼 이게 어떤 역할을 하고, 어떤 장점을 가지는지 살펴보자.

hwc0

위 그림은 HWC 가 없는 일반적인 하드웨어 가속을 이용한 렌더링 과정이다. 하나의 배경화면과 두 개의 윈도우가 있고, 각각 텍스처를 하나씩 할당받아 현재의 위치에 렌더링된다. 렌더링된 프레임버퍼는 HDMI 를 통해 디스플레이로 전송되어 결국 화면에 나타나게 되는데, 사실 이 정도만 해도 충분히 나쁘지 않은 결과를 보여준다. 하드웨어 가속(GPU)을 사용하기 때문에 프로세서(CPU)의 부담을 줄일 수 있고, 또한 충분히 빠르고 효과적이다. 하지만, GPU로 CPU의 역할을 대체하는 것만이 최선일까? 결국 GPU 또한 성능의 한계가 있고, 많은 전력을 사용하는 장치일뿐이다. 그래서 GPU를 보다 효과적으로 사용하기 위한 다양한 연구가 진행 중이고, 그 중에 비교적 작은 노력으로 작지 않은 효과를 볼 수 있는 방법 중의 하나가 바로 HWC 이다. 아래 그림은 HWC 와 하드웨어 가속을 이용하여 렌더링하는 과정을 나타내고 있다.hwc1

앞의 예제와 동일하게 하나의 배경화면과 두 개의 윈도우가 있지만, 배경화면을 제외한 두 개의 윈도우만 하드웨어 가속을 이용하여 렌더링하고 있다. 이럴 경우 우리가 얻을 수 있는 장점은 무엇일까? 예를 들어, 배경화면에 초당 60 프레임의 애니메이션이 들어가있는 경우를 상상해보자. 만약, HWC 가 없다면 전체화면을 덮고 있는 배경화면이 변경되었기 때문에, 프레임버퍼에 배경화면을 덮어씌우고 그 위에 윈도우 두 개를 다시 덮어씌워야 원하는 결과를 얻을 수 있다. 이런 과정을 GPU 가 초당 60번씩 해야한다. 하지만, 아래 그림처럼 HWC 를 사용하는 경우라면 어떨까? 배경화면만 변경되고 두 개의 윈도우는 변경사항이 없기 때문에 GPU 는 프레임버퍼를 다시 렌더링하지 않아도 되고, 배경화면만 HDMI 를 통해 디스플레이로 전송하면 동일한 결과를 얻을 수 있다. 즉, GPU 가 했던 컴포지팅의 일부를 디스플레이가 제공하는 오버레이 기능으로 대체함으로써 GPU 의 사용량을 극단적으로 줄일 수 있게 된 것이다. 그렇다면 원하는 모든 컴포넌트(배경화면, 윈도우, 마우스 포인터, …)에 독립적인 오버레이를 지정하면 더 좋지 않을까? 여기에는 다음과 같은 몇 가지 제약 사항이 있다.

  • 첫 번째는 디스플레이가 지원하는 오버레이의 수가 제한되어 있다. (약 2~4개 정도이지만, 대부분 하나는 마우스 포인터를 위해 할당해서 사용되고 있다.)
  • 두 번째는 회전과 같은 변형을 지원하지 않는다. 만약에 특정 윈도우가 기울어져 있다면 현재의 디스플레이가 제공하는 오버레이 기능은 사용하기 힘들다.
  • 세 번째는 중간에 끼어있는 컴포넌트는 오버레이를 사용할 수 없다. 예를 들어, 배경화면과 앞에 있는 윈도우가 하드웨어 가속을 사용한다면, 뒤에 있는 윈도우를 오버레이로 지정해서 동일한 결과를 얻기는 어려워진다.

이 외에도 여러 가지 제약사항이 더 있을 수 있겠지만, 앞으로 HWC 기능이 더 활발히 사용된다면 디스플레이 쪽에 더 유용한 기능이 들어갈 수 있지 않을까 기대해본다.

마지막으로 정리하면, 우리가 앞으로 기억해야 가장 중요한 사실은 기존에 CPU 와 GPU 가 나눠서 하던 컴포지팅에 디스플레이까지 참여하게 되었다는 것이다. 이는 컴포지팅 과정을 좀 더 복잡하게 만들겠지만, 그만큼 더 효과적으로 만들 수 있을 것으로 기대된다. 이제 플랫폼 개발자들은 CPU, GPU 그리고 디스플레이의 장단점을 파악해 보다 효과적인 컴포지팅 기술을 연구/개발해야 할 것 같다.

Advertisements

[WAYLAND] 컴포지팅 최적화 기술 소개 자료

윈도우 매니저에서는 당연히 필수이고, 위젯 엔진이나 기타 그래픽 처리가 필요한 소프트웨어에서도 거의 항상 중요한 부분을 차지하는 컴포지팅 최적화 기술에 대한 자료를 공개합니다. 일단 자료는 WAYLAND 기반의 윈도우 매니저를 기준으로 작성되었지만 대부분의 동작 원리와 적용 기술은 윈도우 매니저와는 크게 상관은 없습니다. 자세한 내용은 slideshare 에 올려놓은 자료를 참고하시고 아래는 간단히 요약한 내용입니다.

우선 컴포지팅이 무언지에 대해 간단히 소개드리겠습니다.

그림1

위 그림은 위젯 엔진과 윈도우 매니저가 동작하는 방식입니다. 위젯 엔진은 여러 위젯을 합쳐서 하나의 윈도우를 만들고, 윈도우 매니저는 여러 윈도우를 합쳐서 하나의 프레임버퍼를 만듭니다. 결국, 우리가 보는 화면은 여러 단계의 컴포지팅을 거쳐서 만들어진 결과물입니다. 이처럼 컴포지팅은 우리가 눈으로 볼 수 있는 대부분의 프로그램에서 중요한 역할을 차지하고 있습니다.

위의 그림을 한눈에 봐도 알겠지만, 컴포지팅은 결국 수많은 메모리 복사를 수반하는 작업입니다. 그래서 이를 최적화하기 위한 다양한 기술들이 오래전부터 연구/개발되어왔습니다. 가장 핵심적인 기술은 SCENE GRAPH 을 이용한 효과적인 데미지/클리핑 관리입니다. 간단히 얘기하면 변경이 필요한 부분만 갱신하고 나머지는 재활용하자는 것입니다.

그림1

위의 그림은 기본적인 데미지 관리를 통해 얻을 수 있는 효과를 보여주고 있습니다. 두 개의 윈도우가 화면에 이미(!) 존재하고, 하나의 윈도우의 특정 부분이 변경되었을 경우를 가정해봅시다. 이때 데미지 관리를 하지 않았다면 다음 프레임버퍼를 만들기 위해, 새로운 프레임버퍼를 만들고 거기에 두 개의 윈도우를 모두 복사해야합니다. 하지만 데미지 관리를 잘 하고 이전 프레임버퍼에 대한 정보를 유지하고 있었다면, 이전 프레임버퍼에 변경된 부분만 복사하여 다음 프레임버퍼를 완성할 수 있습니다. 이처럼 데미지 관리를 효과적으로 하게되면 실제로 몇 십배의 성능 차이를 볼 수 있습니다. (클리핑 기법도 상황은 다르지만 이처럼 불필요한 메모리 복사를 제거하는 효과를 볼 수 있습니다.)

마지막으로 하드웨어 가속을 이용한 컴포지팅에 대한 내용입니다. 현재 대부분의 컴포지팅 기능을 제공하는 소프트웨어는 하드웨어 가속을 사용하고 있지만, OpenGL 은 기본적으로 3D 게임을 위한 것이지 2D 컴포지팅을 위한 인터페이스가 아니기 때문에 불편하고 비효율적인 부분들이 많았습니다. 하지만 최근 이를 개선할 수 있는 다양한 확장 기능들이 OpenGL 에 추가되고 있기 때문에 이러한 기능들을 잘 이해하고 적극 활용하는 것이 굉장히 중요하다고 볼 수 있습니다.

본 자료에서 소개한 컴포지팅 최적화 기술은 특히 제한된 자원을 사용하는 임베디드/스마트 환경에서 유용하기 때문에 관련 업무를 하시는 분들은 반드시 이해하고, 필요한 부분에 적용한다면 큰 효과를 볼 수 있을 것으로 기대됩니다.

[TECH] 영화를 위한 영상기법

나의 유일한 취미는 영화 감상이다. 특히 화려한 CG 가 들어간 영상물들…참고로 어벤져스는 극장에서만 5번 보았고, 집에서 본 것까지 하면 수십번도 더 본 것 같다. 그래서 시스템 SW 를 주로 연구/개발해오던 나에게 컴퓨터그래픽은 항상 동경의 대상이였고, 지금 하고 있는 프로젝트도 거기에 아주 큰 영향을 받았다. (궁극적으로 오큘러스 리프트나 뇌파 컴퓨팅을 이용하여 매트릭스 같은 가상세계가 만들어진다면 현재 영화에서 사용되는 CG 기술들 중 일부가 실시간으로 적용될 것이다. 대표적으로 실시간 레이트레이싱 기법…)

이번 글에서는 내가 주로 관심을 가지고 있는 3D 모델링, 전역 조명 기법(레이트레이싱), 합성 외에도 전통적으로 사용되어오던 영상기법까지(현재까지 활용되고 있는 기술들 위주로) 두루두루 소개를 하도록 하겠다. 먼저 영상 기법은 크게 SFX(아날로그)와 VFX(디지털) 로 나뉜다. SFX 는 컴퓨터를 이용하지 않고 여러 가지 방법을 이용하여 필요한 영상을 만들어내는 기술이고, VFX 는 컴퓨터를 이용하여 필요한 결과물을 만들어내는 기술이다.

우선 간단히 눈여겨 볼만한 SFX 기술들을 설명하도록 하겠다.

미니어쳐

현재에는 거의 사용이 되지 않지만, 컴퓨터 그래픽이 일반화되기 전에는 특수분장과 더불어 미지의 피조물을 만들어 낼 수 있는 유일한 방법이었다. (참고로, 제임스 카메론이 처음 영화 현장에서 한 일이 미니어처 세트 디자인일이었다고 한다.) 다들 직관적으로 상상할 수 있듯이 실제 크기로 만들기 힘든 피조물들을 작은 크기로 정교하게 만들어 촬영에 활용하는 전반적인 기술들을 의미한다. 아래 그림은 에일리언2 영화 촬영 당시 실제로 사용된 에일리언 퀸의 미니어처이다.

에일리언 미니어쳐

매트 페인팅(Matte Painting)

주로 웅장한 배경을 제작할 때 쓰이는 기술로 사람의 손으로 직접 그리는 방식이다. 디지털 시대 이전에는 다양한 촬영기술과 함께 적용되어 완성된 결과물을 만들어냈지만, 현재에는 포토샵 등의 툴을 이용하여 보다 세밀한 작업이 가능해졌다. 아래 그림은 매트 페인팅 과정과 그 결과물을 보여주고 있다. 사람의 손으로 이렇게까지 정교하게 그릴 수 있다는 사실이 놀랍기만 하다.

매트페인팅

애니메트로닉스

애니메이션(Animation) 과 일렉트로닉스(Electronics) 의 합성어로 간단히 말해, 실제 움직일 수 있는 기계장치를 만들어내는 것이다. 그리고 최근에는 컴퓨터 그래픽과의 연계로 더욱 강력한 능력을 발휘하고 있으며, 대표적으로 최신작인 프로메테우스가 있다. 아래 동영상은 프로메테우스와 다양한 영화에서 사용된 애니메트로닉스 기술 홍보 동영상이다.

다음은 컴퓨터를 이용한 영상 기술인 VFX 에 대해 소개하도록 하겠다.

3D 모델링 & 합성

3D 모델링 및 합성을 위한 가장 기본적인 작업 순서는 다음과 같다.

  • 모델링 .. MAYA 나 3D MAX 와 같은 툴을 이용하여 물체의 외형을 디자인 하는 작업
  • 리깅 .. 모델링 된 캐릭터에 뼈대를 할당하여 움직일 수 있는 상태로 만드는 작업
  • 애니메이션 .. 리깅까지 완료된 캐릭터에 실제로 움직임을 부여하는 작업
  • 렌더링 .. 전역 조명 기법을 이용하여 모델에 실제와 같은 정교한 조명 효과를 입히는 작업
  • 합성 .. NUKE 와 같은 툴을 이용하여 렌더링 결과 이미지와 실사 영상을 합성하는 작업
  • 보정 .. 포토샵과 같은 툴을 이용하여 합성된 결과물을 최종 형태로 다듬는 작업

위의 여섯 과정 중 직관적으로 이해가 안 될 수도 있는 렌더링과 합성에 대해 아래 동영상을 보며 추가로 설명을 하도록 하겠다.

위의 동영상을 보면, 첫 번째로 모델링 된 우주선이 빈 공간을 날아가는 영상을 만든다. 그 뒤에 배경으로 사용될 하늘 영상이 촬영되고, 두 개의 영상이 합쳐진다. 하지만 두 장면이 굉장히 이질적이다. 이유는 배경에 있는 밝은 빛이 우주선에 전혀 영향을 주지 못 하기 때문이다. 그래서 이 우주선에 배경과 유사한 조명 효과를 적용한다. (이게 바로 전역 조명 기법을 이용한 렌더링이다.) 이렇게 만들어진 영상에서는 우주선에 자연스러운 빛이 스며들어 훨씬 더 사실감이 느껴진다.

그렇다면 우리 눈에 실제로 존재하는 것같은 착각이 들게 하는 요소들이 뭐가 있을까? 방금 위에서 설명한 것처럼 (실제 촬영된) 주변 환경과 어울리는 자연스러운 조명이 기본적으로 필요하고 이외에 그림자, 반사 등의 효과들이 큰 영향을 주게 된다. 아래 그림은 합성의 가장 중요한 역할 중에 하나인 그림자 효과를 보여주고 있다.

zaaa

위의 그림에서 가운데 떠있는 물체는 실제로는 존재하지 않는 물체이다. 하지만 자연스러운 조명과 책상 위에 나타난 그림자로 우리의 눈은 쉽사리 착각에 빠지게 된다. 이러한 작업을 가능하게 해주는 합성에도 다양한 툴과 기법들이 있지만 가장 기본적으로는 카메라 트래킹이라는 기술이 이용된다. 카메라 트래킹은 미리 촬영된 2D 영상을 분석하여 촬영 당시 카메라 위치/각도와 (포인트 클라우드를 이용하여) 3D 공간을 복원해낸다. 그리고 이 복원된 3D 세트에 렌더링된 물체를 올리게 되면 위의 화면과 같이 자연스러운 그림자 효과(마치 실제 바닥에 그림자가 생기는 것처럼)를 만들어낼 수 있다. 이외에도 마커(marker)를 이용한 크로마키 촬영을 통해 보다 정밀하게 3D 공간을 복원하는 방법도 있다.

파티클 효과

일반적으로 연기, 물, 불 등과 같이 많은 양의 미세한 입자들이 다양한 물리 효과를 적용받는 현상이나 자동차 폭발과 같이 물체가 수많은 파편들로 쪼개지면서 자유운동하는 모습을 시뮬레이션하기 위해 사용되는 전반적인 기법들을 의미한다. 즉, 기존에는 미니어처나 위험한 실사 촬영을 통해 만들어낼 수 밖에 없었던 영상들을 컴퓨터로 안전하게, 원하는 만큼 시뮬레이션해서 필요한 영상을 만들어내는 획기적인 기법이라고 할 수 있다. 이는 영화 뿐 아니라, 게임 분야에서도 적극 활용되고 있기 때문에 다양한 상용/오픈소스 물리엔진들이 이를 지원하고 있고, 아래는 필자가 주로 사용하고 있는 BULLET 이라는 오픈소스 물리엔진의 데모 동영상이다. (정확히는 BULLET 을 기반으로 한 상용 솔루션을 판매하는 Exocortex 사의 데모 동영상이다.)

몰핑(Morphing)

2D 혹은 3D 의 물체의 모양을 서서히 다른 모양으로 변화시키는 기술을 의미한다. 가장 유명한 예로 마이클 잭슨의 뮤직비디오에서 사람의 형태가 자연스럽게 바뀌는 것도 바로 몰핑 기술을 활용한 것이다. 아래 동영상을 보면 직관적으로 무엇을 하는 기술인지 이해가 갈 것이다.

워핑(Warphing)

몰핑이 전혀 다른 물체로 변형시키는 거라면 워핑은 사물의 모양을 살짝 변경하는 기술을 의미한다. 예를 들면, 고양이의 입꼬리를 올려서 웃는 표정을 만든다든지, 아기가 어른처럼 말하게 한다든지…즉, 사물의 재질과 같은 기본 속성은 그대로 유지한채 모양만 살짝 비틀어서 원하는 효과를 만들어내는 것이다.

이외에도 수없이 많은 기술들이 존재하고, 지속적으로 새로운 기술들이 개발되고 있다. 우리나라 속담에 목 마른 사람이 우물을 판다고 컴퓨터 그래픽 기술의 발전을 가장 적극적으로 주도했던 분야는 결국 영화산업이였던 것 같다. 개별 기술들에 대한 보다 깊이 있는 설명은 추후에 하나씩 진행하도록 하겠다.