Lecture_007_Depth_and_Transparency

Painter's algorithm: with n triangles

Z-buffer: with n fragments

Model transparency: with some probability we don't see the object at all, with \alpha probability, we see the object.

So in practice:

  1. render opaque objects only with z-buffer
  2. render transparency back to front with painter's algorithm (sorting transparent triangles first) with no update to z-buffer but with depth test.

For better version of painter's algorithm: search Order-independent transparency.

Alpha Blending:

C_{\text{frame buffer}} = \alpha_{scr} \cdot C_{src} + (1 - \alpha_{scr})\cdot C_{\text{frame buffer}}

Additive Blending:

C_{\text{frame buffer}} = \max(C_{max}, \alpha_{scr} \cdot C_{src} + C_{\text{frame buffer}})

Occlusion and Depth Buffer

Given depth of klzzwxh:0003 we can easily figure out pixel depth by linear interpolation

Given depth of d_i we can easily figure out pixel depth by linear interpolation

Depth Buffer Example

Depth Buffer Example

Depth Buffer: we keep track the depth of the closest triangle seen so far 0. initialize depth for each pixel (super sample) to infinity

  1. randomly select a not drawn triangle from buffer
  2. for each pixel (super sample), draw that triangle if its depth value is smaller than stored value, don't draw if its depth value is larger than stored value
  3. update new depth buffer if pixel (super sample) get drawn
  4. repeat until all triangles are drawn

Depth Buffer Code

Depth Buffer Code

The above technique will work fine with supersample. You obtain multiple copies of frame buffer and then merge them into one.

Space: constant space per sample for depth buffer, don't depend on overlapping primitives

Time: constant time per covered sample

Transparency and Alpha

Why do we need alpha for non-transparent: to represent things thinner than one pixel

Why do we need alpha for non-transparent: to represent things thinner than one pixel

Non-Premultiplied Alpha

Over operator for non-premultiplied alpha: non-commutative blending of tinted glass

Over operator for non-premultiplied alpha

Over operator for non-premultiplied alpha

Given A = (A_r, A_g, A_b) with alpha \alpha_A and B = (A_r, A_g, A_b) with alpha \alpha_B, to compute B over A, we get: C = \alpha_BB+ (1 - \alpha_B)\alpha_AA, \alpha_C = \alpha_B + (1 - \alpha_B)\alpha_A

Fringing: dark halo in non-premultiplied alpha

Fringing: dark halo in non-premultiplied alpha

Color got Darken with Non-Premultiplied Alpha

Color got Darken with Non-Premultiplied Alpha

Premultiplied Alpha

Premultiplied Alpha: compute B over A

Alpha Blending with Premultiplied Alpha Works Well with Upsampling

Alpha Blending with Premultiplied Alpha Works Well with Upsampling

Alpha Blending with Premultiplied Alpha Works Well with MIP Map

Alpha Blending with Premultiplied Alpha Works Well with MIP Map

Premultiplied alpha is closed under composition

Semi-tranparent Object is a Pain in Non-Ray Tracing Because of Strage in Depth Buffer

Semi-tranparent Object is a Pain in Non-Ray Tracing Because of Strage in Depth Buffer

Render mixture of opaque and transparent triangles

  1. render all opaque primitives in any order
  2. disable write to depth buffer, render semi-transparent triangles in back-to-front order. If depth test passed, triangle is over color buffer, otherwise don't draw. (we need to sort semi-transparent triangles and hope they don't intersect)

Full Rasterization Pipeline

Input

Input

Step 1

Step 1

Step 2

Step 2

Step 3

Step 3

Step 4

Step 4

Step 5

Step 5

Step 6

Step 6

Step 7

Step 7

Step 8

Step 8

Steps:

  1. Transform triangle vertices into camera-centered world space (inverse of camera transform)
  2. Apply perspective projection into normalized coordinate space
  3. Clipping: discard triangles lie outside (culling) and clip triangles to box (possibly generate new triangles)
  4. Transform normalized coordinates into screen coordinates and to image coordinates
  5. Pre-compute data in Barycentric Coordinates
  6. Sample Coverage
  7. Filtering, MIP Map, Sample Texture, Interpolation
  8. Depth Test and Update Depth Value

GPUs

Modern Rasterization Pipeline: OpenGL / Direct3D

Modern Rasterization Pipeline: OpenGL / Direct3D

Integrated GPU

Integrated GPU

GPU has very specialized parts that only deals with rendering triangles (fixed functions)

GPU has very specialized parts that only deals with rendering triangles (fixed functions)

GPU are becoming more programmable, control staging

GPU are becoming more programmable, control staging

Dedicated Ray-tracing pipeline in Nvidia RTX

Dedicated Ray-tracing pipeline in Nvidia RTX

Table of Content