Raytracing에서 반사를 처리하려면 반사될 물체가 지오메트리(AABB or 삼각형)로 존재해야한다. 현재 하늘은 screen-space에서 Volumetric Cloudscapes방식으로 그리고 있다. 따라서 당연히 하늘의 지오메트리는 없다. 그러다보니 DXR렌더러에서 하늘을 반사시키지 못하고 있었다.
하늘을 그려야할 기준은 간단한데 raytracing할때 miss shader까지 갔으면 하늘을 그리면 된다. MS샘플에선 미리 만들어둔 환경맵에서 텍셀을 가져온다. 뭐 나도 그렇게 하면 간단하긴 하지만 고생해서 리얼타임으로 구름도 그려주고 하는데 정적인 하늘그림을 반사시키긴 싫었다.
그래서 Volumetric Cloudscapes로 하늘을 생성하되 큐브 텍스처에 360도 렌더링 해서 raytracing에서도 반사처리가 가능하도록 했다.
- 렌더링 품질을 위해서 카메라가 바라보고 있는 방향으로는 가장 높은 정밀도로 Volumetric Cloudscapes를 이용해서 하늘 렌더링
- 이때 +X,-X,+Y,+Z,-Z의 5면에 대해 Volumetric Cloudscapes를 이용해서 360도 렌더링-> 큐브맵으로 저장. 성능을 위해서 면당 128×128정도의 저해상도를 사용한다. 어차피 반사에만 필요하니까.
- raytracing처리중 miss shader가 호출되면 방향 벡터로 큐브 텍스처로부터 텍셀을 가져온다.
D3D11에서의 작업결과는 이미 포스팅한 바 있다.
https://megayuchi.com/2021/06/06/volumetric-cloudscapes-environment-mapping/
D3D12렌더러에 업데이트 후 , DXR렌더러에도 기능을 업데이트 했다.
성능이 많이 떨어질까봐 고민했는데 128X128해상도로 6면이 아닌 5면만 렌더링할 뿐 아니라 메인 뷰의 하늘 렌더링 횟수 대비 1/3 정도의 빈도로 갱신하게 했기 때문에 성능 하락이 크지는 않았다.
환경맵 적용 전

환경맵 적용 후
