다양한 렌더링의 불편한 동거
처음에는 포워드 렌더링을 구현하는 데 큰 문제가 없어 보였으나, 디퍼드 렌더링을 구현하면서 코드가 혼란스럽게 더러워지기 시작했습니다.
모든 렌더링 기법은 RenderMgr이라는 렌더링 총괄 클래스에 통합되었으며, 그림자 처리를 담당하는 깊이 버퍼는 LightMgr이라는 라이팅 총괄 클래스에 포함되어 있었습니다.
이러한 문제와 함께 다음과 같은 의문이 생겼습니다.
- 디퍼드 렌더링과 포워드 렌더링을 결합한 하이브리드 렌더링을 구현하려면 어떻게 지오메트리 패스를 처리해야 할까?
- 블렌딩 처리된 특수한 포워드 렌더링의 깊이 문제는 어떻게 해결할 수 있을까?
- 그림자 렌더링을 위해 라이팅 코어와 렌더 코어 중 어떤 부분이 관여해야 할까?
모든 이러한 고민의 주요 원인은 서로 다른 렌더링 로직이 선형적인 과정을 거치고 렌더링 단위가 서로 다른 것이었습니다.
이것은 OOP를 준수하며 꾸역꾸역 구현한 방식이 한계에 도달했음을 의미하죠.
따라서 저는 아래의 조건을 충족시키며 클래스를 깔끔하게 개선하기 위해 연구를 진행했습니다.
- 포워드, 디퍼드, 깊이, 포스트 프로세싱 등 다양한 렌더링 기법을 객체화
- 총 6종류(윈도우, 리눅스, android, webgl, macOS, iOS)의 정상적인 구동을 목표
최소한의 인터페이스만 유지하는 Render Group 객체
이런식으로 RenderGroup 클래스를 도입하여, 각각의 렌더링 기법에 따라 로직을 맞춤으로 구현하고 조금의 하드 코딩을 허용하는 방식을 선택했습니다.
여기서 렌더링을 위한 오브젝트들을 각 렌더링 특징에 따라 독립적으로 정의했습니다.
이로써 RenderGroup 클래스는 인터페이스의 역할만 하게 되었으며, 여러 렌더링 기법을 한 번에 처리할 수 있도록 기반을 다시 정립함으로써 렌더링 클래스를 더 깔끔하고 안정적으로 역할 분배할 수 있었습니다.
지금까지의 구현 여정은 아래의 블로그 글에서도 확인하실 수 있습니다.