CMU 15–462: Introduction to Computer Graphics (Fall 2020)

Here are my notes taken from the video lectures of *CMU 15–462: Introduction to Computer Graphics (fall 2020)* ¹.

## Drawing a Triangle

- Rasterization: for each primitive (i.e. triangle), which pixels to light up?

- Extremely fast, but hard to achieve photorealism. - Ray tracing: for each pixel, which primitives are seen?

- Generally slow, but easier to get photorealism. - Rough sketch of a rasterization pipeline:

- Position objects in the world (3D transformations).

- Project objects onto the screen (perspective projection).

- Sample triangle coverage (rasterization).

- Interpolate triangle attributes at covered samples (barycentric coordinates).

- Sample texture maps or evaluate shaders (mipmapping).

- Combine samples into the final image (depth and transparency). - Computing triangle coverage:

- Input: projected positions of the triangle vertices.

- Output: a set of pixels covered by the triangle.

- Real scenes are complicated due to occlusion and transparency.

- Instead of doing exact computation, we resort to sampling and reconstruction. - Aliasing: high frequencies in the original signal masquerade as low frequencies after reconstruction due to undersampling.
- Supersampling: take multiple samples per pixel and calculate average coverage.
- Coarse-to-fine work in real graphics pipelines:

- Check if large blocks intersect the triangle for early-in and early-out.

- Test individual samples in the intersected blocks in parallel.

## Spatial Transformations

- A transformation is characterized by the invariants it preserves.
- Orthogonal transformations preserve the origin and distances.

- The inverse of the transformation is the transpose.

- It represents either a rotation, where the orientation is preserved …

- … or a reflection, where the orientation is reversed. - The spectral theorem indicates that a symmetric matrix performs a (non-uniform) scaling along some set of orthogonal axes.
- Polar decomposition decomposes a matrix into

- an orthogonal matrix*Q*(i.e. rotation or reflection), and

- a symmetric positive-semidefinite matrix*P*(i.e. scaling). - An affine transformation (e.g. translation) in 2D can be represented by a linear transformation (e.g. shear) in 3D.

- A point has a non-zero homogeneous coordinate.

- A vector has a zero homogeneous coordinate. - A scene graph stores relative transformation in a directed graph.

## 3D Rotations and Complex Representations

- 2D rotations commute, but 3D rotations don’t.
- Imaginary unit is just a quarter-turn in the counter-clockwise direction.
- Complex multiplication amounts to angle addition and magnitude multiplication.
- A quaternion is a pair of a scalar and a vector.

- It easily represents a rotation around an axis by some angle. - Quaternions enable spherical linear interpolation (SLERP).

- Complex numbers are natural language for conformal (angle-preserving) maps.

## Perspective Projection and Texture Mapping

- View frustum is the region the camera can see.

- Clipping eliminates primitives outside the view frustum.

- Near/far clipping is important for keeping finite-precision depth values accurate (z-fighting).

- The frustum is then (linearly) transformed into a unit cube. - 3D linear interpolation:

- Find the affine function passing the vertices of the triangle.

- Alternatively, calculate the barycentric coordinates. - Texture coordinates define a mapping from surface coordinates to points in texture domain.
- Texture aliasing happens when a single pixel on the screen covers many pixels of the texture.

- For magnification, just need to interpolate the value at the screen pixel center (via bilinear interpolation).

- For minification, need to calculate the average among neighboring texture pixels. - MIP map: store pre-filtered image at every possible scale, and look up each screen pixel from the appropriate level.

- The nearest integral level is calculated based on*du/dx, dv/dx, du/dy, dv/dy*.

- We further interpolate the value from the two neighboring integral levels (trilinear interpolation).

- For anisotropic filtering, it takes a further interpolation.

## Depth and Transparency

- For each sample, the depth-buffer (a.k.a. z-buffer) stores the depth of the closest triangle seen so far.

- Depth is interpolated using barycentric coordinates.

- This doesn’t depend on the processing order of the primitives. - Opacity is represented as the value alpha.
- Pre-multiplied alpha is closed under composition of the
*over*operation.

- Combine depth and transparency:

- First process fully opaque primitives (with depth tests) in any order.

- Then process uncovered semi-transparent primitives from back to front. - GPUs are heterogeneous multi-core processors with fixed functions for rasterization.

- Recent GPUs (Nvidia RTX) have rendering functions baked in.