[Graphics] 컴퓨터 그래픽스 공부과정, 그리고 알게 된 것
나는 2019년 3월부터 컴퓨터 그래픽스에 관심을 가지고 공부하기 시작했다. 2년이 넘는 시간동안 (지속적이진 않았지만) 그래픽스를 나름대로 공부한 과정과 그 과정에서 알게 된 것들을 정리해보는 시간을 가지려고 한다.
<요약>
- 그래픽스 전공 교수님들과 상담
- MAYA에서 pymel, cmds로 간단한 스크립트 모델링
- 컴퓨터 그래픽스에 대한 리서치 :: 기본 웹서치, 포프, 채용공고 등
- 쉐이더 GLSL 공부 :: 생활코딩 이을, thebookofshaders
- OpenGL 공부 :: Computer Graphics Programming in OpenGL
- 대학교 컴퓨터 공학 수업 :: 프로그래밍언어론, 그래픽프로그래밍설계, 컴퓨터그래픽스, 머신러닝
- 머신러닝 :: 비주얼라이제이션 연구실 학부연구생
컴퓨터 그래픽스에 관심을 갖게 된 이유
2018년 여름 컴퓨터공학을 공부할 것을 결심하고 나서, 복수전공을 신청하고 합격을 기다리며 컴퓨터공학에 있는 분야들을 이것저것 알아보았다. 그 중 그래픽스라는 전공분야가 눈에 띄었는데, 내가 평소 미술에 관심이 많았고 컴퓨터 공학에서 흔히 아는 ‘그래픽’을 다룬다는 것이 흥미로웠기 때문이다.
학교 교수님들과의 상담
아래에서 언급 하겠지만, 개념 정립에 시간이 오래 걸려 교수님들께 도움을 청했다. 학교에 그래픽스 과목을 전공하신 컴퓨터 공학과 교수님들께 메일을 보내 상담을 요청했다. 윤경현 교수님은 기본적인 그래픽스 엔지니어들의 일을 간략하게 설명해 주시며, 라이브러리를 공부해볼 것을 추천해 주셨다. 그리고 보통은 그래픽스 프로그래밍보다 스크립트를 통한 그래픽 렌더링을 관심 있어 한다며 박진완 교수님을 만나볼 것을 추천하셨다.
테크놀로지 아트 연구실에서의 MAYA 프로젝트
박진완 교수님께 무작정 찾아가 해소되지 않았던 궁금증을 여쭈었더니, 백문이 불여일견이라시며 프로젝트를 제안해주셨다. 방학 때 들어온 컴퓨터 공학과 PE 학생과, 연구실 진학에 관심을 갖던 또 한 명의 학생, 그리고 연구실에서 공부 중이던 대학원생 선배 두 명이 함께 MAYA 프로그램을 배우고 프로젝트를 진행했다. pymel과 cmds를 사용하여 코드로 화면에 출력할 모델들을 만드는 프로젝트였는데 꽤 흥미 있었고 빠르게 습득했으나 나는 조금 더 로우한 레벨에 관심이 있다는 것을 깨닫는 기회가 되었다. 그래서 윤경현 교수님께서 설명해주셨던 부분을 더 깊게 리서치했다.
개념 정립에 시간이 오래 걸렸다.
‘컴퓨터 그래픽스’가 무엇인지 정확히 이해하는 데 시간이 오래 걸렸다. 첫째로는 내 머리에 그래픽스와 관련한 지식이 조금도 없었고, 둘째로는 인터넷 상에 나와 있는 자료와 설명은 부족하고 어려웠기 때문이다. 조금이나마 개념을 이해하게 된 루트는 그래픽스 엔지니어로 현업에서 일하시고 지금은 강의와 다른 여러가지 활동을 하시는 ‘포프’님의 유튜브를 시청한 것이 컸다.
그 다음으로는 일반적인 정의를 이해하기 위한 리서치를 시작했고, (아래 글은 꽤 이후에 작성된 글이다.)
이어서 indeed, 로켓펀치, 잡코리아 등의 채용공고와 더불어 해외 기업의 그래픽스 엔지니어, 그래픽 프로그래머, TA(Technical Artist), 그래픽 디자이너 채용공고를 훑어 보았다. 디자이너와 TA는 제외하고, 그래픽 프로그래머 채용에서는 공통적으로 OpenGL, DirectX (드물게 Metal) 와 같은 그래픽 라이브러리 사용 경험이 있는 사람을 찾았고, 조금 더 작은 규모의 회사나 게임 회사에선 Unity, UE(Unreal Engine) 과 같은 상용 게임 엔진 사용 경험을 더 중시했다. 그와 더불어 GLSL, HLSL 과 같은 쉐이더 언어 사용 가능자는 우대해준다는 조건이 있었다.
찾아보다가 깨달은 것은 공부를 해보아야 정확한 개념 정립이 가능하다는 것, 그리고 그래픽스 분야를 공부하고 활용하는 사람이 많지 않아 자료가 상대적으로 적다는 것이다. 그만큼 어렵고, 전문적으로 공부하기 힘들다는 것이겠지만 (실제로 그래픽스 분야의 신입 채용은 거의 없으며, 신입이 되더라도 다른 직무를 맡다가 연차가 쌓이면 그래픽스 부서에 본격적으로 투입된다.) 긍정적으로 생각해보면 이 분야의 정보를 생산할 수 있다면 그 만큼 귀한 인재가 될 수 있다는 뜻으로 해석했다.
쉐이더부터 공부했다. 이유는 짧고 재밌어서.
어떻게 보면 쉐이더라는 것은 메인적인 스킬이 아니라, 그래픽 라이브러리 활용 능력에, 또는 게임 엔진 사용 능력에 곁들여서 추가로 보유하면 좋은 스킬이다. (위에서 언급했듯 채용 과정에서 ‘우대 사항’에 불과하다.) 하지만 나는 쉐이더부터 공부했다. 좋은 튜토리얼을 찾았고, 그래픽라이브러리를 바로 공부하는 것보단 나에게 빠른 피드백과 흥미를 부여할 것 같아서였다.
내가 GLSL 쉐이더를 공부한 튜토리얼과 교재 링크다.
이 과정에서 배우고 느낀 것을 정리해보자면, 그래픽 프로그래밍의 경계 범주에 있는 과정이었고, 쉐이더와 프로세싱을 전문적으로 공부하면 비쥬얼 프록그래머가 될 수 있다는 것을 알게 되었다. 상당한 흥미가 있었지만, MAYA 프로젝트를 진행했던 연구실에서 하는 다른 프로젝트들을 보았기에 비쥬얼 프로그래밍이 어떤 것이고 어떤 일을 하게 되는지 알고 있었고, 그것은 당시 내가 원하는 것이 아니었다.
쉐이더와 C++ 공부를 병행했다.
주변 지인들은 언어 공부를 각 잡고 하는 것을 만류했다. 하지만 나는 이 언어가 나의 메인 언어가 될 것이라고 생각해 기초부터 세세한 부분까지 현업 수준으로 제대로 배우고 싶었다. 아무에게도 말하지 않고 c++ udemy 강의를 결제했다.
현업에서 주의해야 할 부분들과 OOP(Object Oriented Programming), STL(Standard Template Library)를 자세히 배웠고, c++ 11, 14, 17에서 새롭게 추가된 내용들을 정리할 수 있어서 나름 의미있었다.
지금에서 돌이켜보면, 돈 낭비 또는 시간 낭비로 여겨지기도 한다. 내가 충분한 정보 검색력만 있었다면, 더 창의적이고 효율적으로 공부할 수 있었을 것이라고 인정한다. 하지만 당시엔 그런 능력이 없었고, 그런 능력을 키우는 것보다 학습 욕구가 더 컸다.
만약 다시 당시로 돌아간다면, 언어 자체를 공부하기 보단 공부하고 싶은 분야를 공부하며 나오는 생소한 특징들을 거꾸로 연구하는 순서를 가져갔을 것 같다.
드디어 그래픽라이브러리를 제대로 공부했다.
OpenGL을 선택했다. 이유는 OpenGL과 DirectX 중 하나를 선택하려 했는데 당시 내가 맥북을 사용하고 있었기 때문이다. 아마존에서 가장 인기가 좋은 교과서를 구매해서 kindle로 다운받았다. 책 이름은 Computer Graphics Programming in OpenGL이다. 여느 그래픽라이브러리 교과서가 그렇듯 기본 선형대수학을 공부하고, 예제 코드들과 한 줄 한 줄 자세하게 설명된 설명을 이해하다보니 그래픽라이브러리와 ‘그래픽스’ 에 대한 개념이 차곡차곡 정립되는 것이 느껴졌다.
교과서는 반 정도 보았고, (실습은 그보다 조금 덜 했다.) 깃허브에는 4단원까지의 실습 코드만 업로드된 상태다.
맥북에서 OpenGL 지원을 멈춰서 (Metal을 사용하라는 폐쇄적 생태계 때문인듯 하다.) 맥북을 팔고 데스크탑을 맞추는 해프닝도 있었다.
위 링크와 내가 공부하며 업로드했던 블로그를 보면 알 수 있듯이, 내가 그래픽스 공부를 시작하며 예상한 것이 어느정도 맞았다. 올리는 정보들은 사람들이 어떻게든 찾아냈고, 다른 컴퓨터 공학 관련 글/프로젝트보다 인기 있었다. (이 시장이 블루오션이라는 뜻이라고 생각했다.)
학교 복학, 컴퓨터 공학 수업 수강
학교를 복학하면서 컴퓨터 공학과 수업들을 듣느라 (과제가 정말 많다.) 내 공부를 할 시간이 부족했는데, 수업을 관련된 수업으로 선택하는둥 나름의 전략을 펼쳤다.
‘컴퓨터 그래픽스’를 공부하는 데 실제로 도움이 된 과목은 수치해석(반만 이해해서 위 요약 목록엔 적지 않았다.), 프로그래밍언어론, 그래픽 프로그래밍 설계, 컴퓨터 그래픽스이다. 수강 순서는 이와 같지 않았지만, 가장 이상적인 순서는 이렇다.
수학은 나올 때마다 따로 공부하고 있다. 그래서 수학 과목들은 특별히 큰 도움이 되었다고 하긴 힘들다. 대신 프로그래밍언어론(김명호 교수님 수업) 수업은 언어 하나하나를 어떻게 공부하고 익혀야 할지 알게 된 수업이었고, 이젠 어떤 언어를 만나든 내가 기존의 쓰던 언어인 것 마냥 사용할 수 있겠다는 자신감을 갖게 되었다.
그래픽 프로그래밍 설계(박경주 교수님 수업)와 컴퓨터 그래픽스(윤경현 교수님 수업) 과목에서는 마침 OpenGL 라이브러리를 사용했다. 아쉬운 점은 그래픽 프로그래밍 설계는 2D 그래픽만 공부했고, 컴퓨터 그래픽스는 약간의 3D에서 멈췄다. 정작 관심있던 라이팅, 쉐이딩 등은 다루지 않았다. (학부에서는 공부하기 어려운 주제라고 하셨다.)
그리고 그래픽스와 큰 관련은 없지만 아래 학부연구생 활동과 관련이 있던 수업은 머신러닝이다. 머신러닝의 꽤 깊은 알고리즘까지 배울 수 있는 수업이었고, 과제가 상당히 어려웠다.
얼레벌떡 합격하게 된 학부연구생
수치해석 수업을 듣는데, 학부연구생 모집 공고가 올라왔다. 사실 해당 수업을 들은 이유는 수치해석이 필요한 것보다 교수님이 그래픽스를 전공하셨던 교수님이라 연구 주제가 그래픽스 계열이었다는 것이 컸다.
바로 메일을 보내 신청하고, 면접을 보았다. 내가 공부한 내용들과 관심 있는 부분들을 설명했더니 연구실 연구주제와 겹치는 부분이 있어 좋게 봐주신 것 같다.
학부연구생으로서 연구한 주제는 ‘머신러닝을 활용한 그래픽스 프로그래밍’이었다. 원래는 그래픽스를 더 공부하려고 지원했다가, tensorflow를 활용한 머신러닝 연구가 너무 재밌어 보여서 살짝 방향을 전환했다. 대신, 머신러닝을 활용한 프로젝트들에서도 이미지를 활용한 프로젝트들을 주로 했다.
이론을 공부하고 각 알고리즘을 이해하는 데 시간이 오래걸렸고, 두 세개의 프로젝트를 해볼 수 있었다.
공부하기 전엔 몰랐던 것, 그리고 지금의 생각
- 컴퓨터 그래픽스란 개념은 생각보다 어려운 개념이 아니다.
- OpenGL, GLSL 등을 차근차근 공부하며 튜토리얼 프로젝트들을 해본 것이 큰 도움이 되었다.
- 학부 지식만으로 해당 직종에 취업해 처음부터 관련된 일을 하는 것은 거의 불가능하다.
- 대부분의 게임 회사는 상용 엔진을 사용하고 있다.
- 하지만 여전히 그래픽 프로그래머 (그래픽스 엔지니어) 에 대한 수요는 있다. :: 대신 경력을 뽑는다.
- 정말 완벽한 전문지식과 프로그래밍 경험이 있는 사람이 되거나, 다른 기술과 접목된 스킬을 보유해야 가능성 있는 분야다.
- 머신러닝과 관련하여, 이미지 프로세싱이 컴퓨터 그래픽스보다 훨씬 수요가 많은 분야이다.
앞으로의 계획
졸업을 한 학기 앞두고 있기 때문에, 진로에 대한 고민이 많은 시기이다. 지금으로선 내가 시작한 공부들을 조금 더 완벽하게 마무리 짓고, 학교에서 가져가야 할 경험과 지식들을 다시금 정리하는 시간을 가지려고 한다. 앞으로 하게 될 계획은 다음과 같다.
- Computer Graphics Programming 교과서와 튜토리얼 마무리, 업로드
- 학교 수업 중 일부 과목 (머신러닝, 컴퓨터 그래픽스 실습, 그래픽 프로그래밍 실습) 에 대한 복습과 정리
- 튜토리얼이 아닌 실제 개인 프로젝트 추가로 진행 : 비쥬얼 프로그래밍, 그래픽 프로그래밍, 머신러닝의 세 분야
- 한국 기업 취업, 외주 리서치 / 개인 프로젝트 BM 고민
학습 과정에 정답은 없다. 물론 내 결론도 반 이상은 틀린 결론일 수도 있다. 하지만 나의 삽질과 경험이 누군가에겐 도움이 될 수 있을 것이라고 생각한다.