Checkerboard Rendering for Real- Time Upscaling on Intel Integrated Graphics (CBR) Sony* PS4 Pro Frostbite* ( ) 1/4 2x MSAA (2 ) CBR CBR 1.14 1.2 (GPU) CBR GPU 5 DirectX* 12 MiniEngine GitHub* GameTechDev( ) (CBR) CBR (GPU) AMD* NVIDIA* GPU
Sony* PS4 Pro GPU (DRR: Dynamic Resolution Rendering) 1 GPU GPU GPU (CBR) CBR Sony* PS4 Pro 1080p (1920 x 1080) 4K (3840 x 2160) 1080p 540p (960 x 540) CBR 1080p CBR CBR DRR 2 CBR CBR DRR CBR GDC ( ) SIGGRAPH ( ) Doug Binks Dynamic Resolution Rendering ( ) ( ) DRR 1 GPU
Sony* PS4 Pro CBR CBR Sony* PS4 Pro 4K (3840 x 2160) ( ) Mark Cerny Richard Leadbetter 13 9 CBR 2160p 2 Killing Floor 2 infamous Mass Effect: Andromeda CBR 1080p Sony* CBR CBR CBR 1800p 2160p ID CBR 2016 Ubisoft* Jalal El Mansouri CBR ( ) 720p (1280 x 720) 60fps 4K PC Ubisoft* CBR Ubisoft* 1 MSAA z 2x MSAA 1/4 ( ) 2 Ubisoft* DECIMA* CBR SIGGRAPH 2017 Guerilla* Games Giliam de Carpentier DECIMA* ( ) CBR 2x MSAA (FXAA: Fast Approximate Anti-Aliasing) 45 Sony* PS4 Pro 2ms Frostbite* CBR Frostbite* 1 Mass Effect: Andromeda CBR Graham Wihlidal GDC 2017 Frostbite* ( ) CBR DRR (EQAA: Enhanced Quality Anti-Aliasing)
1/4 2x MSAA 1/4 2x MSAA 1. : : : 1 2. : : 2
3. 2 : N-1: N: : N-1 N ( ) 3 2 N-1 3 ( N) 2x MSAA 4. 2x MSAA 1/4 2x MSAA
2x MSAA 1/4 2 4 2x MSAA 5. 2x MSAA 1/4 : N-1 2x MSAA : N 2x MSAA (1 : N-1 N MSAA 2x MSAA ( ) 5 ( ) 2x MSAA 2x MSAA 2 1/4 2x MSAA 2
2x MSAA 6. 2x MSAA 1/4 : : N-1 2x MSAA : N-1 : 1 : N 2x MSAA : N : N-1 N 1 2x MSAA 6 N-1 N 2x MSAA 1 2x MSAA ( ) CBR 2 ( ) CBR
CBR 7. : : CBR 2 1/4 CBR 7 8: 2x MSAA N-1 N N-1 N 1. 1/4 ( 1/2 1/2) 2 ( N-1 N ) 2x MSAA 1. MIP LOD Bias (MIP Multum in Parvo LOD Level Of Detail )Direct3D* 12 3D -0.5f D3D12_SAMPLER_DESC MipLODBias 2. N-1 3. 1/4 1 4.
CBR CBR BR C CBR 9. 3 1. G-Buffer G-Buffer albedo normal specular 3 2. G-Buffer G-Buffer (albedo normal specular) 3. ( ) CBR 1 10 2x MSAA 1/4 G-Buffer 10. G-Buffer 2x MSAA
1 2 G -Buffer 2x MSAA 2 MSAA (SRT: Shade Resolve Target) 11 11. SRT 2x MSAA 2 2x MSAA G-Buffer 3 2 1. SRT 2x MSAA 2 2. CBR SRT MSAA 12 2x MSAA ( (CFB)) 12. CFB
-1 N SRT CFB N ( 13) 13. 14 14. CBR
-1 15 16 N-1 N N ( ) N-1 N-1 ID 15. : N-1 : N : N N-1 N-1 N ( ) N-1 : N-1 N
16. ( Y) Y 17 N-1 N 17. : N-1 : N
N-1 X 18 18. N-1 2 1 1 N-1 N 19 (CSO: Check Shading Occlusion) 2 1/4 Occluded) 2 1/4 20 CSO ASO CSO ASO ID
// If there is pixel motion between frames if ( qtr_res_pixel_delta.x qtr_res_pixel_delta.y ) { float4 current_depth; // Fetch the interpolated depth at this location in Frame N current_depth.x = readdepthfromquadrant( qtr_res_pixel + cardinal_offsets[ Left ], cardinal_quadrants[ 1 ] ); current_depth.y = readdepthfromquadrant( qtr_res_pixel + cardinal_offsets[ Right ], cardinal_quadrants[ 1 ] ); current_depth.z = readdepthfromquadrant( qtr_res_pixel + cardinal_offsets[ Down ], cardinal_quadrants[ 0 ] ); current_depth.w = readdepthfromquadrant( qtr_res_pixel + cardinal_offsets[ Up ], cardinal_quadrants[ 0 ] ); float current_depth_avg = (projecteddepthtolinear( current_depth.x ) + projecteddepthtolinear( current_depth.y ) + projecteddepthtolinear( current_depth.z ) + projecteddepthtolinear( current_depth.w )) *.25f; // reach across the frame N-1 and grab the depth of the pixel we want // then compare it to Frame N's depth at this pixel to see if it's within range float prev_depth = readdepthfromquadrant( prev_qtr_res_pixel, quadrant_needed ); prev_depth = projecteddepthtolinear( prev_depth ); } // if the discrepancy is too large assume the pixel we need to // fetch from the previous buffer is missing float diff = prev_depth - current_depth_avg; missing_shading = abs(diff) >= tolerance; 1. CSO N-1 N N-1 19. : N-1 N 1/4 CSO :
20. CSO ASO 500 : CSO : ASO ( ) ( 2 HLSL (High-Level Shading Language) ) 1. N ( ) 1. N 2. -1 N 2. 1. N-1 2. -1 N 3. -1 N 1. N N-1 ( ) N 2. 4. CSO 1. ( ) N-1 2. N ( ) 3. 2 4. 5. ASO N 6. ( ) N-1
// if the pixel we are writing to is in a MSAA // quadrant which matches our latest CB frame // then read it directly and we're done if ( frame_quadrants[ 0 ] == quadrant frame_quadrants[ 1 ] == quadrant ) return readfromquadrant( qtr_res_pixel, quadrant ); else { // We need to read from Frame N-1... // Get the screen space position this pixel was rendered in Frame N-1 uint2 prev_pixel_pos =... // Which MSAA quadrant was this pixel in when it was shaded in Frame N-1 uint quadrant_needed =...... // if it falls on this frame (Frame N's) quadrant // then the shading information is missing // so extrapolate the color from the texels around us if ( frame_quadrants[ 0 ] == quadrant_needed frame_quadrants[ 1 ] == quadrant_needed ) missing_shading = true; else if ( qtr_res_pixel_delta.x qtr_res_pixel_delta.y ) { // Otherwise we might have the shading information, // Now we check to see if it's occluded // If the user doesn't want to check // for occlusion we just assume it's occluded // and this pixel will be an extrapolation of Frame N's pixels around it // This generally saves on perf and isn't noticeable // because the shading will be in motion if ( false == check_shading_occlusion ) missing_shading = true; else {... } } // if the discrepancy is too large assume the pixel we need to // fetch from frame N-1 is missing float diff = prev_depth - current_depth_avg; missing_shading = abs(diff) >= tolerance; } // If we've determined the pixel (i.e. shading information) is missing, // then extrapolate the missing color by blending the // current frame's up, down, left, right pixels if ( missing_shading == true ) return colorfromcardinaloffsets( qtr_res_pixel, cardinal_offsets, cardinal_quadrants ); else return readfromquadrant( prev_qtr_res_pixel, quadrant_needed ); 2. HLSL 1 MSAA
21. : : 1/4 : : 1/4 21 ( 22) CMAA ( ) FXAA ( ) TAA ( )
22. N-1 1080p CBR 23 CBR 1/4 ASO CSO ASO 15% ( 24) CSO 12% ( 25) CSO ( )
23. (AA SSAO ) 1920 x 1080 GPU ( )
24. ASO CBR 1080p : GPU ( ) : CBR 1080p ( ) 25. CSO CBR 1080p : GPU ( ) : CBR 1080p ( ) CSO 2 1 CBR Sony* PS4 Pro 2 2
CBR CBR 30 GPU CBR GPU Kai Xiao ART Stephen Junkins Marissa du Bois Lumberyard Bistro Amazon* Open Research Content Archive (ORCA) NVIDIA* Corporation ( ) Crytek ( ) Amazon Lumberyard Bistro, Open Research Content Archive (ORCA). Doug Binks, Dynamic Resolution Rendering Article, July 13, 2011. Giliam de Carpentier and Kohei Ishiyama, Decima: Advances in Lighting and AA. SIGGRAPH 2017 Advances in Real-Time Rendering. Crytek Sponza Model, Crytek, cryengine3 downloads. Jalal El Mansouri, Rendering Rainbow Six Siege. GDC 2016. Brian Karis, High-Quality Temporal Supersampling. SIGGRAPH 2014 Advances in Real-Time Rendering in Games Richard Leadbetter: Interview with Mark Cerny, PS4 Pro Architect. Inside PlayStation Pro 4 Pro: How Sony made the first 4K games console. October 20, 2016. Timothy Lottes, FXAA. February 2009. Filip Strugar, Conservative Morphological Anti-Aliasing (CMAA) March 2014 Update. March 18, 2014. Graham Wihlidal 4K Checkerboard in Battlefield 1 and Mass Effect: Andromeda. GDC 2017.