0803

2026년 8월 3일

카테고리 : 게임엔진, 물리엔진, 셰도우 매핑

0803.gif


약 이틀에 걸쳐서

방향광 인터페이스를 만들고

이에 맞는 셰도우 매핑 패스를 만들었다.

ILight3D, DirectioanlLight3D 가 새롭게 추가되었고

DirectionalLightShadowPass 또한 추가되었다.

그냥 그림자만 있는 건 너무 밋밋해서

물리를 적용해보았다.

확실히 셰이딩이 있어야지

볼 맛이 조금이라도 난다.


엔진 개발 시작하고부터

대충 1년 반 정도가 지났는데,

이제야 (엔진 단에) 셰도우매핑이 구현된 이유가 있다.

  1. GL 기능 하나 추가하면, 엔진 백엔드부터 하나하나씩 쌓아 올려야한다.
  2. (1) 때문이라도, 나는 다른 standalone 프로젝트에서 먼저 기술을 구현해보는 것에 중점을 두어 왔다.
  3. 3D 분야는 추가할 게 너무 많아서, 오히려 UI 컴포넌트 개발에 시간을 쏟았다.

대충 이렇다.

한 마디로 말하면, 그냥 귀찮았다.

내 성격 문제도 있다.

'그림자 매핑을 추가하자' 라는 목표를 세우면,

  1. 간단하게 방향광 + PCF정도만 넣자.
  2. 아니지, 만들 거면 기본적인 빛 3개 (dir, point, spot) 는 다 만들어야지.
  3. 빛을 만든다고? 그러면 셰이딩을 완성해야지. Material 을 추가하자.
  4. Material 을 추가할 거면, 적어도 GLTF 를 완전히 로딩하고 텍스쳐 맵을 로딩해야겠지?
  5. GLTF을 로딩할 거면, 스키닝은 당연히 들어가야지. PBR 은 물론이고, Transmission, Reflection, Refracion 계수도 적용해서.

나는 자동적으로 이런 생각들을 하게 된다.

벌써 피곤하다.

셰이더는 어떻게 통일할 것이며, GLTF 표준은 어디서 맞출 것이며..


참고로 현재 내 엔진은,

Engine - App - Scene (++DrawPass) - ObjectLayer - Object

이러한 계층구조를 띈다.

저기서, IFinalDrawPass 나 IFinalLetterboxDrawPass,

이 둘 중에 하나는 반드시 추가해야 하는 패스이고,

이전에 필요한 렌더패스들 -

예를 들면

  • 셰도우매핑 (각 빛 형태에따른)
  • SSAO 블러 패스
  • 컴퓨트 패스
  • Bloom 블러 패스
  • (디퍼드) 지오메트리 패스
  • (디퍼드) 라이팅 패스
  • Voxelize 패스

이런 것들을 미리 생성해두고

IScene::add_draw_pass() 로 순서를 지정해서 등록하면 된다.

(현재 엔진이 너무나 OpenGL 기반으로 쓰여졌기 때문에,

이 구조가 추후에는 많이 달라져 있을 수 있다)