D3D12 엔진 제작기 (11) - 레이트레이싱 적용

신재혁·2024년 7월 25일
0

D3D12

목록 보기
6/10

Raytracing

레이트레이싱을 나의 엔진에 적용하고 있다.

캐릭터 애니메이션을 적용한 동적 객체들의 BottomLevelAS도 빌드하는데 성공하였다.

기존에는 캐릭터 애니메이션(vertex 변환)을 vertex shader에서 처리하였다.
그러나 레이트레이싱은 Vertex Shader를 사용하지 않기 때문에 미리 변환된 vertex들을 준비할 필요가 있다.
따라서 캐릭터 애니메이션을 구현하기 위해서는 Compute Shader를 통해 vertex를 변환하고, bottomLevelAS를 업데이트할 필요가 있다.

그러나 BLAS를 업데이트 하는데 자꾸 GPU HANG이 걸리고, 디버그 창에서도 어떤 문제인지 뜨지 않아 이 문제를 해결하기 위해 엄청 고생하였다.

결론적으로 NVIDIA 튜토리얼 코드에 버그가 있었다.

NVIDIA의 BottomLevelASGenerator.cpp에서 BLAS를 업데이트할 때 빌드 플래그를 주는데

D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS flags = m_flags;
if (flags ==
        D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE &&
    updateOnly) {
  flags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE;
}

위 코드에서 문제가 생긴 것이였다.

BLAS를 업데이트 하려면 빌드 flags를 줄때 ALLOW_UPDATE랑 PERFORM_UPDATE를 같이 줘야 하는데, NVIDIA 튜토리얼 코드에서는 이미 있던D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE flag를 D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE로 덮어쓰기 한 것이다.

도대체 뭐가 문제지하고 내 코드만 계속 수정했었는데, NVIDIA 튜토리얼 코드 문제였던걸 알게되니 엄청 화가 났었다.

데모 수준 이상의 레이트레이싱 공부를 할 때 NVIDIA 튜토리얼 코드를 쓰는건 절대! 비추천한다...

profile
이메일: tlswogur1010@gmail.com

0개의 댓글

관련 채용 정보