DirectX Raytracing – 복셀월드에 raytracing적용.

복셀월드 렌더링에 raytracing을 적용했다.
복셀 데이터는 삼각형 데이터와 상당히 구조가 다른데다가 오브젝트 개수가 엄청나게 많아질수 있으므로 작업이 간단하지 않았다. 또한 복셀 오브젝트는 모양이 변형될 수 있으므로 일반적인 static mesh와는 완전히 다르다.

어쨌든 꽤 빡시게 작업해서 기존 기능들은 다 작동하게 만들었다.
그런데 복셀 오브젝트 하나당 BLAS한개씩을 생성했더니 문제가 있다.
마을맵의 경우 복셀 오브젝트가 5만개가 넘는데 그 수만큼 BLAS가 생성되는 것이다.
BLAS개수 자체는 문제가 아닌데 캐릭터 데이터는 애니메이션이 있기 때문에 매 프레임 BLAS를 갱신하게 되고, 그럼 결과적으로 TLAS도 다시 빌드해야한다. 이때 변경사항이 없었던 복셀 월드의 BLAS까지 싸그리 긁어다가 TLAS를 다시 빌드하는게 문제다.
실제로 TLAS빌드에 막대한 시간이 소요됐다.
이 상태로 마을맵을 돌아다녀보면 GPU점유율 50%을 채우지 못했다. 프레임 레이트도 약 14FPS.
결국 기존 렌더링 방식과는 다르게 복셀 오브젝트 여러개를 묶어서 하나의 BLAS를 쓰도록 해야겠다고 마음먹었다.

상당히 코드를 뒤집어엎어서 최대 32개의 복셀 오브젝트를 합쳐서 BLAS 한개를 생성하도록 했다.
BLAS개수를 1/10이하로 줄였기 TLAS빌드 시간이 왕창 줄었다. 덕택에 GPU점유율이 2배이상 높아졌다.
당연히 프레임레이트도 2배이상 높아졌다. 뭐 그래봐야 1080에서 30프레임 안나온다. GPU가 GTX1660Ti라…

그리고 로딩시간이 긴것도 문제이데, 실제 로딩 시간이 긴건 아니고 5만개가 넘는 복셀 오브젝트에 대한 BLAS빌드하는데 걸리는 시간이다.
BLAS생성할때마다 D3D Resource가 필요한데 기존 코드에서 마구잡이로 만들고 버리고 했었다.
재활용을 위한 D3DResource Pool을 만들어서 이것을 사용하게 했다. D3DResource 할당/해제 시간이 대폭 감소했다.
또한 기존엔 복셀 오브젝트 하나당 임시 버퍼 하나씩을 생성했었지만 개선된 코드에선 BLAS 하나에 포함된 여러개의 복셀 오브젝트를 모두 포괄하는 버퍼 하나씩만 할당하도록 했다. 이 안에서 start index로 각 오브젝트의 지오메트리를 구분하는 식으로 처리했다. 이것으로 BLAS생성에 필요한 시간이 확 줄었다. 진짜 로딩하는 시간은 아니지만 결과적으로 ‘로딩’으로 분류하는 시간이 확 줄었다.

이제 Height Field렌더링 추가하면 기존 렌더러는 기능은 다 갖추게 된다.



https://youtu.be/ruoVjeD2PKM

기존방식 1 Voxel Object – 1 BLAS
고친방식 N Voxel Objects – 1 BLAS




답글 남기기

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

WordPress.com 로고

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

Google photo

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

Twitter 사진

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

Facebook 사진

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

%s에 연결하는 중