0803
2026년 8월 3일
카테고리 : 게임엔진, 물리엔진, 셰도우 매핑

약 이틀에 걸쳐서
방향광 인터페이스를 만들고
이에 맞는 셰도우 매핑 패스를 만들었다.
ILight3D, DirectioanlLight3D 가 새롭게 추가되었고
DirectionalLightShadowPass 또한 추가되었다.
그냥 그림자만 있는 건 너무 밋밋해서
물리를 적용해보았다.
확실히 셰이딩이 있어야지
볼 맛이 조금이라도 난다.
엔진 개발 시작하고부터
대충 1년 반 정도가 지났는데,
이제야 (엔진 단에) 셰도우매핑이 구현된 이유가 있다.
- GL 기능 하나 추가하면, 엔진 백엔드부터 하나하나씩 쌓아 올려야한다.
- (1) 때문이라도, 나는 다른 standalone 프로젝트에서 먼저 기술을 구현해보는 것에 중점을 두어 왔다.
- 3D 분야는 추가할 게 너무 많아서, 오히려 UI 컴포넌트 개발에 시간을 쏟았다.
대충 이렇다.
한 마디로 말하면, 그냥 귀찮았다.
내 성격 문제도 있다.
'그림자 매핑을 추가하자' 라는 목표를 세우면,
- 간단하게 방향광 + PCF정도만 넣자.
- 아니지, 만들 거면 기본적인 빛 3개 (dir, point, spot) 는 다 만들어야지.
- 빛을 만든다고? 그러면 셰이딩을 완성해야지. Material 을 추가하자.
- Material 을 추가할 거면, 적어도 GLTF 를 완전히 로딩하고 텍스쳐 맵을 로딩해야겠지?
- GLTF을 로딩할 거면, 스키닝은 당연히 들어가야지. PBR 은 물론이고, Transmission, Reflection, Refracion 계수도 적용해서.
나는 자동적으로 이런 생각들을 하게 된다.
벌써 피곤하다.
셰이더는 어떻게 통일할 것이며, GLTF 표준은 어디서 맞출 것이며..
참고로 현재 내 엔진은,
Engine - App - Scene (++DrawPass) - ObjectLayer - Object
이러한 계층구조를 띈다.
저기서, IFinalDrawPass 나 IFinalLetterboxDrawPass,
이 둘 중에 하나는 반드시 추가해야 하는 패스이고,
이전에 필요한 렌더패스들 -
예를 들면
- 셰도우매핑 (각 빛 형태에따른)
- SSAO 블러 패스
- 컴퓨트 패스
- Bloom 블러 패스
- (디퍼드) 지오메트리 패스
- (디퍼드) 라이팅 패스
- Voxelize 패스
이런 것들을 미리 생성해두고
IScene::add_draw_pass() 로 순서를 지정해서 등록하면 된다.
(현재 엔진이 너무나 OpenGL 기반으로 쓰여졌기 때문에,
이 구조가 추후에는 많이 달라져 있을 수 있다)