Anti-Aliasing From a Different Perspective



Yüklə 4,62 Mb.
tarix07.11.2018
ölçüsü4,62 Mb.
#78509



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

    • Mip-mapping
  • 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

    • Directly and indirectly


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

    • Unstable
    • Tough on X360
  • Edge-Based

    • Extra GPU cost on PS3
  • Temporal

    • Dynamic resolution adjustment in TFU2
    • Motion vs resolution


"Ideal" AA Filter

  • Multi-Platform

    • GPU, SPU
    • Reliable in production
  • Temporally Stable

  • Perception Based

    • Hide jaggies
  • Good Quality For Low Cost



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

    • Remap depth value
  • 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

  • Blur Vertically



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

  • Take High-Pass Mask



Long Edge Detection II

  • Take High-Pass Mask

  • Blur



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

    • Where it's needed


Long Edge Filtering I

  • Color Bleeding



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)

    • 4x MSAA trick
  • Flip Hi-Z Test With Depth Trick

    • Using D3DHIZFUNC


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

    • Top and bottom neighbors
  • Re-Blend

    • Based on longEdgeMask


Typical SPU Code



SPU Post Processing

  • Software Pipelining

    • Hide latency
  • 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)
  • End Of Console Life Cycle

    • 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



Thank You

  • Questions ?

  • dandreev@LucasArts.com



Yüklə 4,62 Mb.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə