430 likes | 521 Views
This lecture from October 2007 covers aliasing and antialiasing in computer graphics, exploring the effects of low frequencies in rendered images and the importance of band-limiting and proper sampling for accurate reconstruction. The concept of pre-filtering is discussed, along with its advantages and limitations in improving image quality. The practical challenges of ideal signal reconstruction and the equivalence of various filtering techniques are also addressed. The lecture delves into the complexities of handling aliasing artifacts and introduces different approaches like pre-filtering and increased sample rates for antialiasing. The integration of pre-filtering in the vertex pipeline and the implications for image assembly and reconstruction errors are highlighted, shedding light on the intricate processes involved in mitigating aliasing effects in computer graphics.
E N D
Pre-Filter Antialiasing Kurt Akeley CS248 Lecture 4 4 October 2007 http://graphics.stanford.edu/courses/cs248-07/
Aliasing Aliases are low frequencies in a rendered image that are due to higher frequencies in the original image.
Jaggies Original: Rendered:
Convolution theorem Let fand g be the transforms of f and g. Then Something difficult to do in one domain (e.g., convolution) may be easy to do in the other (e.g., multiplication)
Aliased sampling of a point (or line) * x = = f(x) F(s)
Aliased reconstruction of a point (or line) * x sinc(x) = = f(x) F(s)
Reconstruction error (actually none!) Original Signal Phase matters! AliasedReconstruction
Sampling theory Fourier theory explains jaggies as aliasing. For correct reconstruction: • Signal must be band-limited • Sampling must be at or above Nyquist rate • Reconstruction must be done with a sinc function All of these are difficult or impossible in the general case. Let’s see why …
Why band-limiting is difficult Band-limiting primitives prior to rendering compromises image assembly in the framebuffer • Band-limiting changes (spreads) geometry • Finite spectrum infinite spatial extent • Interferes with occlusion calculations • Leaves visible seams between adjacent triangles Can’t band-limit the final (framebuffer) image • There is no final image, there are only samples • If the sampling is aliased, there is no recovery Nyquist-rate sampling requires band-limiting
Why ideal reconstruction is difficult In theory: • Required sinc function has • Negative lobes (displays can’t produce negative light) • Infinite extent (cannot be implemented) In practice: • Reconstruction is done by a combination of • Physical display characteristics (CRT, LCD, …) • The optics of the human eye • Mathematical reconstruction (as is done, for example, in high-end audio equipment) is not practical at video rates.
Two antialiasing approaches are practiced Pre-filtering (this lecture) • Band-limit primitives prior to sampling • OpenGL ‘smooth’ antialiasing Increased sample rate (future lecture) • Multisampling, super-sampling • OpenGL ‘multisample’ antialiasing
* x = = f(x) F(s) Ideal point (or line cross section) sinc(x) sinc(x)
* x = = f(x) F(s) Band-limited unit disk sinc(x) sinc(x)
* x = = f(x) F(s) Almost-band-limited unit disk sinc(x) sinc2(x) sinc3(x) Finite extent!
Equivalences These are equivalent: • Low-pass filtering • Band-limiting • (Ideal) reconstruction These are equivalent: • Point sampling of band-limited geometry • Weighted area sampling (FvD 3.17.3) of full-spectrum geometry
Pre-filter pros and cons Pros • Almost eliminates aliasing due to undersampling • Allows pre-computation of expensive filters • Great image quality (with important caveats!) Cons • Can’t handle interactions of primitives with area • Reconstruction is still a problem
Pre-filtering in the vertex pipeline Application struct { float x,y,z,w; float r,g,b,a;} vertex; Vertex assembly Vertex operations struct { vertex v0,v1,v2 } triangle; Primitive assembly Primitive operations Point sampling of pre-filtered primitives sets fragment alpha value struct { short int x,y; float depth; float r,g,b,a;} fragment; Rasterization Fragment operations Fragments are blended into the frame buffer struct { int depth; byte r,g,b,a;} pixel; Framebuffer Display
Pre-filter point rasterization point being sampled at the center of this pixel alpha
Pre-filter line rasterization line being sampled at the center of this pixel alpha
Point size Xscreen frac bits Yscreen frac bits Pixel index 3 4 4 4 Pre-filtered primitive stored in table Supports pre-computation Simplifies distance calculation (square root in table) Can compensate for reconstruction errors • Sampling and reconstruction go hand-in-hand Fragment Alpha 32K x 8 8
Line slope Xscreen frac bits Yscreen frac bits Pixel index Line width 5 4 4 4 3 Line tables get big! Fragment Alpha 1M x 8 8
Triangle pre-filtering is difficult Three arbitrary vertex locations define a huge parameter space • Resulting table is too large to implement Edges can be treated independently • But this is a poor approximation near vertexes, where two or three edges affect the filtering • And triangles can be arbitrarily small
Pre-filtering in the vertex pipeline Application struct { float x,y,z,w; float r,g,b,a;} vertex; Vertex assembly Vertex operations struct { vertex v0,v1,v2 } triangle; Primitive assembly Primitive operations Point sampling of pre-filtered primitives sets fragment alpha value struct { short int x,y; float depth; float r,g,b,a;} fragment; Rasterization Fragment operations Fragments are blended into the frame buffer struct { int depth; byte r,g,b,a;} pixel; Framebuffer Display
Ideal pre-filtered image assembly Impulse-defined points and lines have no area So they don’t occlude each other So fragments should be summed into pixels C’pixel = Cpixel + Afrag Cfrag
Practical pre-filtered image assembly Frame buffers have limited numeric range So summation causes overflow or clamping ‘Uncorrelated’ clamped blend yields good results • But clamping R, G, and B independently causes color shift ‘Anti-correlated’ clamped blend is an alternative • Best for rendering pre-filtered triangles • sorted front-to-back • But requires frame buffer to store alpha values C’pixel = (1-Afrag)Cpixel + Afrag Cfrag
Anti-correlated blend function i = min(Afrag, (1-Apixel)) A’pixel = Apixel + I C’pixel = Cpixel + i Cfrag
OpenGL API glEnable(GL_POINT_SMOOTH); glEnable(GL_LINE_SMOOTH); glEnable(GL_POLYGON_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); // sum glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // blend glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE); // saturate
Resolution of the human eye Eye’s resolution is not evenly distributed Foveal resolution is ~20x peripheral Systems can track direction of view, draw high-resolution inset Flicker sensitivity is higher in periphery One eye can compensate for the other Research at NASA suggests high-resolution dominant display Human visual system is well engineered …
Imperfect optics - linespread Ideal Actual
* x = = f(x) F(s) Filtering
* * = = f(x) f(x) Frequencies are selectively attenuated
Selective attenuation (cont.) * * = = f(x) f(x)
Optical “imperfections” improve acuity Image is pre-filtered Cutoff is approximately 60 cpd Cutoff is gradual – no ringing Aliasing is avoided Foveal cone density is 120 / degree Cutoff matches retinal Nyquist limit Vernier acuity is improved Foveal resolution is 30 arcsec Vernier acuity is 5-10 arcsec Linespread blur includes more sensors
Summary Two approaches to antialiasing are practiced • Pre-filtering (this lecture) • Increased sample rate Pre-filter antialiasing • Works well for non-area primitives (points, lines) • Works poorly for area primitives (triangles, especially in 3-D) The human eye is well adapted • Sampling theory helps us here too
Assignments Before Thursday’s class, read • FvD 3.1 through 3.14, Rasterization Project 1: • Continue work • Demos Wednesday 10 October