꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by cagetu

한 달만에 글을 올리게 되는군요. 요즘에 조금 슬럼프(?)가 와서 귀차니즘 발동에 아무것도 하지 않고 있다가 정신이 좀 들어서 다시 정신줄 놓기 전에 글을 써볼까 합니다.

얼마 전 엄청 E3 2012에서 많은 게임 영상들이 공개되었는데요. 그 중에 눈에 띄는 영상이 있었으니, 바로 Unreal4 Engine과 스퀘어-에닉스의 차세대 엔진 Luminous의 테크 데모 동영상이었습니다.

이렇게 게임 엔진하면, 가장 먼저 떠오르는 것이 바로 높은 수준의 그래픽 퀄리티와 성능을 보장하는 렌더링 능력입니다. 그렇다면, 이렇게 게임엔진에서 이런 높은 수준의 렌더러을 만들어내는 사람들은 누구일까요? 

여러 직군 중에서 이런 업무를 주로 담당하는 직군을 "그래픽스 프로그래머(Graphics Programmers)"합니다. 오늘은 이 그래픽스 프로그래머에 대해서 소개를 해볼까 힙니다. 


그래픽스 프로그래머!?

그래픽스 프로그래머(Graphics Programmer)는 단어 그대로 해석하면 게임의 그래픽에 대한 프로그래밍을 하는 사람들입니다. 통상적으로 3D 프로그래머, 엔진 프로그래머, 렌더링 프로그래머, 비쥬얼 프로그래머 등 회사마다 편한데로 다양하게 불리우고 있고, 엄밀하게 말하면 다른 의미가 되겠지만 거의 같은 말이라고 보면 될 듯합니다.
(앞으로 내용 중에 그래픽 프로그래머와 엔진 프로그래머를 혼용해서 사용할텐데, 그냥 같은 뜻으로 보시면 됩니다. ㅎ)

그럼 그래픽스 프로그래머는 구체적으로 무슨 일을 할까요? 

요즘에는 게임 그래픽 대한 작업을, 아티스트분들이 거의 전담하게 됩니다. 특히, 테크니컬 아티스트(TA)분들이 엔진의 매터리얼 에디터를 이용하거나 직접 셰이더 코드를 짜면서까지도 셰이더 작업을 많이 하고 있습니다. 그래서 가끔은 테크니컬 아티스트와 그래픽스 프로그래머의 구분이이 명확하게 되지 않는 것도 사실입니다. 두 직군에서 처리하는 업무의 테크니컬한 주제로 보자면, 그래픽스 프로그래머와 테크니컬 아티스트는 같은 주제를 다루게 됩니다. 단지, 그것을 구현하는 데에 있어서의 역할이 조금 다를 뿐입니다.

얼마전에 핑속님의 테크니컬 아티스트 아티클을 보시면 테크니컬 아티스트가 어떤 일을 하는가를 잘 설명해주셨으니, 테크니컬 아티스트에 대해서는 핑속님에게~ ㅎ

그래픽스 프로그래머는 TA와 마찬가지로 직접 셰이더를 작성해서 결과물을 만들기도 하지만, 가장 큰 차이점은 직접적으로 게임 엔진을 다루는 일을 하게 되는 것입니다. 간단하게 예를 들어보면, 언리얼의 머터리얼에 대해서는 "머터리얼 에디터"를 이용해서 셰이더를 작성할 수 있습니다. 하지만, 렌더링 파이프라인을 조작해야 한다거나, 셰이더 조합에 대한 내부적인 처리까지 조작을 허용하지는 않습니다. 그 영역은 프로그래머가 다루어야 할 내용입니다. 

그래서, 사실 좀 더 정확하게 말하자면,  "그래픽스 엔진 프로그래머(Graphics Engine Programmer)"라고 부르는 것이 맞습니다. 이는 게임 엔진 부분에서 그래픽적인 내용. 즉, 그래픽스 렌더러를 개발하고 수정하는데 특화된 프로그래머를 의미합니다. 그렇기 때문에, 그래픽스 프로그래머가 하는 업무의 범위는 상당히 넓습니다. 크게 생각하면, 3D를 다루는 모든 범위를 다룬다도 할 수 있을 것 같군요. (3D 컴퓨터 그래픽스라는 범위로 봤을 때에 애니메이션도 포함된다구욧~) 


그래픽 프로그래머가 하는 업무는 크게 나누면 두 가지로 나눌 수 있을 것 같습니다. 하나는 게임 엔진의 그래픽에 관련된 기능들을 구현하는 것이고, 또 하나는 그 구현된 그래픽 기능들이 게임에서 잘 돌아갈 수 있도록 최적화하는 것입니다. 게임에 맞는 가장 적절한 그래픽을 보여줄 수 있는 가장 빠른 방법을 만들어내는 것이 중요합니다. 사실 어떻게 보면, 기능을 추가하는 것 자체가 그렇게 어렵지 않을 수도 있습니다. 하지만, 이 기능들을 게임에 녹아들게 해서 실제로 게임에서 빛을 보게 하는 일은 그리 쉬운 일이 아닙니다. 

그래픽스 프로그래머(엔진 프로그래머)는 기술적인 이슈를 다루기 때문에, 가끔은 최신 기술이나 화려한 기술들에 대해서 집착하는 경향이 있기는 합니다만, 궁극적으로 (테크니컬) 아티스트와 동일하게, 게임에 맞는 가장 좋은 퀄리티의 그래픽을 만들어 내는 것입니다. (Graphics VS Aesthetics을 보시는 것을 추천드려요~) 

그렇기 때문에, 그래픽 프로그래머는 프로그래머이지만, 좋은 그래픽이 무엇인지 좋은 그래픽을 만들기 위해서는 어떻게 해야 하는지에 대한 많은 고민을 해야 합니다. 그러기 위해서는 아티스트들과도 많이 이야기를 해야 하고, 어느 정도 그래픽(아트)에 대해서도 공부를 할 필요가 있다고 생각이 듭니다. (제가 이런 감각이 없어서 엄청 고생 중이에요.. ㅜㅜ)


그래픽스 프로그래머의 작업 결과물은 툴 작업을 거쳐서 아티스트들에게 제공됩니다. 즉, 아티스트들이 고객이라는 이야기입니다. 엔진 개발자(그래픽스 프로그래머)는 같이 일하는 툴 사용자들에 대한 서비스 마인드가 가져야 한다는 것은 매우 중요한 이야기입니다. 사실 3D 엔진 개발자들이 회사에서 가지는 영향력이 상당히 컸었기 때문에, 개발팀 내부에서 콧대 높은 엔진 개발자들에 대해서 안 좋은 이미지를 가지고 있는 경우도 참 많습니다. 


(지금은 그렇지 않아요~ ㅎㅎ)

그래픽스 프로그래머가 되려면?

그래픽스 프로그래머가 되려면 어떤 공부들을 해야 할까요? 음.... 제가 어떤 것이 필요하다고 하기 전에 구직사이트에서 그래픽스 프로그래머에 대한 요구스펙에 대해서 한번 보는게 좋을 것 같군요. 

몇 가지 공통적인 요구사항들이 있어서 정리해보도록 하겠습니다.

1. C/C++

렌더링 엔진 Core는 성능이 가장 중요하게 요구되기 때문에, 대부분의 경우에는 C++을 이용해서 구현을 하게 됩니다. 그렇기 때문에, 엔진 안에서 그래픽스 기능들을 구현하기 위해서는 당연히 C++를 이용하게 됩니다. 그러다보니, C++에 익숙한 것은 당연한 요구사항입니다. 또한 엔진의 성능이 매우 중요하기 때문에, 언어를 잘 다룰 줄 아는 것이 매우 중요합니다. (ex : std list의 size()을 남발하는 것...)

2. 3D API (DirectX / OpenGL)

렌더링 엔진은 3D 그래픽스를 처리하기 위해서 DirectX / OpenGL 과 같은 3D API를 사용합니다. 그렇기 때문에, 당연히 게임 엔진에 맞는 3D API를 잘 사용할 줄 아는 것은 매우 중요합니다. 현재에는 국내의 PC 온라인 게임의 경우에는 Direct3D9를 가장 많이 사용하지만, 차세대 게임 엔진들은 Direct3D11을 사용하고 있고, 요즘과 같이 모바일이나 웹 게임의 경우에는 OpenGLES을 사용하고 있기 때문에 프로젝트에 맞는 API를 공부해서 익숙해져야 합니다.  

3. Shader

기본적으로 HLSL을 사용하기 때문에, HLSL 문법을 익히면 됩니다. 문법적으로 봤을 때, 셰이더 프로그래밍 자체는 그렇게 어렵지 않습니다. RenderMonkey등의 에디터를 이용해서, 쉽게 공부해볼 수도 있구요. 하지만, 이미 모든 고수준 그래픽 기술들은 셰이더를 통해서 작성되기 때문에, 많은 연습을 해두는 편이 좋습니다. DirectX11의 경우, Shader Model 5.0을 사용하고 있기 때문에, DirectX11을 사용한다면 공부할 필요가 있겠구요. 요즘 모바일 기기들도 OpenGLES 2.0을 거의 기본적으로 적용하고 있기 때문에, GLSL 문법을 통해서 셰이더 처리를 하고 있습니다. 

4. 그 밖에

3D를 다루기 때문에, 당연히 수학적 지식은 굉장히 중요합니다. 회사에서 딱히 수학을 잘하냐? 라고 물어보지는 않지만, 수학적인 지식이 없다면, 분명히 한계에 부딪힐 수 밖에 없기 때문에 시간이 날 때 미리 미리 공부를 해두는 편이 좋습니다. 

또, 좋은 그래픽을 볼 줄 아는 눈도 연습을 통해서 키워나가는 것이 중요합니다. 저도 이 부분에 대해서 고민이 많았는데, 사진을 통해서 많은 도움을 받을 수 있다고 합니다. 좋은 그림, 좋은 영상과 주변 배경 등을 평소에 잘 관찰하는 것이 많은 도움을 줄 수 있습니다. 요즘에는 Pinterest와  유투브 같은 서비스를 이용해서 참고할만한 소스들을 스크랩해두는 것도 많은 도움이 되네요. 또, 주변에 아티스트분들과 친분을 쌓아두는 것도 매우 좋습니다. (아트님들 굽신~ 굽신~ 저 점 잘 봐주세요~ 헤~)

그래픽스 프로그래머는 사실 진입 장벽이 꽤 높습니다. 요즘과 같이 게임의 그래픽 기술들이 발전하면서, 알아야 할 것들도 많아졌고, 공부해야 할 것들도 많습니다. 거기에 발전속도 또한 상당히 빠릅니다. 그렇기 때문에, 꾸준히 공부를 하고, 만들어보고 관심을 가지는 방법 말고는 특별히 방법이 없군요. 그래픽스 프로그래머를 하고자 하시는 분들이시라면, 대학원에서 그래픽스과정을 공부해보시는 것도 추천해드립니다. 

마지막으로, 여기 그래픽스 프로그래머가 된 사람의 인터뷰를 보시는 것도 도움이 될 듯 하네요. 
- "위대한 게임의 탄생 2"에 김포프님의 "생생한 그래픽스 프로그래머 인터뷰"가 담겨 있으니, 꼭 한번 읽어보시기 바랍니다. 
- So You Want to be a Graphics Programmer (http://www.altdevblogaday.com/2011/05/10/so-you-want-to-be-a-graphics-programmer/)


맺음말

얼마 전부터 주변에서 "엔진 프로그래머 좀 구해줘~"라는 이야기를 참 많이 듣습니다. 어느 순간부터 주변에서 엔진을 개발하거나 엔진 관련한 일을 하시던 분들이 많이 줄어들고 있습니다. 반대로, 게임 엔진을 개발하고 싶거나 그래픽스 관련한 일을 하고 싶어하는 개발자들이 자신이 좋아하는 업무를 선택할 수 있는 기회도 예전에 비해서는 많이 줄어들었습니다.

그렇지만, 아직도 많은 곳 (IMC Games, 마이에트, 스쿼드플로우, 마비노기2 등)에서 자체 엔진을 개발하고 있고, 수 많은 그래픽스 프로그래머와 아티스트들이 좋은 그래픽을 만들기 위해서 많은 노력을 하고 있습니다. 그리고, 국내에는 생각하신 것보다 매우 뛰어난 그래픽스 프로그래머들이 많이 계십니다. (외부로 많이 드러나지 않아서 그렇지요... 티스?! ㅎㅎ)

상용엔진을 사용한다고 하더라도 엔진 내부를 자신의 게임에 맞는 결과를 만들기 위해서 그래픽스 프로그래머들과 아티스트들이 엔진 수정과 기능 추가등을 진행해야 합니다. 아직도 그래픽스(엔진) 프로그래머를 필요로 하는 곳이 많습니다. 

게임에서 뛰어난 그래픽을 만들어 낸다는 것은 굉장히 흥분되는 일이고, 매우 즐거운 일입니다. 저도 언젠가는 언리얼 엔진에 버금가는 결과물을 한번 만들어보고 싶군요!!! 그 날이 오겠죠?! ㅎㅎ

이런 흥분되는 일에 관심이 있으신가요?! 도전하세요!  많은 곳에서 여러분들을 기다리고 있다니깐요~!!! 우힛~!


이 글은 사실 핑속님의 "테크니컬 아티스트란?" 을 읽고, 전반적으로 업계 직군에 대해서 한번 정도 싹 소개해보면 어떨까? 라는 생각에 비록 제가 아직 직군을 소개할 정도가 되는 것은 아니지만, 용기내어 적어보았습니다. 하고 싶은 말이 많았는데, 두서 없이 주절거렸군요. 혹시 궁금한 것들이 있으시면 질문하시면 포프님이 최대한 답변해드릴거에요~ ㅎㅎ 그럼 꾸벅~


TAG

댓글을 달아 주세요

  1. Favicon of https://gamedevforever.com 김포프 2012.06.28 15:17 신고  댓글주소  수정/삭제  댓글쓰기

    저는 아무데서나 시도때도 없이 불쑥불쑥 등장하는군요.. 정작 별로 하는건 없는거 같은데.....

  2. Favicon of https://gamedevforever.com 풍풍풍 2012.06.28 17:34 신고  댓글주소  수정/삭제  댓글쓰기

    역시 숨은실력자 티스형!! 언리얼4 만들어주세염~

  3. Favicon of http://bluekms21.blog.me 크로스 2012.06.29 02:03  댓글주소  수정/삭제  댓글쓰기

    이 페이지에서만 '포프'단어가 7개 검색되는군요...
    이걸로 이제 8개인가요..?
    그만큼 유명한 프로그래머란 뜻이라 부럽기까지 합니다...ㅎ

  4. 아크 2012.06.29 12:18  댓글주소  수정/삭제  댓글쓰기

    std list의 size() 남발이 왜 안좋은가요? 보통 내부에 카운터를 통해서 O(1)이지 않나요? 제가 잘못 알고 있는것인가요? 아니면 이 외에 다른 이유가 있나요?

    • Hybrid 2012.06.29 18:24  댓글주소  수정/삭제

      내부 사이즈를 가지고 있다면 O(1)일 텐데, linked list 특성상 사이즈를 가지고 있지 않은 경우가 구현하기 편하죠.
      (심지어 double linked list니........)

      C++표준은 O(1)임을 강제하기 않았었기 때문에 구현에따라 O(N)도 있었고, O(1)도 있었나봅니다.
      반면, C++11에서는 O(1)이어야 한다고 하는군요.

      좋은 쓰레드가 있습니다. 관심 있으시다면 한번 읽어볼만할꺼 같네요.
      http://stackoverflow.com/questions/228908/is-listsize-really-on
      http://stackoverflow.com/questions/10065055/why-is-stdlist-bigger-on-c11

  5. prog 2012.06.29 13:14  댓글주소  수정/삭제  댓글쓰기

    왜 않좋은가? size는 상수시간과 선형시간이고 empty는 항상 상수 시간이기 때문입니다. List의 경우 splice의 경우를 생각하면 A에다가 B를 잘라다 붙이면 size를 체크 할 때 어떻게 해야 할까요?? 분명 다시 세어야 합니다. 그럼 시간이 걸리겠죠.. 그래서 아마도 위에 분이 이야기 한것은 size가 0인것을 체크하고 싶을때를 이야기 하는것 입니다. 그러니깐 사이즈가 0일때는 empty를 쓰는것이 많다는 이야기 입니다.

    • Hybrid 2012.06.29 18:32  댓글주소  수정/삭제

      아.... 갑자기 왜 empty말씀을 하시나 했더니... effective c++에 나와있는 내용을 말씀하신거였군요ㅎㅎ

  6. Favicon of https://gamedevforever.com cagetu 2012.06.29 18:26 신고  댓글주소  수정/삭제  댓글쓰기

    effective c++에 나와있는 내용인데, 저도 기억이 가물가물.. ㅡㅡ;;
    이건 그냥 참고: http://www-staff.it.uts.edu.au/~ypisan/programming/stl50.html

    저도 C++11 나오고 해서, 다시 C++ 공부 열심히 하려고요.. ^^;;
    (제가 이런 글을 쓸 처지가 못되는군요.. ㅡㅡ)

  7. Favicon of http://Junios.net Junios 2012.07.10 09:32  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다.

  8. Prgo 2012.08.30 16:57  댓글주소  수정/삭제  댓글쓰기

    헐 헐 헐...일본은 죽었다 죽었다 해도 게임개발은 정말 끝내주게 잘 하는것 같다는 생각이..

  9. Prgo 2012.08.30 16:57  댓글주소  수정/삭제  댓글쓰기

    헐 헐 헐...일본은 죽었다 죽었다 해도 게임개발은 정말 끝내주게 잘 하는것 같다는 생각이..

  10. Favicon of http://blog.naver.com/edgerider 김성준 2012.08.31 18:19  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 좋은글 잘봤습니다. 점점 프로그래머와 아티스트의 경계들이 사라지는 듯한 느낌이드네요
    프로그래머분들도 아트의 영역을 알아야 하고, 아티스트들도 기술적인 영역에 관심을 많이 가져야 하는것 같습니다. 어쩌면 종합예술이라는 관점에서 게임을 본다면 당연한 얘기일수 있겠죠