달력

12

« 2018/12 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  
2012.02.01 10:27

fake HDR 구현기 - 2010.03. dev_logs2012.02.01 10:27

원문 : http://quve.egloos.com/4362207

이전에 겜브리오 2.0을 써서 만들었던 모 프로젝트에서 어떻게 하면 가장 적은 비용으로 가장 좋은 때깔을 뽑을 수 있을까~ 고민하다가 도입했던 방법. (프로젝트는 드랍되었지만;;)
일단 목표로써 참고했던 비주얼은 마리오갤럭시와 소닉언리쉬드. 이 중 소닉언리쉬드는 나름 차세대 비주얼. 이 작업 때문에 소닉언리쉬드의 디렉터가 해외웹진에 남겼던 후기 리포트를 개발팀 내 공유를 위해 일년전쯤 번역해놨는데, 어디뒀는지 찾아야하므로 그건 나중에 생각나면 올리기로 하고;; (그래서 딴거 찾아 추가 : 니시카와 젠지의 소닉언리쉬드 그래픽 강좌 링크)

예~전에 진행하다 드랍되었던 액션RPG 프로젝트에서 그래픽 퀄리티 올린답시고 초기 스펙 붕괴시켜가며 멋모르고 따라하다 가랑이 찢어지며 얻었던 교훈을 실증-명확한 기술 스펙과 구현 목표가 있으면 기한 내 실제로 구현할 수 있다- 할 수 있는 기회를 얻을 수 있었다.

차세대 비주얼의 주요 특징 (일부)
- 시야 범위의 톤에 따른 디테일의 묘사력 : HDR을 위시한 톤 매핑이 시야 상황에 맞춰 표현력을 보장
- 화면 전체에 빛과 그림자의 색감과 표현력이 풍부 : 구세대 라이트맵/버텍스칼라링한 결과물과는 차원이 다름
- 캐릭터가 빛을 받는다는 느낌이 확실 : 쉐이더빨, 색상/재질이 반영된 빛 반사, 밝은 빛 영역의 번짐의 묘화
- 캐릭터와 배경이 일치된 공간 하에 있음의 표현 : 캐릭터와 배경에 드리우는 빛과 그림자 방향이 일치, 주변 색감의 영향력

구현 이슈 도출
1. HDR을 도입할 것인가? 아니면 동적 표현은 없지만 표현 스펙트럼을 넓힌 유사 HDR? 아님 걍 때깔만 흉내?
2. 레이 트레이싱을 어떻게 할 것인가? 걍 인게임 라이트맵 쏘기? 실시간? 아님 V-Ray나 Mental Ray? Beast 같은 미들웨어?
3. 쉐도우 캐스팅의 디테일은? 액터/오브젝트 내 셀프 쉐도우를 쓸 것인가?
4. 카메라/빛 방향 계산한 림쉐이더? 아님 흉내만 낸 가라 림쉐이더? 아님 Fabric 쉐이더?
5. 빛 번짐 표현을 위한 Bloom은 어떻게 구현할 것인가? Fog의 처리는?
6. 액터/오브젝트에 사용할 재질감 표현의 수준은?
7. 액터/오브젝트/배경이 모두 동일한 빛의 영역 내에 있도록 표현할 방법은?
8. 바닥에 드리운 그림자를 비롯, 주변 환경광의 영향을 받고 있음을 표현할 방법은?

우리가 목표한 스펙
- 겜브리오 2.0의 기본 랜더링 범주에서 크게 벗어나지 않게
- 지포스 8xxx대의 중저사양에서 돌아갈 수 있도록 쉐이더 떡칠과 실시간 라이팅은 자제
- 위에서 살펴본 주요 특징이 내고 있는 결과물을 최대한 흉내낼 수 있도록
- 프로그래밍부터 쉐이더 셋업까지, 실제 아웃풋 도출까지 목표한 기간은 약 2달 (1 마일스톤)

표현을 위해 고려한 방법
- 기본 렌더링 재료 : GI(Global Illumination)를 통한 배경의 하이라이트 + 림쉐이더를 통한 캐릭터 하이라이트 
                            + 스펙큘러의 반사광 + 포그를 통한 원경 명도값 상향을 통해 화면 내 밝은 영역을 강조해 구분
- 기술적 처리 요소 : 위의 화면에서 렌더링 패스 딸때 일정 명도 이상만 영역을 구하고 그걸 블러링해 그리도록 블룸을
                            수정해 밝은 부분만 빛나듯 번져나가게 표현

스펙에 맞춘 구현 이슈 변경
1. 시간이 없다. 소닉언리쉬드를 최대한 참고하여 때깔을 흉내내는 fake nextgen visual을 목표로 하자.
2. 미들웨어 도입까지 테스트할 시간이 없다. 가장 사용하기 편리하면서 효과가 좋았던 (라이센스도 있던) V-Ray로
   GI 맵 굽자. 밝은 부분은 스펙큘러맵까지 동원해 카메라에 따라 명도 블룸(아래 5번)이 확실하게 그 번짐을
   반영할 수 있도록.
3. 게임이 매우 동적이고 카메라웍이 다양하므로 실시간 쉐도우 캐스팅은 필요. 셀프 쉐도우는 스펙 상 바로 포기.
4. 마리오갤럭시 식 림쉐이더는 좀 무겁지 않을까? Fabric은 좀 싸보이고.. 걍 (최초 고정된) 광원 위치만 계산해 반사광
   태워주는 가라 림쉐이더로 ㄱㄱ
5. 버텍스 그로우 느낌의 블룸은 너무 뿌옇기만 하고 이쁘지가 않다. 빛을 받는 부분만 밝게 빛이 산란하는 느낌을 위해서
   랜더링 시 pass 딸 때 주어진 명도값 이상만 태우도록 구현. 림쉐이더와 함께 어울려 빛 받는 느낌을 강조해주도록.
6. 일단 완료되어있는 캐릭터나 배경이 단순 디퓨즈맵만 사용하고 있었고, 게임 특성 상 노말맵까지는 필요없을 것이라
   판단하여 재질감 및 빛 반사 표현을 위해 스펙큘러맵만 사용하기로.
7. 겜브리오 기본 라이트를 꺼버리고, 디렉셔널썬라이트라 명명한 1개의 라이트(사실 카운터라이트도 있었지만..)를
   맵에 배치하면 그 위치에 맞춰 림쉐이더 광방향이 설정되도록 셋팅. 대신에 이 썬라이트는 GI 구울 때 광원의 방향과
   일치하게끔 수동 작업. (캐릭터가 축을 돌아 회전할 때 광방향이 변해야 하니까)
8. 소닉언리쉬드처럼 앰비언트큐브를 응용한 형태의 라이트필드를 사용했음 좋았겠지만, 일단 싸게 만들고자 했으므로
   바닥 라이트맵 칼라링을 피킹해 액터에 오버레이하는 식으로.

기간 내 실제 구현된 결과물
- 뽑아낸 GI맵을 여러번 합성하고 리터칭해 빛 받은 부분의 따스함과 더불어 그림자 부분도 차가운 톤의 칼라를 포함하게끔
  수정하고, 가장 밝게 빛나야 할 부분에 스펙큘러맵을 동원해 화면 상에서 높은 명도로 표현되게 했다.
  이와 더불어 원거리가 될 수록 짙어지는 포그값 역시 밝은 명도로 표현하되 투명도를 더해, 명도값에 따른 블룸을
  적용했을 때 번져나가는 표현으로 하여금 빛의 느낌을 표현해냈다.
- GI 라이트맵의 빛 방향과 디렉셔널썬라이트가 반영된 림쉐이더의 빛 방향이 일치되었고, 그에 따른 실시간 쉐도우
  캐스팅을 통해 광원의 높이와 반사광의 효과가 위화감 없이 표현되었다.
- 라이트맵 칼라 피킹해 앰비언트~디퓨즈에 오버레이하는 개념은 개발 시간 관계 상 도입하지 못하였다.
  그래도 소닉언리쉬드에서 구현한 앰비언트큐브 응용 방식의 라이트필드 개념은 상당히 괜찮은 발상이였던 듯.

Posted by JC Shin quvelab