저작권 (c) 2023 Advanced Micro Devices, Inc. 모든 권리 보유.
본 소프트웨어 및 관련 문서 파일("소프트웨어")의 사본을 취득한 모든 사람에게 사용, 복사, 수정, 병합에 대한 권리를 포함하되 이에 국한되지 않고 제한 없이 소프트웨어를 취급할 수 있는 권한이 무료로 부여됩니다. , 소프트웨어 복사본을 게시, 배포, 재라이센스 부여 및/또는 판매하고, 소프트웨어를 제공받은 사람에게 다음 조건에 따라 그렇게 하도록 허용합니다. 위의 저작권 표시와 본 허가 표시는 모든 복사본에 포함되어야 합니다. 또는 소프트웨어의 상당 부분.
소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. 어떠한 경우에도 작성자나 저작권 보유자는 계약, 불법 행위 또는 기타 행위로 인해 소프트웨어나 사용 또는 기타 거래와 관련하여 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어.
FSR2는 시간적 피드백을 사용하여 기본 렌더링에 비해 이미지 품질을 유지하고 향상시키면서 고해상도 이미지를 재구성합니다.
FSR2는 하드웨어 레이 트레이싱과 같이 비용이 많이 드는 렌더링 작업에 "실용적인 성능"을 제공할 수 있습니다.
HLSL
CS_6_2
CS_6_6*
* - CS_6_6은 64폭 파면을 지원하는 일부 하드웨어에서 사용됩니다.
FSR2를 사용하려면 다음 단계를 따라야 합니다.
build
디렉터리에서 GenerateSolutions.bat
두 번 클릭합니다.
API와 일치하는 솔루션을 열고 솔루션을 빌드하세요.
bin/ffx_fsr2_api
의 API 라이브러리를 타사 라이브러리가 포함된 프로젝트의 폴더가 포함된 폴더에 복사합니다.
사용하려는 FSR2 백엔드와 일치하는 라이브러리를 복사합니다(예: DirectX12의 경우 bin/ffx_fsr2_api/ffx_fsr2_api_dx12_x64.lib
.
src/ffx-fsr2-api의 다음 핵심 API 헤더 파일을 프로젝트에 복사합니다: ffx_fsr2.h
, ffx_types.h
, ffx_error.h
, ffx_fsr2_interface.h
, ffx_util.h
, shaders/ffx_fsr2_common.h
및 shaders/ffx_fsr2_resources.h
. 파일 복사 대상에서 상대 디렉터리 구조를 유지하려면 주의를 기울여야 합니다.
선택한 API 백엔드에 대한 헤더 파일을 복사합니다. 예를 들어 DirectX12의 경우 dx12/ffx_fsr2_dx12.h
및 dx12/shaders/ffx_fsr2_shaders_dx12.h
복사합니다. 파일 복사 대상에서 상대 디렉터리 구조를 유지하려면 주의를 기울여야 합니다.
FSR2와 상호 작용하려는 코드베이스에 ffx_fsr2.h
헤더 파일을 포함시킵니다.
대상 API에 대한 백엔드를 만듭니다. 예를 들어 DirectX12의 경우 ffxFsr2GetInterfaceDX12
호출해야 합니다. 스크래치 버퍼는 ffxFsr2GetScratchMemorySizeDX12
호출하여 반환된 크기와 ffxFsr2GetInterfaceDX12
에 전달된 해당 버퍼에 대한 포인터를 할당해야 합니다.
ffxFsr2ContextCreate
호출하여 FSR2 컨텍스트를 생성합니다. 매개변수 구조는 애플리케이션 구성과 일치하도록 작성되어야 합니다. 자세한 내용은 API 참조 문서를 참조하세요.
FSR2 워크로드를 시작하려면 각 프레임에서 ffxFsr2ContextDispatch
호출해야 합니다. 매개변수 구조는 애플리케이션 구성과 일치하도록 작성되어야 합니다. 자세한 내용은 API 참조 문서를 참조하고, frameTimeDelta
필드가 밀리초 단위로 제공되는지 확인하세요.
애플리케이션이 종료되는 경우(또는 다른 이유로 컨텍스트를 삭제하려는 경우) ffxFsr2ContextDestroy
호출해야 합니다. 이 함수를 호출하기 전에 GPU는 유휴 상태여야 합니다.
하위 픽셀 지터링은 응용 프로그램의 투영 매트릭스에 적용되어야 합니다. 이는 애플리케이션의 메인 렌더링을 수행할 때 수행되어야 합니다. 정확한 지터 오프셋을 계산하려면 ffxFsr2GetJitterOffset
함수를 사용해야 합니다. 자세한 내용은 카메라 지터 섹션을 참조하세요.
최고의 업스케일링 품질을 위해서는 가이드라인에 따라 반응성 마스크와 투명도 및 컴포지션 마스크를 채우는 것이 좋습니다. ffxFsr2ContextGenerateReactiveMask
시작점으로 사용할 수도 있습니다.
애플리케이션은 품질, 균형, 성능 및 (선택적으로) 초고성능 순서로 사용자 인터페이스에 크기 조정 모드를 노출해야 합니다.
또한 애플리케이션은 최종 사용자가 추가적인 품질을 얻을 수 있도록 선명도 슬라이더를 노출해야 합니다.
최종 사용자의 편의를 위해 FSR2 API는 이름이 지정된 여러 가지 사전 설정된 스케일링 비율을 제공합니다.
품질 | 차원별 배율 인수 |
---|---|
품질 | 1.5배 |
균형 잡힌 | 1.7배 |
성능 | 2.0배 |
초고성능 | 3.0배 |
애플리케이션이 사용자 인터페이스에서 일관된 이름 지정 및 확장 비율을 채택하는 것이 좋습니다. 이는 FSR2를 사용하는 다른 애플리케이션에 대한 경험이 있을 수 있는 애플리케이션 사용자에 대한 사용자 경험이 일관되도록 하기 위한 것입니다.
대상 하드웨어 및 운영 구성에 따라 FSR2는 다양한 성능 수준에서 작동합니다.
아래 표에는 DX12의 다양한 하드웨어에서 측정된 FSR2 성능이 요약되어 있습니다.
목표 해상도 | 품질 | RX 7900 XTX | RX 6950 XT | RX 6900 XT | RX 6800 XT | RX 6800 | RX 6700 XT | RX 6650 XT | RX 5700 XT | RX 베가 56 | RX 590 |
---|---|---|---|---|---|---|---|---|---|---|---|
3840x2160 | 품질(1.5배) | 0.7ms | 1.1ms | 1.2ms | 1.2ms | 1.4ms | 2.0ms | 2.8ms | 2.4ms | 4.9ms | 5.4ms |
균형 잡힌(1.7x) | 0.6ms | 1.0ms | 1.0ms | 1.1ms | 1.4ms | 1.8ms | 2.6ms | 2.2ms | 4.1ms | 4.9ms | |
성능(2배) | 0.6ms | 0.9ms | 1.0ms | 1.0ms | 1.3ms | 1.7ms | 2.3ms | 2.0ms | 3.6ms | 4.4ms | |
울트라 성능 (3배) | 0.5ms | 0.8ms | 0.8ms | 0.9ms | 1.1ms | 1.5ms | 1.8ms | 1.7ms | 2.9ms | 3.7ms | |
2560x1440 | 품질(1.5배) | 0.3ms | 0.5ms | 0.5ms | 0.5ms | 0.7ms | 0.9ms | 1.2ms | 1.1ms | 1.9ms | 2.3ms |
균형 잡힌(1.7x) | 0.3ms | 0.5ms | 0.5ms | 0.5ms | 0.6ms | 0.8ms | 1.1ms | 1.0ms | 1.7ms | 2.1ms | |
성능(2배) | 0.3ms | 0.4ms | 0.4ms | 0.4ms | 0.6ms | 0.8ms | 0.9ms | 0.9ms | 1.5ms | 1.9ms | |
울트라 성능 (3배) | 0.2ms | 0.4ms | 0.4ms | 0.4ms | 0.5ms | 0.7ms | 0.8ms | 0.8ms | 1.2ms | 1.7ms | |
1920x1080 | 품질(1.5배) | 0.2ms | 0.3ms | 0.3ms | 0.3ms | 0.4ms | 0.5ms | 0.6ms | 0.6ms | 1.0ms | 1.3ms |
균형 잡힌(1.7x) | 0.2ms | 0.3ms | 0.3ms | 0.3ms | 0.4ms | 0.5ms | 0.6ms | 0.6ms | 0.9ms | 1.2ms | |
성능(2배) | 0.2ms | 0.2ms | 0.2ms | 0.3ms | 0.3ms | 0.5ms | 0.5ms | 0.5ms | 0.8ms | 1.1ms | |
울트라 성능 (3배) | 0.1ms | 0.2ms | 0.2ms | 0.2ms | 0.3ms | 0.4ms | 0.4ms | 0.4ms | 0.7ms | 0.9ms |
수치는 0.1ms 단위로 반올림되었으며 추가적인 sharpness
없으며 변경될 수 있습니다.
FSR2를 사용하려면 GPU에서 사용할 수 있도록 일부 추가 GPU 로컬 메모리를 할당해야 합니다. FSR2 API를 사용할 때 이 메모리는 FSR2 컨텍스트가 생성될 때 할당되며 백엔드 인터페이스를 구성하는 일련의 콜백을 통해 할당됩니다. 이 메모리는 FSR2 알고리즘으로 계산된 중간 표면과 애플리케이션의 여러 프레임에 걸쳐 지속되는 표면을 저장하는 데 사용됩니다. 아래 표에는 다양한 작동 조건에서 FSR2가 사용하는 메모리 양이 포함되어 있습니다. "작업 세트" 열은 알고리즘이 GPU에서 실행될 때 FSR2가 사용하는 총 메모리 양을 나타냅니다. 이는 FSR2를 실행하는 데 필요한 메모리 양입니다. "영구 메모리" 열은 애플리케이션의 후속 프레임에 대해 그대로 유지하는 데 필요한 "작업 세트" 열의 양을 나타냅니다. 이 메모리는 FSR2가 소비하는 시간 데이터를 저장합니다. "Aliasable memory" 열은 FSR2의 작동 경계 외부에 있는 응용 프로그램에서 사용하는 표면이나 기타 리소스에 의해 "Working set" 열의 별칭이 지정될 수 있는 정도를 나타냅니다.
FSR2 백엔드 인터페이스의 리소스 생성 및 삭제 부분을 재정의하고 별칭 플래그를 전달하여 FSR2에서 리소스 생성을 제어할 수 있습니다. 이는 FSR2의 완벽한 통합을 위해 작동 조건에 따라 아래 표의 "영구 메모리" 열과 동일한 추가 메모리가 필요하다는 것을 의미합니다.
해결 | 품질 | 작업 세트(MB) | 영구 메모리(MB) | 별칭 가능 메모리(MB) |
---|---|---|---|---|
3840x2160 | 품질(1.5배) | 448MB | 354MB | 93MB |
균형 잡힌(1.7x) | 407MB | 330MB | 77MB | |
성능(2배) | 376MB | 312MB | 63MB | |
초고성능(3x) | 323MB | 281MB | 42MB | |
2560x1440 | 품질(1.5배) | 207MB | 164MB | 43MB |
균형 잡힌(1.7x) | 189MB | 153MB | 36MB | |
성능(2배) | 172MB | 143MB | 29MB | |
초고성능(3x) | 149MB | 130MB | 19MB | |
1920x1080 | 품질(1.5배) | 115MB | 90MB | 24MB |
균형 잡힌(1.7x) | 105MB | 85MB | 20MB | |
성능(2배) | 101MB | 83MB | 18MB | |
초고성능(3x) | 84MB | 72MB | 11MB |
수치는 DX12의 RX 6700XT GPU를 사용하여 가장 가까운 MB로 반올림된 근사치이며 변경될 수 있습니다.
FSR2의 메모리 요구 사항을 관리하는 방법에 대한 자세한 내용은 메모리 관리를 다루는 이 문서의 섹션을 참조하세요.
FSR2는 시간 알고리즘이므로 현재 프레임과 이전 프레임 모두의 데이터에 액세스해야 합니다. 다음 표에는 FSR2에 필요한 모든 외부 입력이 나열되어 있습니다.
해상도 열은 데이터가 '렌더링된' 해상도인지 '프레젠테이션' 해상도인지를 나타냅니다. '렌더링된' 해상도는 리소스가 애플리케이션이 렌더링을 수행하는 해상도와 일치해야 함을 나타냅니다. 반대로 '프레젠테이션'은 대상의 해상도가 사용자에게 표시되는 해상도와 일치해야 함을 나타냅니다. 모든 리소스는 현재 렌더링된 프레임에서 나옵니다. DirectX(R)12 및 Vulkan(R) 애플리케이션의 경우 모든 입력 리소스는
ffxFsr2ContextDispatch
호출하기 전에 각각D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE
및VK_ACCESS_SHADER_READ_BIT
로 전환되어야 합니다.
이름 | 해결 | 체재 | 유형 | 메모 |
---|---|---|---|---|
컬러 버퍼 | 세우다 | APPLICATION SPECIFIED | 조직 | 애플리케이션에서 제공하는 현재 프레임에 대한 렌더링 해상도 색상 버퍼입니다. 색상 버퍼의 내용이 HDR(High Dynamic Range)에 있는 경우 FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE 플래그를 FfxFsr2ContextDescription 구조의 flags 필드에 설정해야 합니다. |
깊이 버퍼 | 세우다 | APPLICATION SPECIFIED (1x FLOAT) | 조직 | 애플리케이션에서 제공하는 현재 프레임에 대한 렌더링 해상도 깊이 버퍼입니다. 데이터는 단일 부동 소수점 값으로 제공되어야 하며 그 정밀도는 응용 프로그램에서 제어합니다. 깊이 구성은 FfxFsr2Context 생성 시 FfxFsr2ContextDescription 구조의 flags 필드를 통해 FSR2에 전달되어야 합니다. 깊이 버퍼가 반전된 경우(즉, [1..0] 범위) FFX_FSR2_ENABLE_DEPTH_INVERTED 플래그를 설정해야 하며, 깊이 버퍼에 무한 원거리 평면이 있는 경우 FFX_FSR2_ENABLE_DEPTH_INFINITE 플래그를 설정해야 합니다. 애플리케이션이 D32S8 형식의 깊이 버퍼를 제공하는 경우 FSR2는 버퍼의 스텐실 구성 요소를 무시하고 깊이 버퍼를 처리하기 위해 R32_FLOAT 리소스를 생성합니다. GCN 및 RDNA 하드웨어에서 깊이 버퍼는 스텐실 버퍼와 별도로 저장됩니다. |
모션 벡터 | 렌더링 또는 프리젠테이션 | APPLICATION SPECIFIED (2x FLOAT) | 조직 | [ (<-width, -height> .. <width, height> ] 범위의 애플리케이션에서 제공하는 현재 프레임에 대한 2D 모션 벡터입니다. 애플리케이션이 다른 범위의 모션 벡터를 렌더링하는 경우 다음의 motionVectorScale 필드를 사용할 수 있습니다. FfxFsr2DispatchDescription 구조를 사용하여 FSR2의 예상 범위와 일치하도록 조정합니다. 내부적으로 FSR2는 16비트 양을 사용하여 많은 경우 모션 벡터를 표현합니다. 즉, 모션 벡터의 정밀도가 더 높을 수 있습니다. 제공되면 FSR2는 FfxFsr2Context 를 생성할 때 FFX_FSR2_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS 플래그가 FfxFsr2ContextDescription 구조의 flags 필드에 설정되지 않는 한 모션 벡터 버퍼의 해상도가 렌더링 해상도와 같아야 합니다. 프레젠테이션 해상도와 동일해야 합니다. |
반응성 마스크 | 세우다 | R8_UNORM | 조직 | 렌더링된 이미지의 일부 영역은 깊이 버퍼에 발자국을 남기지 않거나 모션 벡터를 포함하므로 FSR2는 그러한 영역이 있는 위치를 FSR2에 나타내는 데 사용할 수 있는 반응 마스크 텍스처에 대한 지원을 제공합니다. 이에 대한 좋은 예로는 깊이나 모션 벡터를 쓰지 않는 입자 또는 알파 블렌드 개체가 있습니다. 이 리소스가 설정되지 않은 경우 FSR2의 음영 변경 감지 로직은 이러한 경우를 최선으로 처리하지만 최적의 결과를 위해서는 이 리소스를 설정해야 합니다. 반응형 마스크에 대한 자세한 내용은 반응형 마스크 섹션을 참조하세요. |
노출 | 1x1 | R32_FLOAT | 조직 | 현재 프레임에 대해 계산된 노출 값을 포함하는 1x1 텍스처입니다. 이 리소스는 선택 사항이며, FfxFsr2Context 생성 시 FfxFsr2ContextDescription 구조의 flags 필드에 FFX_FSR2_ENABLE_AUTO_EXPOSURE 플래그가 설정된 경우 생략될 수 있습니다. |
모션 벡터를 제외하고 렌더링 해상도에서 제공되는 모든 입력은 지터로 렌더링되어야 합니다. FFX_FSR2_ENABLE_MOTION_VECTORS_JITTER_CANCELLATION
플래그가 없는 한 모션 벡터에는 지터가 적용되어서는 안 됩니다.
FSR2에는 반전된 무한 깊이 버퍼를 사용하는 것이 좋습니다. 그러나 대체 깊이 버퍼 구성이 지원됩니다. 애플리케이션은 FfxFsr2Context
생성 중에 적절한 플래그를 설정하여 FSR2 API에 깊이 버퍼 구성을 알려야 합니다. 아래 표에는 적절한 플래그가 포함되어 있습니다.
FSR2 플래그 | 메모 |
---|---|
FFX_FSR2_ENABLE_DEPTH_INVERTED | 제공되는 입력 깊이 버퍼 데이터가 반전[max..0]되었음을 나타내는 비트입니다. |
FFX_FSR2_ENABLE_DEPTH_INFINITE | 제공된 입력 깊이 버퍼 데이터가 무한한 원거리 평면을 사용하고 있음을 나타내는 비트입니다. |
시간 알고리즘(안티앨리어싱 또는 업스케일링)의 핵심 부분은 모션 벡터를 제공하는 것입니다. FSR2는 현재 프레임의 픽셀에서 이전 프레임의 동일한 픽셀 위치까지의 모션을 인코딩하는 2D 모션 벡터를 허용합니다. FSR2는 모션 벡터가 [ <-width, -height> .. <width, height> ] 범위의 애플리케이션에 의해 제공될 것으로 예상합니다. 이는 화면 공간과 일치합니다. 예를 들어 <width, height> 값을 가진 화면 왼쪽 상단 모서리에 있는 픽셀의 모션 벡터는 오른쪽 하단 모서리에서 시작하여 입력 표면의 전체 너비와 높이를 가로지르는 모션을 나타냅니다. .
애플리케이션이 다른 공간(예: 정규화된 장치 좌표 공간)에서 모션 벡터를 계산하는 경우 FfxFsr2DispatchDescription
구조의 motionVectorScale
필드를 사용하여 FSR2에 FSR2의 예상 범위와 일치하도록 조정하도록 지시할 수 있습니다. 아래 코드 예제는 모션 벡터가 화면 공간에 맞게 조정되는 방법을 보여줍니다. 아래 예제 HLSL 및 C++ 코드는 FSR2 호스트 API를 사용하여 NDC 공간 모션 벡터를 확장하는 방법을 보여줍니다.
// GPU: Example of application NDC motion vector computation
float2 motionVector = (previousPosition.xy / previousPosition.w) - (currentPosition.xy / currentPosition.w);
// CPU: Matching FSR 2.0 motionVectorScale configuration
dispatchParameters.motionVectorScale.x = ( float )renderWidth;
dispatchParameters.motionVectorScale.y = ( float )renderHeight;
내부적으로 FSR2는 16비트 양을 사용하여 모션 벡터를 표현하는 경우가 많습니다. 즉, 더 높은 정밀도의 모션 벡터를 제공할 수 있지만 FSR2는 현재 향상된 정밀도의 이점을 누릴 수 없습니다. 모션 벡터 버퍼의 해상도는 FFX_FSR2_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS
플래그가 FfxFsr2Context
생성 시 FfxFsr2ContextDescription
구조의 flags
필드에 설정된 경우를 제외하고 렌더링 해상도와 같아야 합니다. 이 경우 프레젠테이션 해상도와 같아야 합니다.
FSR2는 더 많은 객체가 모션 벡터를 제공할 때 더 나은 품질 업스케일링을 수행합니다. 따라서 모든 불투명, 알파 테스트 및 알파 블렌딩된 개체는 모든 포함된 픽셀에 대한 모션 벡터를 작성해야 합니다. UV 스크롤과 같은 정점 셰이더 효과가 적용되는 경우 최상의 결과를 얻으려면 이러한 계산을 모션 계산에도 고려해야 합니다. 알파 블렌딩된 객체의 경우 가려진 각 픽셀의 알파 값이 반응 마스크의 해당 픽셀에 저장되는 것이 좋습니다. 이를 통해 FSR2는 업스케일링 중에 알파 블렌딩된 개체를 더 잘 처리할 수 있습니다. 반응 마스크는 입자와 같이 모션 벡터 쓰기가 금지될 수 있는 알파 혼합 개체에 특히 중요합니다.
FSR2의 맥락에서 "반응성"이라는 용어는 현재 프레임에 대해 렌더링된 샘플이 최종 확대 이미지 생성에 미치는 영향의 정도를 의미합니다. 일반적으로 현재 프레임에 대해 렌더링된 샘플은 FSR2가 계산한 결과에 상대적으로 적은 양을 기여합니다. 그러나 예외가 있습니다. 빠르게 움직이는 알파 블렌딩된 개체에 대해 최상의 결과를 생성하려면 FSR2에서는 이러한 픽셀에 대해 더 반응성을 갖도록 재투영 및 누적 단계가 필요합니다. 알파 블렌딩을 사용하여 픽셀이 렌더링된 색상, 깊이 또는 모션 벡터를 확인할 수 있는 좋은 방법이 없기 때문에 FSR2는 응용 프로그램이 해당 영역을 명시적으로 표시할 때 가장 잘 수행됩니다.
따라서 애플리케이션이 FSR2에 반응 마스크를 제공하는 것이 좋습니다. 반응 마스크는 FSR2가 현재 픽셀을 합성할 때 기록 정보에 대한 의존도를 줄여야 하는 위치를 안내하고 대신 현재 프레임의 샘플이 최종 결과에 더 많이 기여하도록 허용합니다. 반응 마스크를 사용하면 응용 프로그램이 [0.0..1.0]의 값을 제공할 수 있습니다. 여기서 0.0은 픽셀이 전혀 반응하지 않음(기본 FSR2 구성 전략을 사용해야 함)을 나타내고 값 1.0은 픽셀이 완전히 반응해야 함을 나타냅니다. 반응성. 이는 부동 소수점 범위이며 다양한 상황에 맞게 조정할 수 있습니다.
반응 마스크에 대한 다른 응용 프로그램이 있지만 반응 마스크의 기본 응용 프로그램은 알파 블렌딩된 개체를 포함하는 이미지 확대의 더 나은 결과를 생성하는 것입니다. 반응성에 대한 좋은 프록시는 실제로 알파 블렌딩된 객체를 장면에 합성할 때 사용되는 알파 값이므로 애플리케이션은 반응 마스크에 alpha
써야 합니다. 1에 가까운 반응성 값이 좋은 결과를 낳을 가능성은 거의 없다는 점에 유의해야 합니다. 따라서 최대 반응성 값을 약 0.9로 고정하는 것이 좋습니다.
FSR2에 반응 마스크가 제공되지 않으면( FfxFsr2DispatchDescription
의 reactive
필드를 NULL
로 설정하여) 반응 값이 지워진 내부적으로 생성된 1x1 텍스처가 사용됩니다.
애플리케이션이 반응성 마스크와 투명도 및 구성 마스크를 생성할 수 있도록 FSR2는 선택적 도우미 API를 제공합니다. 내부적으로 API는 휘도 기반 휴리스틱을 사용하여 각 픽셀에 대해 이러한 값을 계산하는 컴퓨팅 셰이더를 시작합니다.
이를 수행하려는 응용 프로그램은 ffxFsr2ContextGenerateReactiveMask
함수를 호출할 수 있으며 두 가지 버전의 색상 버퍼를 전달해야 합니다. 하나는 불투명한 기하학만 포함하고 다른 하나는 불투명 및 알파 혼합 개체를 모두 포함합니다.
Reactive 마스크 외에도 FSR2는 업스케일링 프로세스 중에 고려해야 할 다른 전문 렌더링 영역을 나타내는 애플리케이션을 제공합니다. 이러한 특수 렌더링의 예로는 광선 추적 반사 영역이나 애니메이션 텍스처가 포함됩니다.
반응형 마스크는 누적 균형을 조정하는 반면 투명도 및 구성 마스크는 픽셀 기록 보호 메커니즘을 조정합니다. 마스크는 또한 휘도 불안정 요인의 영향을 제거합니다. 투명도 및 컴포지션 마스크에서 값이 0인 픽셀은 해당 픽셀의 잠금에 대해 추가 수정을 수행하지 않습니다. 반대로, 값 1은 해당 픽셀에 대한 잠금이 완전히 제거되어야 함을 나타냅니다.
투명도 및 컴포지션 마스크가 FSR2에 제공되지 않는 경우( FfxFsr2DispatchDescription
의 transparencyAndComposition
필드를 NULL
로 설정) 투명도 및 컴포지션 값이 지워진 내부 생성 1x1 텍스처가 사용됩니다.
FSR2.2에는 반응성 마스크와 투명도 및 구성 마스크를 자동으로 생성하는 실험적 기능이 포함되어 있습니다. 이를 활성화하려면 FfxFsr2DispatchDescription
의 enableAutoReactive
필드를 'TRUE'로 설정해야 하며 백버퍼의 불투명 전용 부분 복사본을 'colorOpaqueOnly'에 제공해야 합니다. 그러면 FSR2는 내부적으로 반응성 마스크와 투명도 및 구성 마스크를 자동으로 생성하고 사용합니다. 마스크는 투명한 기하학이 있는 경우와 없는 경우의 색상 버퍼의 차이를 분석하고 이를 이전 프레임과 비교하여 컴퓨팅 패스에서 생성됩니다. 이러한 계산 결과에 따라 각 픽셀에는 반응성 마스크와 투명도 및 구성 마스크 값이 할당됩니다. 마스크의 자동 생성을 사용하려면 마스크의 강도를 조정하고 제한하는 다음 4개 값도 제공되어야 합니다(언급된 기본값은 권장 시작 값이지만 제목별로 조정해야 함).
이 기능은 FSR2.2를 새로운 엔진이나 타이틀에 통합하는 데 도움을 주기 위한 것입니다. 그러나 최상의 품질을 위해서는 재료를 기반으로 해당 값을 생성하는 것이 최종 이미지에서 자동 생성하는 것보다 더 안정적일 것으로 예상되므로 반응형 마스크와 투명도 및 컴포지션 마스크를 직접 렌더링하는 것이 좋습니다.
이 기능은 아직 실험 단계이므로 향후 크게 변경될 수 있습니다.
FSR2는 업스케일링을 수행할 때 사용되는 노출을 제어하는 두 가지 값을 제공합니다. 그것들은 다음과 같습니다:
노출 값은 응용 프로그램이 수행하는 후속 톤 매핑 패스 중에 응용 프로그램이 사용하는 값과 일치해야 합니다. 이는 FSR2가 최종 톤 매핑 이미지에서 볼 수 있는 것과 일관되게 작동한다는 것을 의미합니다.
이 문서에 설명된 FSR2 알고리즘의 다양한 단계에서 FSR2는 내부 사용을 위해 자체 노출 값을 계산합니다. FSR2의 모든 출력은 최종 출력이 기록되기 전에 이 내부 톤 매핑이 반전된다는 점은 주목할 가치가 있습니다. 이는 FSR2가 원래 입력 신호와 동일한 도메인에서 결과를 반환한다는 의미입니다.
노출 값을 잘못 선택하면 FSR2 업스케일링의 최종 품질에 큰 영향을 미칠 수 있습니다. 따라서 특별한 이유가 없는 한 FFX_FSR2_ENABLE_AUTO_EXPOSURE
애플리케이션에서 사용하는 것이 좋습니다. FFX_FSR2_ENABLE_AUTO_EXPOSURE
FfxFsr2ContextDescription
구조의 flags
필드에 설정된 경우 아래 HLSL 코드에 표시된 노출 계산을 사용하여 ISO 100 필름 스톡의 노출 응답과 일치하는 노출 값을 계산합니다.
float ComputeAutoExposureFromAverageLog ( float averageLogLuminance)
{
const float averageLuminance = exp (averageLogLuminance);
const float S = 100.0f ; // ISO arithmetic speed
const float K = 12.5f ;
const float exposureIso100 = log2 ((averageLuminance * S) / K);
const float q = 0.65f ;
const float luminanceMax = ( 78.0f / (q * S)) * pow ( 2.0f , exposureIso100);
return 1 / luminanceMax;
}
FSR2의 주요 목표는 여러 입력에 의존하는 시간적 업스케일링 알고리즘을 사용하여 애플리케이션 렌더링 성능을 향상시키는 것입니다. 따라서 파이프라인에 배치하는 것은 최고 품질의 시각적 품질과 뛰어난 성능 사이의 올바른 균형을 보장하는 데 중요합니다.
이미지 업스케일링 접근 방식에서는 업스케일링 알고리즘과 관련하여 다른 이미지 공간 알고리즘을 배치하는 방법을 이해하는 것이 중요합니다. 업스케일링 전에 이러한 다른 이미지 공간 효과를 배치하면 더 낮은 해상도에서 실행된다는 이점이 있으며 이는 물론 응용 프로그램에 성능 이점을 제공합니다. 그러나 일부 클래스의 이미지 공간 기술에는 적합하지 않을 수 있습니다. 예를 들어, 많은 응용 프로그램에서는 실제 카메라를 시뮬레이션하기 위해 최종 이미지에 노이즈나 그레인이 발생할 수 있습니다. 업스케일러 전에 그렇게 하면 업스케일러가 노이즈를 증폭시켜 결과적으로 업스케일된 이미지에 바람직하지 않은 아티팩트가 발생할 수 있습니다. 다음 표에서는 일반적인 실시간 이미지 공간 기술을 두 개의 열로 나눕니다. '포스트 프로세싱 A'에는 일반적으로 FSR2의 업스케일링 이전에 실행되는 모든 기술이 포함되어 있습니다. 즉, 모두 렌더 해상도에서 실행된다는 의미입니다. 반대로 '사후 처리 B' 열에는 FSR2 이후에 실행하도록 권장되는 모든 기술이 포함되어 있습니다. 즉, 더 큰 프리젠테이션 해상도에서 실행된다는 의미입니다.
후처리 A | 후처리 B |
---|---|
화면 공간 반사 | 필름 그레인 |
화면 공간 주변 폐색 | 색수차 |
디노이저(그림자, 반사) | 삽화 |
노출(선택사항) | 톤 매핑 |
꽃 | |
피사계 심도 | |
모션 블러 |
여기에 나와 있는 권장 사항은 안내 목적으로만 제공되며 애플리케이션 구현의 정확한 특성에 따라 달라집니다.
적절한 중간 리소스를 생성하고, 셰이더 코드를 컴파일하고, 바인딩을 설정하고, 디스패치를 제출하는 것이 가능하지만 제공되는 FSR2 호스트 API를 사용하는 것이 훨씬 쉽습니다.
API를 사용하려면 FSR2 라이브러리(어떤 라이브러리에 대해서는 곧 자세히 설명)를 연결하고 ffx_fsr2.h
헤더 파일을 포함해야 합니다. 이 파일에는 다음과 같은 헤더 종속성이 있습니다.
ffx_assert.h
ffx_error.h
ffx_fsr2_interface.h
ffx_types.h
ffx_util.h
FSR2 API를 사용하려면 애플리케이션 지향 API에 대한 기호를 제공하는 ffx_fsr2_api_x64.lib
링크해야 합니다. 그러나 FSR2의 API에는 모듈식 백엔드가 있습니다. 즉, 일치하는 백엔드를 사용하여 다양한 그래픽 API 및 플랫폼을 대상으로 할 수 있습니다. 따라서 아래 표를 참조하여 요구 사항에 맞는 백엔드 lib를 추가로 포함해야 합니다.
목표 | 도서관 이름 |
---|---|
다이렉트X(R)12 | ffx_fsr2_dx12_x64.lib |
불칸(R) | ffx_fsr2_vk_x64.lib |
FSR2 API의 모듈식 아키텍처를 통해 맞춤형 백엔드를 구현할 수 있습니다. 자세한 내용은 모듈형 백엔드 섹션을 참조하세요.
API 사용을 시작하려면 애플리케이션이 먼저 FfxFsr2Context
구조를 생성해야 합니다. 이 구조는 백버퍼의 수명과 거의 일치하는 수명을 가진 어딘가에 위치해야 합니다. 일반적으로 애플리케이션 힙 어딘가에 있는 것이 좋은 선택입니다. ffxFsr2ContextCreate
호출하면 FfxFsr2Context
구조가 필요한 데이터로 채워집니다. 또한 ffxFsr2ContextCreate
에서 FfxFsr2ContextDescription
구조의 일부로 FfxFsr2Context
에 제공되는 백엔드에 대한 여러 호출이 이루어집니다. 이러한 호출은 FSR2에 필요한 중간 리소스 생성, 셰이더 및 관련 파이프라인 상태 설정과 같은 작업을 수행합니다. FSR2 API는 동적 메모리 할당을 수행하지 않습니다.
업스케일링이 필요한 애플리케이션의 각 프레임에서 ffxFsr2ContextDispatch
호출해야 합니다. 이 함수는 애플리케이션 수명 초기에 생성된 FfxFsr2Context
구조와 업스케일링 수행 방법 및 데이터에 대한 정확한 설명을 허용합니다. 이 설명은 FfxFsr2DispatchDescription
구조를 작성하는 애플리케이션에 의해 제공됩니다.
컨텍스트 삭제는 ffxFsr2ContextDestroy
호출하여 수행됩니다. ffxFsr2ContextDestroy
호출을 시도하기 전에 GPU는 유휴 상태여야 하며, 이 함수는 FSR2에서 액세스하는 리소스가 현재 이동 중이 아닌지 확인하기 위해 암시적 동기화를 수행하지 않습니다. 이렇게 선택한 이유는 FfxFsr2Context
를 파괴하려는 지점에서 이미 적절한 동기화를 수행하는 애플리케이션에 대해 FSR2가 추가 GPU 플러시를 도입하는 것을 방지하기 위한 것입니다. 이를 통해 애플리케이션은 다음과 같은 경우 FSR2 API의 가장 효율적인 생성 및 해제를 수행할 수 있습니다. 필수의.
FSR2 API의 일부로 제공되는 추가 도우미 기능이 있습니다. 이러한 도우미 함수는 하위 픽셀 지터링 오프셋 계산, 디스패치 해상도 및 FSR2에서 제공하는 기본 스케일링 모드를 기반으로 한 렌더링 해상도 계산과 같은 작업을 수행합니다.
FSR2 API에 대한 보다 자세한 문서를 보려면 제공된 API 참조 문서를 참조하세요.
FSR2 API의 설계는 FSR2 알고리즘의 핵심 구현이 어떤 렌더링 API에 있는지 인식하지 못한다는 것을 의미합니다. 대신 FSR2는 인터페이스를 통해 제공된 기능을 호출하여 FSR2와 함께 다양한 백엔드를 사용할 수 있습니다. 또한 이 설계를 통해 FSR2를 통합하는 애플리케이션이 자체 백엔드 구현을 제공할 수 있습니다. 즉, FSR2가 현재 지원하지 않는 플랫폼이 몇 가지 기능을 구현하여 대상이 될 수 있습니다. 또한 자체 렌더링 추상화가 있는 애플리케이션은 자체 백엔드를 구현하여 메모리 관리, 리소스 생성, 셰이더 컴파일, 셰이더 리소스 바인딩 및 FSR2 워크로드를 그래픽 장치에 제출하는 등 FSR2 기본 기능의 모든 측면을 제어할 수도 있습니다. .
기본적으로 FSR2 API는 핵심 API와 백엔드 간에 이미 설명된 분리에 따라 여러 라이브러리로 컴파일됩니다. 이는 FSR2와 함께 제공되는 백엔드를 사용하려면 핵심 FSR2 API 라이브러리와 요구 사항에 맞는 백엔드를 모두 연결해야 함을 의미합니다.
FSR2의 공개 릴리스에는 DirectX(R)12 및 Vulkan(R) 백엔드가 포함되어 있지만 요청 시 다른 백엔드도 제공됩니다. 자세한 내용은 AMD 개발자 기술 담당자에게 문의하세요.
FSR2 API가 제공된 백엔드(예: DirectX(R)12 또는 Vulkan(R)) 중 하나와 함께 사용되는 경우 FSR2에 필요한 모든 리소스는 호스트 응용 프로그램에서 제공하는 그래픽 장치를 사용하여 직접 커밋된 리소스로 생성됩니다. 그러나 백엔드 인터페이스에 있는 생성 및 파괴 기능 계열을 재정의함으로써 애플리케이션이 FSR2의 메모리 관리를 보다 정확하게 제어할 수 있습니다.
이를 위해 ffxFsr2ContextCreate
함수에 전달된 FfxFsr2ContextDescription
구조를 통해 FSR2에 전체 사용자 정의 백엔드를 제공하거나 원하는 API에 대한 백엔드를 검색하고 리소스 생성 및 소멸 기능을 재정의하여 직접 처리할 수 있습니다. 이렇게 하려면 fpCreateResource
및 fpDestroyResource
함수 포인터를 덮어쓰면 됩니다.
// Setup DX12 interface.
const size_t scratchBufferSize = ffxFsr2GetScratchMemorySizeDX12();
void * scratchBuffer = malloc(scratchBufferSize);
FfxErrorCode errorCode = ffxFsr2GetInterfaceDX12(&contextDescription.callbacks, m_pDevice-> GetDevice (), scratchBuffer, scratchBufferSize);
FFX_ASSERT (errorCode == FFX_OK);
// Override the resource creation and destruction.
contextDescription.callbacks.createResource = myCreateResource;
contextDescription.callbacks.destroyResource = myDestroyResource;
// Set up the context description.
contextDescription.device = ffxGetDeviceDX12(m_pDevice-> GetDevice ());
contextDescription.maxRenderSize.width = renderWidth;
contextDescription.maxRenderSize.height = renderHeight;
contextDescription.displaySize.width = displayWidth;
contextDescription.displaySize.height = displayHeight;
contextDescription.flags = FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE
| FFX_FSR2_ENABLE_DEPTH_INVERTED
| FFX_FSR2_ENABLE_AUTO_EXPOSURE;
// Create the FSR2 context.
errorCode = ffxFsr2ContextCreate(&context, &contextDescription);
FFX_ASSERT (errorCode == FFX_OK);
FSR2에 필요한 메모리 관리를 제어하는 애플리케이션의 흥미로운 이점 중 하나는 리소스 앨리어싱이 수행되어 메모리를 절약할 수 있다는 것입니다. 메모리 요구 사항에 있는 표는 이 기술을 사용하여 얻을 수 있는 절감 효과를 보여줍니다. 이 표에 표시된 절감 효과를 실현하려면 FSR2 디스패치에 대한 호출 전반에 걸쳐 유지하는 데 필요하지 않은 내용인 적절한 메모리 영역을 찾아 FSR2에 필요한 별칭 가능 리소스와 공유해야 합니다. FSR2 백엔드 인터페이스를 통해 FSR2의 핵심 API에 의해 수행된 각 FfxFsr2CreateResourceFunc
호출에는 FfxCreateResourceDescription
구조의 일부로 플래그 세트가 포함됩니다. FFX_RESOURCE_FLAGS_ALIASABLE
이 flags
필드에 설정된 경우 이는 리소스가 렌더링 프레임의 다른 리소스와 안전하게 별칭이 지정될 수 있음을 나타냅니다.
TAA(시간적 안티앨리어싱)는 이전 프레임의 출력을 사용하여 현재 프레임에서 더 높은 품질의 출력을 구성하는 기술입니다. FSR2는 렌더링된 이미지의 해상도를 높이는 추가 목표에도 불구하고 비슷한 목표를 갖고 있으므로 더 이상 애플리케이션에 별도의 TAA 패스를 포함할 필요가 없습니다.
FSR2는 렌더링하는 동안 하위 픽셀 지터링을 적용하는 응용 프로그램에 의존합니다. 이는 일반적으로 카메라의 투영 매트릭스에 포함됩니다. 카메라 지터를 간단하게 적용하기 위해 FSR2 API는 일련의 개별 지터 오프셋 내에서 특정 프레임에 대한 하위 픽셀 지터 오프셋을 계산하는 작은 유틸리티 함수 세트를 제공합니다.
int32_t ffxFsr2GetJitterPhaseCount ( int32_t renderWidth, int32_t displayWidth);
FfxErrorCode ffxFsr2GetJitterOffset ( float * outX, float * outY, int32_t jitterPhase, int32_t sequenceLength);
내부적으로 이러한 함수는 Halton[2,3] 시퀀스 [Halton]을 구현합니다. Halton 시퀀스의 목표는 사용 가능한 공간을 포괄하는 공간적으로 분리된 지점을 제공하는 것입니다.
ffxFsr2GetJitterOffset
에서 반환된 값은 단위 픽셀 공간에 있으며 이를 투영 행렬로 올바르게 합성하려면 해당 값을 투영 오프셋으로 변환해야 한다는 점을 이해하는 것이 중요합니다. 위의 다이어그램은 단위 픽셀 공간과 투영 공간의 단일 픽셀을 보여줍니다. 아래 코드 목록은 하위 픽셀 지터 오프셋 값을 투영 매트릭스에 올바르게 합성하는 방법을 보여줍니다.
const int32_t jitterPhaseCount = ffxFsr2GetJitterPhaseCount(renderWidth, displayWidth);
float jitterX = 0 ;
float jitterY = 0 ;
ffxFsr2GetJitterOffset (&jitterX, &jitterY, index, jitterPhaseCount);
// Calculate the jittered projection matrix.
const float jitterX = 2 . 0f * jitterX / ( float )renderWidth;
const float jitterY = - 2 . 0f * jitterY / ( float )renderHeight;
const Matrix4 jitterTranslationMatrix = translateMatrix(Matrix3::identity, Vector3(jitterX, jitterY, 0 ));
const Matrix4 jitteredProjectionMatrix = jitterTranslationMatrix * projectionMatrix;
지터는 모든 렌더링에 적용되어야 합니다. 여기에는 불투명, 알파 투명 및 광선 추적된 개체가 포함됩니다. 래스터화된 객체의 경우 ffxFsr2GetJitterOffset
함수로 계산된 하위 픽셀 지터링 값은 정점 셰이딩 중에 변환을 수행하는 데 궁극적으로 사용되는 카메라 투영 행렬에 적용될 수 있습니다. 광선 추적 렌더링의 경우 하위 픽셀 지터는 광선의 원점, 즉 카메라 위치에 적용되어야 합니다.
권장되는 ffxFsr2GetJitterOffset
기능을 사용하든 자체 시퀀스 생성기를 사용하든 FfxFsr2DispatchDescription
구조의 jitterOffset
필드를 설정하여 각 프레임을 렌더링하기 위해 적용된 지터 오프셋을 FSR2에 알려야 합니다. 또한, 권장되는 ffxFsr2GetJitterOffset
함수를 사용하지 않으면 지터 시퀀스가 널 벡터를 생성하지 않도록주의해야합니다. 그것은 x와 y 치수 모두에서 0의 값입니다.
아래 표는 각 기본 품질 모드의 지터 시퀀스 길이를 보여줍니다.
품질 모드 | 스케일링 팩터 | 시퀀스 길이 |
---|---|---|
품질 | 1.5 배 (치수 당) | 18 |
균형 잡힌 | 1.7x (치수 당) | 23 |
성능 | 2.0x (치수 당) | 32 |
울트라 성능 | 3.0x (치수 당) | 72 |
관습 | [1..n] x (치수 당) | ceil(8 * n^2) |
실시간 렌더링이있는 대부분의 응용 프로그램은 두 연속 프레임 사이에 시간 일관성이 크다. 그러나 카메라의 변환이 변경되면 렌더링 된 내용이 갑자기 변경 될 수있는 경우가 있습니다. 이러한 경우, FSR2는 이전 프레임에서 축적 된 데이터를 재사용 할 수 없을 것이며,이 데이터는 복합 프로세스에서 고려할 때이를 제외하도록이 데이터를 지우 려야합니다. FSR2에 카메라로 점프 컷이 발생했음을 나타내려면 불연속 카메라 변환의 첫 번째 프레임에 대해 FfxFsr2DispatchDescription
구조의 reset
필드를 true
로 설정해야합니다.
FSR2가 추가 내부 리소스를 지우기 때문에 재설정 플래그를 사용할 때 렌더링 성능이 일반적인 프레임 투 프레임 작업보다 약간 작을 수 있습니다.
음의 MIPMAP 바이어스를 적용하면 일반적으로 더 나은 텍스처 디테일로 고급 이미지가 생성됩니다. MIPMAP 바이어스에 다음 공식을 적용하는 것이 좋습니다.
mipBias = log2(renderResolution/displayResolution) - 1.0 ;
응용 프로그램은 시간적 앨리어싱 문제를 보여주는 데 취약한 특정 고주파 텍스처 컨텐츠에 대한 MIP 바이어스를 조정하는 것이 좋습니다.
다음 표는 애플리케이션이 최종 사용자에게 노출되어야하는 제안 된 품질 모드와 일치하는 스케일링 비율에 대한 위의 의사 코드를 평가 한 MIPMAP 바이어싱 계수를 보여줍니다.
품질 모드 | 스케일링 팩터 | MIPMAP 바이어스 |
---|---|---|
품질 | 1.5 배 (치수 당) | -1.58 |
균형 잡힌 | 1.7x (치수 당) | -1.76 |
성능 | 2.0x (치수 당) | -2.0 |
울트라 성능 | 3.0x (치수 당) | -2.58 |
FSR2 API는 FfxFsr2DispatchDescription
구조를 통해 응용 프로그램에 의해 frameTimeDelta
제공해야합니다. 이 값은 밀리 초
값은 FSR 2 자동 노출 기능의 시간 구성 요소 내에서 사용됩니다. 이것은 품질 목적으로 기록 축적을 튜닝 할 수 있습니다.
높은 동적 범위 이미지는 FSR2에서 지원됩니다. 이를 가능하게하려면 FfxFsr2ContextDescription
구조의 flags
필드에서 FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE
비트를 설정해야합니다. 이미지는 선형 색상 공간에서 FSR2에 제공되어야합니다.
FSR2의 향후 개정에서 추가 색상 공간에 대한 지원이 제공 될 수 있습니다.
FSR2는 최상의 성능을 달성하기 위해 Half Precision (FP16) 하드웨어 가속을 활용하도록 설계되었습니다. 그러나 응용 프로그램의 최대 수준의 호환성 및 유연성을 제공하기 위해 FSR2에는 FP32 (Full Precision) 작업을 사용하여 셰이더를 컴파일하는 기능도 포함되어 있습니다.
지원하는 모든 하드웨어에서 FP16 버전의 FSR2를 사용하는 것이 좋습니다. directx (r D3D[11/12]_SHADER_MIN_PRECISION_16_BIT
12의 D3D12_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT
capabilitababababababababable FSR2. Vulkan의 경우 VkPhysicalDeviceFloat16Int8FeaturesKHR::shaderFloat16
설정되지 않으면 FSR2의 FP32 버전으로 떨어야합니다. 마찬가지로, VkPhysicalDevice16BitStorageFeatures::storageBuffer16BitAccess
설정되지 않으면 FSR2의 FP32 버전으로도 떨어져야합니다.
FSR2 셰이더 소스 코드에서 FP32 경로를 활성화하려면 FFX_HALF
1
으로 정의해야합니다. FP16과 FP32 사이에 알고리즘의 소스 코드의 대부분을 공유하려면 (진행중인 유지 보수를 지원하기 위해 높은 수준의 코드 공유를 보장) FSR2 셰이더 소스 코드는 유형의 매크로 세트를 사용하여 간단한 전환을 용이하게합니다. 셰이더 소스의 16 비트 및 32 비트 기본 유형.
fidelityfx 유형 | FP32 | FP16 |
---|---|---|
FFX_MIN16_F | float | min16float |
FFX_MIN16_F2 | float2 | min16float2 |
FFX_MIN16_F3 | float3 | min16float3 |
FFX_MIN16_F4 | float4 | min16float4 |
위의 표는 추상 Fidelityfx SDK 유형과 컴파일 동안 셰이더 소스의 구성에 따라 대체 될 언더레이 고유 유형 사이의 매핑을 열거합니다.
최신 GPU는 스레드 컬렉션 (파면)을 실행합니다. 단일 웨이브 프론트를 구성하는 정확한 수는 하드웨어 별 수량입니다. AMD의 GCN 및 RDNA 기반 GPU와 같은 일부 하드웨어는 64 개의 스레드를 단일 파면으로 수집합니다. 알고리즘의 실행의 정확한 특성에 따라 특정 파면 너비를 선호하는 것이 다소 유리할 수 있습니다. Shader Model 6.6의 도입으로 Microsoft는 HLSL을 통해 파면의 폭을 구체적으로 할 수있는 기능을 추가했습니다. 32 및 64 와이드 웨이브 프론트 너비를 모두 지원하는 RDNA와 같은 하드웨어의 경우, 이는 드라이버 소프트웨어 스택에 특정 너비로 웨이브 프론트를 실행하도록 요청하는 깨끗하고 휴대용 방법을 제공하기 때문에 최적화 목적으로 매우 유용한 도구입니다.
RDNA 및 RDNA2 기반 GPU에서 실행되고 Microsoft Agility SDK를 사용하는 DirectX (R) 12 기반 애플리케이션의 경우 FSR2 호스트 API는 64 층의 웨이브 프란 트 폭을 선택합니다.
컨텍스트 설명 구조에는 FSR 2 런타임에서 기본 응용 프로그램으로 텍스트 경고를 전달하기위한 콜백 함수가 제공 될 수 있습니다. 설명의 fpMessage
멤버는 다양한 유형의 문자열 메시지를 전달하기위한 함수 포인터 인 FfxFsr2Message
유형입니다. 이 변수를 적절한 함수에 할당하고 FFX_FSR2_ENABLE_DEBUG_CHECKING
플래그를 FfxFsr2ContextDescription
의 플래그 멤버 내에 전달하면 기능이 가능합니다. 디버그 개발 빌드에서만 활성화되는 것이 좋습니다.
체커가 가능한 문제를 관찰 할 때 발생할 수있는 출력의 예는 다음과 같습니다.
FSR2_API_DEBUG_WARNING: FFX_FSR2_ENABLE_DEPTH_INFINITE and FFX_FSR2_ENABLE_DEPTH_INVERTED present, cameraFar value is very low which may result in depth separation artefacting
FSR2_API_DEBUG_WARNING: frameTimeDelta is less than 1.0f - this value should be milliseconds (~16.6f for 60fps)
FSR2 알고리즘은 일련의 단계로 구현되며 다음과 같습니다.
알고리즘의 각 패스 단계는이 중 하나를 따르는 섹션에 배치되지만 전체 FSR2 알고리즘의 데이터 흐름은 아래 다이어그램에 표시됩니다.
Compute Luminance Pyramid 단계에는 두 가지 책임이 있습니다.
다음 표에는 Compute Luminance Pyramid 단계에서 소비되는 모든 리소스가 포함되어 있습니다.
시간 층은 데이터를 공급 해야하는 프레임을 나타냅니다. '현재 프레임'은 데이터가 다음에 제시 될 프레임에 대해 생성 된 리소스에서 공급되어야 함을 의미합니다. '이전 프레임'은 데이터가 방금 제시된 프레임에 대해 생성 된 리소스에서 공급되어야 함을 나타냅니다. 해상도 열에는 데이터가 '렌더링'해상도 또는 '프레젠테이션'해상도에 있어야하는지 여부가 나타납니다. '렌더링'해상도는 자원이 응용 프로그램이 렌더링을 수행하는 해상도와 일치해야 함을 나타냅니다. 반대로, '프레젠테이션'은 대상의 해상도가 사용자에게 제시되어야 할 것과 일치해야 함을 나타냅니다.
이름 | 시간 층 | 해결 | 체재 | 유형 | 메모 |
---|---|---|---|---|---|
컬러 버퍼 | 현재 프레임 | 세우다 | APPLICATION SPECIFIED | 조직 | 애플리케이션에서 제공 한 현재 프레임의 렌더링 해상도 색상 버퍼. 컬러 버퍼의 내용이 HDR (High Dynamic Range) 인 경우 FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE 플래그를 FfxFsr2ContextDescription 구조의 flags 필드에 설정해야합니다. |
다음 표에는 Compute Luminance Pyramid 단계에서 생산 또는 수정 된 모든 자원이 포함되어 있습니다.
시간 층은 데이터를 공급 해야하는 프레임을 나타냅니다. '현재 프레임'은 데이터가 다음에 제시 될 프레임에 대해 생성 된 리소스에서 공급되어야 함을 의미합니다. '이전 프레임'은 데이터가 방금 제시된 프레임에 대해 생성 된 리소스에서 공급되어야 함을 나타냅니다. 해상도 열에는 데이터가 '렌더링'해상도 또는 '프레젠테이션'해상도에 있어야하는지 여부가 나타납니다. '렌더링'해상도는 자원이 응용 프로그램이 렌더링을 수행하는 해상도와 일치해야 함을 나타냅니다. 반대로, '프레젠테이션'은 대상의 해상도가 사용자에게 제시되어야 할 것과 일치해야 함을 나타냅니다.
이름 | 시간 층 | 해결 | 체재 | 유형 | 메모 |
---|---|---|---|---|---|
노출 | 현재 프레임 | 1x1 | R32_FLOAT | 조직 | 현재 프레임에 대해 계산 된 노출 값을 포함하는 1x1 텍스처. 이 리소스는 선택 사항이며 FfxFsr2Context 를 생성 할 때 FFX_FSR2_ENABLE_AUTO_EXPOSURE 플래그가 FfxFsr2ContextDescription 구조 구조의 flags 필드에 설정된 경우 생략 될 수 있습니다. |
현재의 휘도 | 현재 프레임 | Render * 0.5 | R16_FLOAT | 조직 | 현재 프레임의 휘도를 포함하는 렌더 해상도 텍스처의 50%에서의 텍스처. 전체 MIP 체인이 할당됩니다. |
Compute Luminance Pyramid Stage는 Fidelityfx 단일 패스 다운스를 사용하여 구현됩니다.