Game Dev – Voxel Horizon – Point Light추가

포인트 라이트를 추가했다. 기능 자체는 이전부터 구현해놨었지만 실질적으로 사용할 수는 없었다.  기존에는 라이트맵 패치의 컬러포맷이 R5G6B5였기 때문에 라이트가 여러개 겹치면 쉽게 정밀도를 다 잡아먹어버리는 문제가 있었다.
또한 CUDA쪽 라이트맵 베이킹 코드에는 포인트 라이트가 빠져있었다. 이제 실제로 사용할 수 있도록 기능을 다듬고 있다.

이번에 작업한 내용은 다음과 같다.

1. 라이트맵 패치의 컬러포맷을 RGB각 채널당 float로 바꿨다. 여기서 r,g,b 각각 float 4bytes씩 사용하게 되면 패치 메모리를 너무 많이 먹는다. 기존처럼 라이트맵 패치를 8 bytes사이즈로 유지하기 위해서 패치안에 들어가는 각 성분들을 비트 단위로 압축했다. 일단 RGB컬러값을 제외한 나머지 성분들을 비트단위로 압축하면 26 bits가 된다. 남은 공간은 38 bits, 여기다 실수형 r,g,b를 넣기 위해서 결국 부호없는 지수부 4 bits, 가수부 8 bits, 합쳐서 12 bits짜리 float타입을 만들었다. 이걸로 RGB 합쳐 36 bits. 총 62 bits로 8 bytes 자료구조에 다 들어가고 2 bits가 남는다.
8 bytes 안에 맞춰넣은 라이트맵 패치의 구조는 다음과 같다.
44777340_2127103660654701_3097232742576816128_n

2. 라이트맵 패치의 컬러값을 float로 저장하기 때문에 이제 훨씬 넓은 범위의 광도를 다룰수 있다. 텍스처에 라이트 컬러값을 써넣을때는 물론 R5G6B5포맷으로 변환하게 되지만 기준이 되는 화이트값에 따라서 dynamic range를 조정할 수 있다. 현재는 수동 조절이지만 추후 전체 라이트맵 패치의 총 밝기에 따라서 자동으로 조정할 수 있도록 할 예정이다.

3. 포인트 라이트 생성시마다 즉시 라이트 범위 내에 걸치는 복셀 오브젝트를 탐색하도록 했다. 찾아낸 오브젝트에 라이트의 인덱스를 추가해둔다. 이것으로 라이트맵을 계산할때마다 주변 라이트를 탐색할 필요가 없다. 각 오브젝트들은 최대 7개까지의 포인트 라이트의 인덱스를 저장한다. 즉 최대 7개까지의 포인트 라이트의 적용을 받을 수 있다.

4. CUDA 라이트맵 베이킹 코드에서도 포인트 라이트까지 합산해서 계산할 수 있도록 코드를 수정했다.


Game Dev – Voxel Horizon – Point Light추가”에 대한 답글 1개

답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중