|
Anti-Aliasing From a Different Perspective
|
tarix | 07.11.2018 | ölçüsü | 4,62 Mb. | | #78509 |
|
Dmitry Andreev (AND) dandreev@LucasArts.com
Directionally Localized Anti-Aliasing
Agenda Aliasing & Anti-Aliasing Alternative Solutions Exploration DLAA PS3 & X360
The Idea Is ... Blur Edges Along Their Directions
Blurred. Done !
Aliasing Signal Processing - Indistinguishable signals when sampled
- Artifact of reconstruction
Graphics - Pixel "noise"
- Edge jaggies
Anti-Aliasing I Reduce Higher-Frequencies Oversample And "Blur" - Temporal in audio
- Spatial in optics
No Perfect Filter Exists - Sampling theory
- Sharp (aliased) vs soft (anti-aliased)
Anti-Aliasing II Texture Shading - Specular, rim lighting
- Avoid manually
Geometry Edges - Multi-sampling (MSAA)
- Custom solutions
MSAA Good Quality Partial Super Sampling Deferred Rendering Unfriendly Costly On Consoles
Alternatives Screen-Space Filtering - Perception based
- Hide jaggies
- Morphological AA (MLAA)
Temporal (Crysis 2, Halo) Edge-Based AA
MLAA Morphological Anti-Aliasing (Intel) - Reconstruct original geometry
- Re-blend neighbors
CPU Friendly - The Saboteur
- GoW3 (4ms / 5 SPUs)
XBox360 GPU (> 3.7 ms)
Edge-Based XBox360 SDK Sample - Render one-pixel wide polygons
- Texcoord as pixel coverage
- Re-blend neighbors
Could Not Use MLAA Edge-Based Temporal - Dynamic resolution adjustment in TFU2
- Motion vs resolution
"Ideal" AA Filter Multi-Platform - GPU, SPU
- Reliable in production
Temporally Stable Perception Based
What If … Create Pixel Coverage-Like Look
Fresnel Term Based ( N·V )n Re-Blend Curved Surfaces Only Hard To Control
Depth Based Gradients Find Edge Gradients - Depth box-blur
- Adjust levels locally
Re-Blend Flat Surfaces
Depth Re-Sampling Render Alternative Depth - Rotated 2nd z-pre pass
- Or 4x MSAA for depth
Compute Pixel Coverage Re-Blend
Observation
DLAA Prototyping I Photoshop - Layers vs Pixels
- Hard to do complex things
- Easy to implement IF works :)
Filter / Other / Custom - Basic 5x5 convolution
- Blurs, Edges, etc...
DLAA Prototyping II
DLAA Prototyping III
DLAA Prototyping IV Blur Vertically Find Vertical Edges Build Edge Mask - saturate( abs( x ) · a – b )
DLAA Prototyping V Blur Vertically Find Vertical Edges Build Edge Mask - saturate( abs( x ) · a – b )
Blend With Original Layer Same Horizontally
Short Edges Only
Two Cases - 5-Pixel Wide 16-Pixel Wide
Long Edge Detection I
Long Edge Detection II
Long Edge Detection III Take High-Pass Mask Blur Adjust Contrast
Long Edge Detection IV Take High-Pass Mask Blur Adjust Contrast Apply Long-Edge Filter
Long Edge Filtering II Color Bleeding Luminosity Blending Mode Blurred luminance As Target - Find local pixel that matches it
Noise Level Estimation Exclude Noisy Regions - Have long vertical and horizontal edges
- ||HhF – VhF|| > λ
Gradient Levels Comparison
Visual Results
Reflections Anti-Aliasing
Execution Results @ 720p XBox360 2.2 ± 0.2 ms PlayStation3 1.6 ± 0.3 ms (5 SPUs) Project Time - Research 8 weeks (part time)
- X360 2 weeks
- PS3 (SPU) > 3 weeks
Implementation Strategies Execution Time - Reuse samples
- Reject as much work as possible
- Balance pipelines
Memory Usage Global Pipeline Optimizations
Work Rejection Pre-Process - Find long edge regions
- High-pass around long edges
- Resolve
Process - Short edges
- Short and long edges (~10-20 %)
- Resolve
Long Edge Estimation I Find Long Axial Edges Directly - At lower resolution (e.g. from HDR reduction)
Long Edge Estimation II Transfer Into Hi-Z (4x4 pixel blocks) Flip Hi-Z Test With Depth Trick
High-Pass Filter 5 Bi-Linear Samples Around Long Edges Only Store In Alpha
Short Edges Low And High-Pass Filters - Reuse vertical and horizontal samples
Normalized Blending Coefficients Re-Blend - c = lerp( c, blurh, saturate( th ) )
Long Edges I Sparse Sampling On GPU - Reuse short samples
- Extra 4 bi-linear samples
Discard If Horizontal And Vertical - [branch] based on blurred high-pass
Long Edges II Find Local Pixel That Matches Blurred Intensity - blurredlum = lerp( Xlum, Ylum, t )
- color = lerp( X, Y, t )
Long Edges III Find Local Pixel That Matches Blurred Intensity - blurredlum = lerp( Xlum, Ylum, t )
- color = lerp( X, Y, t )
Two Search Cases
Long Edges IV Find Local Pixel That Matches Blurred Intensity - blurredlum = lerp( Xlum, Ylum, t )
- color = lerp( X, Y, t )
Two Search Cases Re-Blend
SPU Post Processing Software Pipelining Balance Even And Odd Instructions Stream Processing Tiled RSX Surfaces - 0.3 ms to copy from VRAM
- Partial untiling with DMA
DLAA On SPUs I No Need to Handle Overlaps Short Edges - Byte operations → 4 RGBA pixels / clk
- (1 2 1) = AVGB( AVGB( l, c ), AVGB( c, r ) )
- ║x – y║ = ABSDB( x, y )
Long Edges - blur( x ) = ∑f(x + dx)
- blur( x + 1 ) = blur( x ) – f( x – r ) + f( x + 1 + r )
DLAA On SPUs II Quick Luminance - SUMB ( G, R, G, B ) → 0.25 R + 0.5 G + 0.25 B
Quick Saturate - CFLTU x, x, 32; CUFLT x, x, 32
Quick Interpolation - r = lerp( x, y, t )
- FS r, Y, X SHUFB X, x, _, _
- FMA r, t, r, X SHUFB Y, y, _, _
Typical SPU Code
Efficient SPU Code
Conclusion DLAA - XBox360 2.2 ± 0.2 ms
- PlayStation3 1.6 ± 0.3 ms (5 SPUs)
- Every millisecond counts
- Tricks are inevitable
- Different solutions & different thinking
Acknowledgments - Szymon Swistun
- Ruslan Abdikeev
- Axel Wefers
- Jerome Scholler
- Tom Madams
- Anti-Aliasing Community
Thank You Questions ? dandreev@LucasArts.com
Dostları ilə paylaş: |
|
|