인벤에서는 에픽게임즈코리아의 엔진 프로그래머 이상우 과장님으로부터 게임 엔진에 관련한 칼럼을 기고받게 되었습니다.
이상우 과장님은 카이스트 전산학과를 수석 졸업하고 UNC-CH(University of North Carolina at Chapel Hill)에서 Computer Science 석사를 취득했습니다. 전 엔씨소프트와 SK C&C에서 근무했고 현재 에픽게임즈코리아에 몸담고 있습니다.
지난 시간에 소개했던 '게임 엔진이란 무엇인가'에 이어 이상우 과장님이 준비한 두 번째 칼럼은 '게임 세계를 보는 법! 렌더링 엔진에 대하여'라는 주제로 꾸며졌습니다.
※ 에픽게임즈코리아 홈페이지 바로가기
▶ [기획 1부] '대 게임엔진 시대'의 서막, 게임 엔진의 역사와 정의에 대해
우선 많이 부족한 이전 기사를 읽어주신 독자들에게 감사드린다. 사실 수많은 드립들이 검열의 칼날에 스러지고 허공에 산산히 부서졌으니 아직도 자유 민주 사회의 길은 멀고도 험하다. 하지만 어른들의 사정을 지켜주는 것도 민주 시민의 자세이기에 독주를 마시는 소크라테스의 마음으로 겸허하게 받아들이기로 했다. 또한 수많은 게임 엔진들이 다 언급되면 혼동이 찾아올 수 있기에, 글의 흐름에 적절한 엔진만 언급하다보니 좋아하는 엔진이 빠져서 아쉬움을 느끼신 독자들은 앞으로 계속될 시리즈에서 출연을 기대해도 좋을 것이다.
이번 시간에는 게임 엔진의 중추이자 꽃인 렌더링, 혹은 그래픽 엔진에 대해서 알아보도록 하겠다.
“그래픽 좋아?”. 게이머들 사이에서 흔히 들을 수 있는 말이다. 말하자면 신사의 품격에서 장동건 외 3인방이 “(그 여자) 이뻐?”라고 묻는 것에 비유할 수 있겠다. '예쁜 여자'가 굉장히 복잡하고 은유적이며 복합적인 동시에 다양한 의미를 갖고 있듯이, 세상의 다른 많은 개념들과 같이 자세히 살펴보면 “그래픽이 좋다”라는 관념도 많은 것을 함축하고 있다.
일반적으로 한국 게이머들이 이야기하는 '그래픽이 좋다'라는 개념은, 캐릭터가 멋지고 아름다운 경우가 많다. 외모 지상 주의가 판을 치는 현대 사회에서는 아름다운 캐릭터가 각광을 받는 것이 사실이니까.
미의 기준은 다르지만 이런 아름다운 캐릭터 추구는 아시아권에서 특히 강세를 보인다. 이로 인해 아시아로 진입하는 외산 MMORPG의 경우는 이를 위해 종종 성형 수술을 감행하기도 한다. 미학보다는 다양성(혹은 근육남)을 추구하는 서구권은 그래픽이 좋다고 할 때 가상이라 불리는 게임 세계를 더욱 생동감있게 표현하는 배경과 캐릭터를 꼽곤 했다. 그 예로 일본 게임계가 계속 2D에 매달려 있을 당시에도, 전편에서 이야기했듯 3D 컴퓨터 그래픽을 게임에 빠르게 적용하여 가상 세계를 확장한 것은 서구권이었다.
사실 기술 발달로 전반적인 그래픽이 상향 평준화된 현대에서는 배경과 캐릭터 그래픽 어느 한쪽만 좋아서는 명작 반열에 들 수 없다. 위화감으로 인해 좋은 평가를 얻기 힘들기 때문. 캐릭터와 배경 모두 제작자가 표현하고자 하는 세상을 잘 구현해냈을 때 비로소 그래픽이 좋다고 평가받는 것이다.
'그래픽이 좋다'라는 표현은 캐릭터와 배경의 구분 외에도, 그래픽 리소스와 그것을 표현하는 렌더링 알고리즘으로 구분된다. 그래픽 리소스는 가상 세계를 표현하기 위한 객체들을 데이터로 변환하여 아티스트가 제작한 것을 말하며, 렌더링은 3D 가상 공간을 우리가 보는 2D 화면으로 옮겨 보여주는 과정을 뜻한다. 실질적으로 움직이는 영상을 표현해야 하므로, 3D 가상 공간에서 설정된 카메라 위치에 맞춰 매초 20장 이상의 이미지를 생성하는 것이 그래픽(렌더링) 엔진의 역할이다.
물론 게임은 순수 예술이 아니므로 그래픽 리소스 역시 렌더링 알고리즘을 위한 맞춤작업이 필요하다. 그렇기에 완전한 분리는 불가능하지만 중요한 구분인 것 만큼은 사실이다.
영화에 비유하자면, 그래픽 리소스는 배우와 촬영 장소이고, 렌더링은 조명, 분장, 촬영 기법 등에 빗대어 볼 수 있다. 아무리 아름다운 배우도 조명과 분장으로 완전히 다른 모습으로 보여질 수 있고, 동네 뒷산이라도 예술적인 촬영 기법을 겻들이면 파리 못지 않은 낭만의 도시로 탈바꿈하게 된다. (여담으로 영화에서 보던 장소를 실제로 가보면 실망하는 이유도 이것 때문이다.)
역사가 더욱 오래된 2D 렌더링 엔진도 여러가지 기술적 고려사항과 최적화 방법이 있지만, 소녀시대도 3D로 보는 시대이니만큼 3D 렌더링 엔진 위주로 칼럼을 진행하도록 하겠다. 물론 2D는 UI등의 분야에서 여전히 현역으로 활약하고 있으나, 2D 엔진은 3D 엔진의 부분 집합인 만큼 2D 엔진에서 가능한 부분은 3D 엔진에서도 가능하다는 점을 미리 적겠다.
게임 엔진의 태동이 3D 그래픽의 시작과 함께한 만큼, 당시 3D 렌더링은 기술적으로도 상당히 어려웠다. 특히 하드웨어가 지금과는 비교도 안될 만큼 열악했던 시대이기에, 영화에도 쉽사리 접목하지 못했던 3차원 그래픽을 실시간으로 실행한다는 것은 매우 도전적인 일이었다.
시간은 흘러 CG 영화 퀄리티의 게임들이 등장할 정도로 하드웨어와 렌더링 기술이 발전했다. 예전에는 상상도 못할 영화급 퀄리티로 플레이가 가능해진 것. 영화의 오프라인 렌더링(게임에서의 한 frame에 해당하는 그림을 생성하는데 몇 분~몇 시간을 소모)에 대해 고민하던 많은 기술과 주제들이, 이제는 게임의 실시간 렌더링(초당 30장 이상의 이미지 생성)에 도입하고 고민하게 됐다.
각 주제를 자세히 다루기엔 인벤의 웹서버 용량이 부족하기에, 우선 일반 독자들이 궁금해하실 만한 그래픽 엔진에 관련된 용어와 기자 분들이 주신 질문에 답변하면서 알려드리는 방향으로 진행하려 한다. 그래픽 엔진이 게임 엔진에서 가장 중추적 부분인 만큼, 이번 기사에서 다루지 못한 부분은 다음 기사에서 다루도록 하겠다. 다음 기사를 위해서 질문을 던져주시면 추첨을 통하지 않고 제 맘대로 엄선하여 성심성의껏 답변하도록 하겠다.
Q: 셰이더(Shader)가 뭔가요?
렌더링 엔진의 기본 기능은 3D 모델을 카메라 공간으로 변환하여 2D 이미지로 구현하는 것이다. 이것만으로도 계산량은 엄청나게 많아 전용 그래픽 가속기, 즉 지금의 그래픽 카드가 탄생하는 계기가 됐다. 이렇게 2D 이미지로 변환할 때는 가상 공간 물체들의 모양이 중요하지만, 좀 더 현실적인 결과물을 위해서는 변환할 때 나타나는 이미지의 색상을 계산하는 것이 중요하다. 아울러 색에 영향을 주는 것은 빛과 물체가 어떻게 반응하는지 계산하는 라이팅(Lighting), 그리고 빛이 닿지 않는 곳에 그림자를 드리우는 쉐도잉(Shadowing) 알고리즘 등이 중요한 역할을 담당한다.
어느덧 시간은 흘렀다. 기술의 발전으로 그래픽 카드 연산 능력 또한 괄목할 만한 성장을 해냈다. 하드웨어에서 정해진 방식으로 색을 계산하던 시대를 지나, 프로그래머가 원하는 대로 알고리즘을 구현할 수 있는 시대가 열린 것이다. 'HLSL'나 'GLSL'같은 셰이더 언어로 'C++'이나 '자바'같이 원하는 프로그램을 작성할 수 있게 되면서 물리 기반 셰이더(Physical Based Shader) 같은 현실 세계의 물리적인 성질과 광학을 도입이 가능해졌다. 덕분에 이전보다 훨씬 사실적인 이미지를 생성할 수 있게 됐다. 이에 곁들여 'DirectX 11'에서는 지오메트리 셰이더(Geometry Shader)나 컴퓨트 셰이더(Compute Shader) 같이 단순 색에 대한 계산 외에도 3D 모델을 실시간으로 변경하거나 일반화된 다양한 알고리즘을 적용할 수 있게 되어 더욱 다양한 표현이 가능해졌다.
좋은 그래픽 엔진은 셰이더를 쉽게 제작할 수 있는 툴을 사전에 제공한다. 이를 통해 프로그래머의 도움 없이 그래픽 디자이너가 직접 제작 가능하며, 이는 게임을 만들 때 작업 능률을 크게 향상시키는 결정적인 요소로 작용한다.
Q: 글로벌 일루미네이션은 무엇인가요?
글로벌 일루미네이션(전역 조명)은 직접 표면에 반사되는 빛 외에 두 번 이상 반사되는 빛까지 표현해서 사실적으로 표현하는 알고리즘을 말한다. 아래 그림에서 볼 수 있듯이, 직접 표면에 반사하여 우리 눈에 도달하는 빛(direct lighting)만을 표현하면 비현실적으로 구현되고만다. 그 때문에 표면에 반사한 후 다른 곳에 반사되어 눈에 도달하는 빛(indirect lighting)에 대한 계산이 필요한 것이다.
이 기능은 실시간이 아닌 CG 영화에서는 당연히 적용하고 있었으나, 실시간으로 빛을 계산해야 하는 게임에서 구현하기에는 어려움이 많았다. 그래서 당시 대부분의 게임들은 반사광을 고려하지 않고 단순한 빛 계산으로 처리하는 편법을 많이 사용했다. 미리 계산하여 실시간으로 적용하는 방식이기에 전체 게임 장면에서 빛이 움직이거나 변하는 물체가 많을 경우에는 계산이 정확하지 않았으나, 최근 하드웨어와 기술의 발달로 실시간으로 변화하는 물체에도 적용할 수 있는 방법들이 속속 도입되고 있다.
Q: 2D 게임 엔진에서 3D 게임 엔진으로 변하면서 나타난 차이점은 무엇인가요?
2D 시절에는 게임 엔진 개념이 크게 보편화되지 않았다. 이유는 기술이 게임 컨텐츠와 게임 엔진을 분리할 만큼 성숙하지 않은데다, 무엇보다도 3D 공간을 그려내는 렌더링 기술 자체가 상당히 어렵고 많은 계산량을 필요로 하기 때문이었다. 2D에서 3D로의 변화는 표현할 수 있는 공간의 차원이 증가하는 것을 의미한다. 비로소 2D에서는 표현할 수 없거나 부분적으로만 가능했던 것을 꼼수 없이 제대로 표현할 수 있는 환경이 갖춰진 것이다.
2D와 3D 게임엔진을 간단히 비교하자면 이전의 2D 셀 애니메이션과 영화를 생각하면 되겠다. 셀 애니메이션은 레이어와 같아 몇 장 그려서 겹쳐기만 가능했기에, 모든 움직임을 새롭게 그려야만 했다. 2D 엔진의 표현력 역시 이와 같은 맥락이다. 새로운 그림(스프라이트)의 양으로 표현하니까. 물론 기술의 발달로 후기에는 이미지에 다양한 효과를 적용해 표현력을 더욱 끌어올릴 수 있었지만, 기본적인 공간 표현의 한계를 벗어날 수는 없었다. 장점이 있다면 만화나 그림 특유의 표현을 큰 어려움 없이 표현할 수 있다는 점이다.
위와 반대로 3D 게임엔진은 영화 촬영과 비슷하다. 잘 만들어진 캐릭터와 배경이 있다면, 카메라의 이동으로 어떤 구도도 표현할 수 있다. 현실적으론 가상 공간이기에 계산량과 데이터에 따른 제한이 있지만, 3D 게임 엔진은 현실 세계처럼 원하는 어떤 곳에서 어떻게 인물과 배경을 보여줄지를 결정하면 원하는 대로 보여줄 수 있어 표현의 제약이 없다. 다만 2D 게임 엔진의 경우 보는 방향이 고정되어 있어 애니메이션과 같은 데포르메 같은 표현 등에 자유로운 편이지만, 3D 게임 엔진의 경우 Cut-scene이 아닌 이상 어떤 방향에서 보일 지 알 수 없는 리소스가 많으므로 제작에 노하우가 필요하다.
이해를 돕기 위해 '파이널 판타지3'의 2D 시절과 3D 시절을 비교해보겠다. 2D 파판의 경우 가상 세계에서 캐릭터의 이동과 배경의 묘사가 굉장히 단순화된 2D 그림들로 이루어진 것을 볼 수 있다. 각각의 캐릭터들은 움직임에 따라서 다른 그림을 가지고 있으며, 배경 역시 용량 제한으로 인해 사각형 타일의 조합으로 이루어져 있다. 물론 이것도 나름 아트 스타일이고 이런 그래픽을 선호하는 유저들도 많지만, 게임은 모든 경우의 수에 맞춰 제작을 해야 하기에 공간이나 표현의 자유도가 월등한 후자로 가게 된 것은 자연스러운 흐름이다.
예를 들어 2D의 경우 카메라 움직임을 묘사하려면 그에 해당하는 그림을 따로 제작을 해야 하기에 다양한 카메라 움직임 자체를 표현할 수 없거나 애니메이션 수준의 많은 이미지를 필요로 하게 된다. 하지만 3D라면 하나의 모델로 원하는 카메라 움직임을 마음껏 표현할 수 있으므로, 표현의 자유와 제작 프로세스에 있어 큰 장점을 지닌다.
Q: 그래픽 엔진을 통해 게임화면을 만들어 낸다면, 자연스러운 그래픽을 표현하기 위해 개발자들도 미술 이론을 알고 있어야 하는 건가요?
좋은 질문이다. 그래픽 엔진은 위에서 말한 렌더링 알고리즘과 3D 가상 공간을 구성하기 위한 기능들로 이루어져 있기에, 어느 정도 개발자의 이해도가 필요하다. 마치 포토샵으로 사진을 편집할 때, 전문가가 다루면 예술 작품이 탄생하지만, 각 툴의 기능을 모르고 만들면 엉망이 되는 것과 비슷하다.
뛰어난 기능을 지닌 그래픽 엔진은 해당 그래픽 리소스와 결과물을 쉽고 편하게 만들 수 있게 해주지만, 결국 컨텐츠 제작자의 역량에 따라 그 결과물은 판이하게 달라진다. 때문에 결과물을 어떻게 표현할 것인가에 대한 미술 이론적 감각, 그리고 표현을 위한 그래픽 엔진의 대한 전반적인 이해가 뒷받침되야 한다. 제작자는 그래픽 엔진의 기능과 한계를 잘 알고 있으면서, 그 범위 안에서 최대한의 결과를 뽑아내는 것이 중요하다. 또한, 게임에 필요한 기능이 엔진에 없을 때 그래픽 프로그래머와 함께 개선해나가려는 노력도 필요하다.
여기서 한 가지 중요한 것은 예전과는 달리 아티스트들이 그래픽 에셋을 제작할 시 많은 공부를 필요로 한다는 점이다. 엔진 기능이 발전할수록 거기에 맞는 리소스를 제작하는 아티스트 분들의 노력과 이해가 필요하다. 특히 요즘처럼 물리적으로 정확한 라이팅을 사용하는 엔진들을 다룰 때는 제작 단계부터 심도깊은 고찰이 필요하다. 물론 테크니컬 아티스트 같은 분들이 잘 관리해주면 이 부분을 많이 보완할 수 있다. 또한, 프로그래머들도 실제 물리 특성을 아티스트 분들이 사용하기 편한 파라미터(Parameter)로 조절하여 제공해야 한다.
부족한 문장이지만 그래픽 엔진에 대한 이해가 조금 더 높아졌기를 바란다. 다음 칼럼에서는 이번에 다루지 못한 Q&A와 댓글에서 엄선한 주제 위주로 내용을 다루어보도록 하겠다. 궁금한 것이 있다면, 바로 리플을 달아주시길!