[개발일지] 게임엔진 렌더링의 뼈대 구현! (라이팅, 그림자)

46
  • 렌더링 전략과 라이팅과 쉐도우를 구현했습니다.

  • 렌더링 전략은 유니티처럼 3가지 전략으로 가려고 합니다.

  • Forward, Forward+, Deffered... 일단 1차로 전통적인 Forward를 구현했습니다.

  • 여기서 Forward+는 모바일이나 플레이스테이션 같은 콘솔에서 많이 사용하는 Tile Rendering방식입니다. 장점은 라이팅을 몇십개 이상 또는 백개 이상 사용하면서 디퍼드 렌더링의 단점인 반투명 오브젝트를 렌더링하려고 생쑈를 안해도 된다는 점입니다.

  • 선형 색 공간에서 라이팅을 계산하고 sRGB 백버퍼에서 감마를 입히는 방식으로 기초적인 색감을 잡아줍니다.

  • 기본 라이트 쉐이딩은 램버트 기반 PBR을 사용합니다. 언리얼 같은거 만드는거 아니니까 적당히 깔끔하고 적당히 가벼운 라이팅으로 갑니다.

  • 주변광도 당연히 넣었고요.. 반구 라이팅으로 하늘과 땅색을 라이트에 먹을수 있도록 했습니다.

  • 넣는김에 톤매핑 역시 넣었습니다. ACES 근사로 넣었는데요.. 옛날에 ACES 근사를 보고 구현한적이 있는데 지금 40대 후반이 되니 머리가 굳어서 다시 보기도 싫고 그냥 AI에게 ACES근사로 톤매핑으로 가자고 설계만 넘겨서 구현했습니다.

  • 그림자 역시 넣었는데.. 그냥 CSM으로 일괄 통합해서 한동안 가려고 합니다.

  • Cascade Shadow Mapping이라고 하는데요.. 3 or 4 단계의 카메라를 만든후에 각기 다른 세팅값으로 먼곳, 중간1, 중간2, 가까운곳 4곳을 따로 쉐도우를 만든후에 나중에 합치는 방식입니다. 가까울수록 더 해상도가 높은 쉐도우 맵(텍스쳐)를 생성해서 디테일한 그림자를 보여주고 멀수록 낮은 해상도의 쉐도우 맵으로 대충 흐릿한 그림자를 렌더링하는 방식입니다.

  • CSM의 장점으로는 과거 한장의 쉐도우 맵으로 라이트 시점의 카메라 왜곡하고 별생쑈를 해서 어떻게 해서든 먼곳을 보여주면서 가까운곳을 디테일하게 보여주려고 하는 노력을 할필요가 없다는 점입니다.

  • 단점으로는 3 or 4개의 카메라로 그림자를 그리니 오브젝트당 렌더링을 x3 또는 x4배로 횟수가 늘어난다는 점입니다.

  • 과거에 하드웨어 사양이 낮을때는 문제가 좀 되었는데 .. 요즘에는 모바일도 이정도는 커버합니다.

  • 렌더링 된 모습이 깔끔한데요.. MSAA 4x로 안티 앨리어싱까지 구현해서 넣었습니다.

  • 위에 모델링을 Shader Ball이라고 하는데요. https://github.com/usd-wg/assets 에서 다운받아서 fbx로 포멧 변경하고 넣었습니다 -_-.. 혹시 몰라 출처를 밝힙니다.

  • 다음번에는 캐릭터 애니메이션 또는 UI 엔진을 만들어야겠네요.

  • UI엔진의 경우에는 그냥 json이나 xml쓸까 하다가 유니티 엔진에서도 사용한 Facebook 오픈소스인 Yoga(react/yoga: Yoga is an embeddable layout engine targeting web standards.)를 사용해서 UI레이아웃을 구성하고 해당 레이아웃을 UI엔진에서 그대로 렌더링하는 방식으로 구현 해볼까 합니다.

  • 언리얼4,5의 Slate처럼.. 해당 UI엔진으로 툴도 그냥 이걸로 밀어 붙일 예정입니다. Qt같은 외부 라이브러리 안씁니다. 툴의 UI도 하나하나 다 구현해서 넣을 생각입니다.

감사합니다.

- 추가로 아키텍쳐 문서를 AI를 활용해서 만들어 봤습니다. 관심있으시면 다운로드 받아서 보시면 대략 구조를 알수 있을것 같습니다.

로그인한 회원만 댓글 등록이 가능합니다.

개발한당

KR | ID | EN
  • IDR
  • KOR
7.37 ▼ -0.01

2026.10.29 KEB 하나은행 고시회차 494회

다가오는 한인 행사일정

  • 등록 된 일정이 없어요!