Milk Tea Rendering

I simulated the process of pouring milk into a glass of black tea in real-time. In the simulation, milk is represented as a set of massless particles, whose positions are propagated with a 3D velocity field within the volumn of black tea. How the velocity field varies with external forces applied to the system is governed by the Navier-Stokes equations. To numerically solve for the velocity field at different time, I implemented the robust Navier-Stokes solver described in Jos Stam's "Stable Fluid". To visualize the result, I took a snapshot of the simulation and substituted metaballs for the massless particles. The isosurfaces on the metaballs were evaluated using Lorensen and Cline's "Marching Cubes."

This is an ongoing project. I plan to enhance photorealism of the result by rendering the simulated particles with volumetric scattering. I also plan to optimize the algorithm so as to simulate systems of larger grid sizes in real-time.

report (in traditional Chinese)

A Super-Resolution Video Player

The conventional way to upscale an image is to use bilinear interpolation. However, the image will become blurry after being upscaled, since the bandwidth of signals in the image is shifted toward low frequency. In Freedman & Fattal's "Image and Video Upscaling From Local Self-Examples," the missing high-frequency signals in each upscaled image patch is approximated using the most similar patch of the original image within its local window. This approach can also be extended to apply on video upscaling, where for each patch, high spatial coherence over time effectively reduces blinking artifacts. In this project, we took advantage of data locality in their algorithm and parallelize it to run on GPU. The result is a video player which upscales VCD quality video to DVD quality on-the-fly at play time.

report | poster | video

A SIMD Accelerated Ray Caster


Rendering Fur with 3D Textures

As a short-term rendering project, I implemented Kajiya & Kay's "Rendering Fur with 3D Textures" with C++ on PBRT. In their approach, fur is represented as geometrically augmented 3D voxels from the skin which store densities of particles emitting from the pores. Pores are generated on the skin using Poisson disks sampling by rejection method. The cylindrical reflection model for fur was implemented as a modified single scattering volumn integrator.

Homography Estimation from Photographs

Though being a thoroughly studied computer vision topic, homography estimation between pairs of photographs is especially useful in creating panoramic image plates. I have implemented two homography estimators at different times in my curriculum. The first one is written in C++ using SIFT features, while the second one is written in Matlab, using Forstner corner detection and plain NCC matching. I have developed my C++ homography estimator into a complete image stitcher.

Poisson & MVC Image Blending

Human perceptions are highly sensitive to variations in signal intensity. Hence, to create plausible visual effects, working on the gradient domain of images or videos can be extremly effective. In this course project, I implemented Perez and Gangnet's "Poisson Image Editing" and Farbman et. al's "Coordinates for Instance Image Cloning" so as to generate convinceable blend of patches from multiple photographs.

Content-Aware Image Retargetting

Can we modify images to a specific aspect ratio without lossing significant contents? A solution is provided by Avidan & Shamir in "Seam Carving For Content-Aware Image Resizing." In their work, they achieved this goal by gradually removed or duplicated seams that are of the slightest gradient change, and hence being perceptually the most unnoticeable ones, from an image. Dynamic programming was exploited so as to reduce the time complexity in finding the seam to be removed. I implemented this algorithm in C++ as a course project.