Graphics Programming

AMD FSR1 통합 본문

Season 2

AMD FSR1 통합

minseoklee 2022. 10. 4. 16:30

OpenGL 프로젝트에 AMD FSR1을 붙여봤다. 원래는 FSR2를 붙이고 싶었지만 벨로시티 버퍼, TAA 등을 먼저 구현해야 FSR2를 붙일 수 있어서 현 상황에서 바로 붙일 수 있는 FSR1을 작업해봤다.

 

FSR1 홈페이지에 있는 가이드 문서를 보고 그대로 따라하니 금방 끝낼 수 있었다. DX12, DX11, Vulkan를 지원한다고 쓰여있지만 어차피 FSR1 셰이더 자체는 GLSL로도 컴파일 가능하도록 작성되어 있어서 OpenGL에 붙이는데 큰 문제는 없었다.

 

01234
클로즈 샷
01234
롱 샷

이미 여러 렌더 패스가 실행되고 있는 엔진에 FSR1을 붙이려니 다음 사항들을 고려해야 했다.

  • 렌더 타겟들을 화면 해상도와 무관한 것(shadowmap), FSR1 이전의 해상도를 가지는 것(gbuffer, sceneColor, sceneDepth 등), FSR1 이후의 해상도를 가지는 것(sceneColorUpscaled, sceneColorFinal, DoF 등)으로 명확히 구분하고, screen uv나 texel coord를 계산할 때는 관련 렌더 타겟의 사이즈를 제대로 고려했는지 점검해야 했다.
  • FSR1을 사용한다면 FSR1 이후의 패스들은 모두 업스케일된 해상도를 가진다. 따라서 그런 패스에서 sceneDepth, gbuffers 등 다운스케일된 텍스처들을 샘플링할 일이 있으면 더 이상 텍셀 매칭이 안 된다. 다행히 내 경우에는 실행 순서를 따져보니 그런 샘플링이 필요한 패스들은 모두 FSR1 이전에 실행되어서 문제가 없었다.

FSR1은 FP16 모드와 FP32 fallback 모드가 있는데 FP16 모드를 사용하려면 GL 확장인 GL_EXT_shader_16bit_storage 와 GL_EXT_shader_explicit_arithmetic_types 이 필요하다. 어째선지 최신 그래픽카드인 RTX 3080 Ti 의 OpenGL 드라이버에서도 해당 확장들을 지원하지 않아서 FP16 모드는 컴파일이 되지 않았다. 일단은 FP32 모드로만 작동하게 만들고, 추가 조사를 해보니 GL_EXT_shader_16bit_storage 에서 정의하는 16비트 자료형들은 GL_NV_gpu_shader5 확장으로 대체 가능하고 GL_EXT_shader_explicit_arithmetic_types 에서 정의하는 형변환 함수들은 딱히 대체재를 못 찾아서 직접 정의했다. 수정 내역은 이 커밋에서 볼 수 있다.

 

개발 환경이 여의치 않아서 테스트하지 못한 것들도 있다.

  • FSR1에 넣을 입력 이미지는 안티앨리어싱이 잘 되어있어야 하는데 지금은 옵션이 FXAA 밖에 없어서 TAA보다 입력 이미지의 퀄리티가 떨어진다.
  • 가이드 문서는 FSR1에 넣을 입력 이미지를 생성할 때 Negative MIP bias 적용을 권장한다. 텍스처를 잔뜩 바른 멋진 데모 씬이 있어야 퀄리티 비교를 해볼 텐데 내 데모 씬들이 다 조악해서 굳이 확인해보지 않았다.

 

Comments