< 개인적으로 내가 걸어온 길이고 무조건 맞고 효율적인건 아님. 참고정도로만 봐줘. 반박시 니 말이 맞음! >


- 미적분학 + 선형 대수학(벡터, 행렬, 변환에 대한 이해 위주로)


- 수치 해석(심화된 그래픽스 이론들 이해에 어느정도 필요함)


- C++


- 자료 구조/알고리즘/OS (렌더링에 직접적으로 연관이 있다기보다는, 최적화 기법들과 연관성이 있음)


- 기초 컴퓨터 그래픽스 이론(색 이론, 카메라, 오브젝트, 빛, 셰이더에 대한 이해, 렌더링 파이프라인에 대한 이해 : 기본)


--------------------------------------------------------------------


< 여기까지가 보통 대부분 대학 학부 과정에서 다루는 내용이라 생각함 >


--------------------------------------------------------------------


- 영어(읽기) : 어쩔 수 없다, 국내에서 얻을 수 있는 정보가 특히나 적은 분야라고 생각함. 학부에서 가르쳐주는 내용 이후부터 얻어야하는 정보는 대다수(사실상 전부)가 영어로 되있다.


- LearnOpenGL 과 같은 튜토리얼 사이트를 참고해가면서 좀 더 깊숙히 파고들기(그래픽스 라이브러리랑 친해지기)


<LearnOpengl로 한번 해보고, 최근에 나도 읽고 있는 책인데 3D Graphics Rendering Cookbook(Packt Pub. 2021) 도 여러 기법들이랑 최적화 기법, 그리고 모던 OpenGL API들이랑 Vulkan 활용에 대해서도 다뤄서 괜찮은 것 같음! 다만 앞에서 언급한 내용들은 잘 숙지해야 함!>


- 기초적인 광학 지식(Geometrical optics)


- 실제로 게임 엔진들에서 사용하는 반사 모델들(BRDF, BSDF, BSSRDF, ...)에 대한 지식(Unreal Engine, Frostbite, Filament 등 여러 게임/실시간 렌더링 엔진들이 이를 정리해둔 아티클들을 배포하고있어서 구글링 하면 쉽게 찾을 수 있음)

< 예를 들어, Real Shading in Unreal Engine 4<Siggraph 2013> 에는 어떤 라이팅 모델, BRDF 등을 사용했는지 나와있고 셰이더 코드까지 어느정도 제공해줘서 좋다고 생각함. 좀 더 자세한 내용을 담고있고 figure도 많이 제공해주는 EA의 Frostbite 엔진에서 어떻게 했는지 알려주는 문서로는 Moving Frostbite to Physically Based Rendering<Siggraph 2014>이 있고. 여기에 Google의 Filament 프로젝트 Core documentation 도 관련 내용을 깔끔하게 잘 정리해뒀으니 꼭 읽어보는걸 추천함 >


- GDC 같은 게임 개발 컨퍼런스에서 최근에 어떤 기법들이 주류로 떠오르는지 찾아서 공부/구현 해보기

< 멤버쉽이 있어야 들을 수 있는 내용도 있지만, 대부분의 경우 무료로 자료 열람이 가능하고, 보통 많이 들어본 게임들이나 게임 개발사들이 많이 발표함. 꼭 렌더링 기법들 뿐만 아니더라도 게임 프로그래밍에 필요한 예를 들어 디버깅 기법들이나 프로파일링, 메모리 관리, 멀티 플랫폼 대응, AI 적용등 여러 흥미로운 내용이 많으니까. 꼭 한번 둘러보는걸 추천 >


Realtime Rendering(A K Peters/CRC Press; 최신 번역서 없음;) 같은 서적을 찾아서 실시간 렌더링 기법(그림자, 애니메이션, 톤 매핑, 후처리, off-screen 렌더링 기법들)들에 대한 포괄적인 레퍼런스 확보하기


- 최신 그래픽스 API(Direct3D 11, OpenGL 4.x)들 에 대해서 공부하고, 기본적인 셰이더 뿐만아니라 여러 보조적인(Geometry Shader, Tessellation Stage, Compute Shader)들의 활용법에 대해서 공부하기


< 특히 여기서는, 일단 만들어보는게 중요함. 일단 만들어보고 기능들을 계속 추가해나가면서 확장해나가는게 실력 향상, 이해에 많은 도움이 되고. 튜토리얼에서 제공하는 기본적인 기능들에서 더 최적화 할려면, 더 좋게 보이게 할려면 어떻게 해야할지에 대해 계속 고민하고, 시도해보는걸 추천함. 또한 일단 내맘대로 만들어보되, 끊임없이 다른 사람들은 어떻게 만들었는지를 깃헙에 소규모 게임 엔진, 또는 렌더링 엔진들의 소스코드를 분석해나가면서 최적화/개선 해가는게 중요한 것 같음. >


------------------------------------------------------------------


여기까지가 기본적으로 게임 엔진 개발/실시간 렌더링 기법들에 대한 공부의 마지노선. 아래 부터는 자체적으로 R&D나 더 복잡한 현상들에 대한 모델링, 기법, 그리고 최신 연구(논문)들을 따라가기 위해서 알아야 하는 내용들. 여기서 부터는 책을 읽더라도 전부를 이해한다기보다는 이런게 있구나 정도로 이해하는 식으로. 그러다가 이부분에 대해서 조금 더 알아보고 싶은데? 하는것들은 책에서 reference로 쓴 논문이나 자료들. 또는 Further Reading에 있는 자료들을 직접 더 찾아보는 식으로.


특정 기술에나오는 어떤 현상/기법을 설명하기 위해서 수학/물리적 개념들을 사용하는 경우가 많은데. 이런 개념들이 어떤 현상을 나타내는지에 대한 직관적인 이해만 할 수 있어도 충분하고. 더 깊게 공부할 필요성이 있는 경우에만<또는 직관적인 이해가 되지 않는 경우> 다른 분야(대표적으로 공학수학/수치해석 기법/통계 및 확률 이론/샘플링 이론/알고리즘 기타..)에서 취사선택해서 공부할 필요가 있음.


------------------------------------------------------------------
- GPU의 구조/동작 방식에 대해서 더 자세하게 파고들어 보기(GPU 아키텍쳐 whitepaper 들이나 CUDA에서 설명하는 개념, 그리고 OS 배우면서 들어봤을 캐싱 개념들도 중요함)

- 기초적인 Raytracing, Raymarching 등 오프라인 렌더링 기법들(RTX 이후로 실시간 렌더링에서도 활용 가능)


- 개인적으로 Raytracing 구현의 시작은 Ray tracing in one weekends 시리즈 를 추천하고 싶음. 0부터 기본적인 ray tracer에 대한 간단한 구현부터 BVH-tree 같은 가속 구조, 그리고 뒤로 갈수록 더 복잡한 알고리즘들을 step by step으로 구현해볼 수 있는 몇안되는 튜토리얼임! 실제로 CPU 상에서 돌아가고, 결과물을 뽑아 볼 수 있으니 C++ 에 거부감만 없다면 정말 뿌듯하고 재미있게 할 수 있다고 생각함.


- Advanced Global Illumination(원서) : GI 효과를 구현하는데(Offline Rendering) 쓰이는 여러가지 알고리즘(Radiosity, Path tracing)들에 대한 이론적인 설명이 무척 잘 되어있다고 생각함. 또한 그 알고리즘들을 이해하는데 필요한 수학적인 도구(확률, Monte-Carlo Method, Solid Angle)들이나 물리학 측면에서 필요한 지식들 또한 간단하게 다루고 있으므로. 만약 PBRT를 읽을 사람들이나 또는 렌더링에서 특히 Global Illumination이나 Light Transport에 관심있는 사람들에겐 강추해주고 싶음.


- 공학 수학 + 심화 수치 해석 기법들 + 통계/확률 이론


- PBRT( 웹에서 무료로 볼 수 있음 ; 번역서도 있음) 와 같은 서적으로 오프라인 렌더링에 대한 고급 이론들 공부하기 (전부 100% 이해한다기 보다는 필요한 부분, 그리고 흥미있는 부분부터 읽어 나가기, 초반에 설명하는 구조적인 부분만 제대로 숙지해두면 어느 챕터부터 읽든 상관없도록 구성되있음.)


- 최신 연구 동향 파악해서 따라가기(Siggraph, Eurographics 같은 학회에서 발표되는 연구들 찾아보기). 만약 아이디어가 있다면 직접 연구를 통해 현상을 모델링, 구현해보기


- Vulkan/Direct3D 12 와 같은 모던 그래픽스 라이브러리들에 대한 이해 및 활용

- 자신만의 렌더링 엔진(또는 게임 엔진) 계속 개발해나가기
-------------------------------------------------------------------------

* 마지막으로 덧 붙이자면 물론 그래픽스 라이브러리에 대해서 잘 아는것, 예를 들어 Direct3D 9, 11, 12.. OpenGL, Metal, Vulkan 등 많이 알고, D3D 12, Vulkan을 쓸 줄 아는것도 중요하겠지만은, 그래픽스 라이브러리 사용 유무가 공부를 하는 주 목적이 되지 않도록 주의하면 좋을 것 같음. 또한 진짜 개인적인 생각이지만 그래픽스 라이브러리를 D3D12, Vulkan으로 시작하지 않았으면 좋을 것 같음. 왜냐하면 이 둘의 특징이 기존에 드라이버에서 하던 작업들을 끄집어내서, 나쁘게 말하자면 프로그래머 한테 이 일을 덤탱이 씌운것(좋게 말하자면 더 로우레벨 컨트롤이 가능해졌다지만)이라서 이런 일들을 먼저 하다보면 배우는데 시간도 오래걸리고, 쉽게 지칠 수 있다고 생각함. 그러니까 D3D11, OpenGL을 위주로 먼저 공부를 하면서, 차라리 간단한 렌더링 라이브러리(엔진)을 만들면서 기본적인 내용들에 익숙해진 다음에 위 내용들을 다루면 좋다고 생각함.

나도 괜히 이런저런 라이브러리 만져보겠다, 다 배워서 라이브러리 만들어 보겠다고 깝치다가 년단위로 시간 날려먹었고 허비했음


2022/04/23 Advanced Global Illumination, Ray tracing in one weekends series 추가