Digital Painting Program

Javascript · WebGL

As my computer graphics senior thesis, I created a lightweight, user-friendly digital painting program for artists. Inspired by programs like Procreate and Photoshop, users can mix oil-like paint on the canvas, adjust various brush and paint settings, and dynamically light and texture their painting with a 3D appearance — all in the browser.

Read the full write-up here.

Pixar Internship Projects

Maya · Houdini · Katana · Pixar proprietary tools

As a Pixar Undergraduate Program (PUP) intern, I was trained in several technical departments including effects, lighting, rigging, and shading. I completed the following projects:

  • A short film in collaboration with 8 other interns, where I worked on character model/rig/shade, lighting, and visual development

  • A Medusa model/rig/shade project

  • Peacock-themed firework FX over a scene in Coco

View projects (password required)

Mini Minecraft

C++ · OpenGL/GLSL

I worked in a team of three to develop a simplified version of Minecraft in C++.

I implemented the following components:

  • Randomized weather (rain, snow, and thunderstorm variants)

  • Raytraced sky shader

  • Day and night cycle, stars

  • Shadow mapping

  • Chunk-based terrain rendering using interleaved VBOs

  • Windy leaves and grass

  • Blinn-Phong shading, noise-based normals displacement, and UV animation for water

Mini Maya

C++ · OpenGL/GLSL

A 3D mesh editor that allows the user to transform vertices, color and triangulate faces, perform Catmull-Clark subdivision, import OBJ and JSON files, and bind the mesh to a skeleton whose joints can then be transformed. It incorporates a half-edge data structure that uses pointers to efficiently navigate the mesh.

Procedural Jellyfish Tool

Houdini · VEX · Mantra

A procedural tool and user interface that lets the user fine-tune dozens of different parameters to generate a jellyfish. The user can also scrub through a seed to quickly generate endless infinite random jellyfish variations.

Monte Carlo Path Tracer

C++ · OpenGL/GLSL

A GPU path tracer following the textbook Physically Based Rendering. It uses a global illumination lighting integrator that computes both the direct lighting and global illumination at each ray intersection sample. It also includes multiple importance sampling, environment lighting, and specular transmission and reflection BxDFs.

Physically-Based Shading Model

C++ · OpenGL/GLSL

A PBR shader that computes an approximation of the Light Transport Equation through the implementation of the following:

  • Microfacet BSDF (using Cook-Torrance and Lambertian BRDF components)

  • Diffuse and glossy (specular) irradiance maps

  • Specular image-based lighting

  • Normal and displacement mapping through the vertex shader

Stylized Game Shaders

HLSL · Unity

Procedural vertex, fragment, and post-process toon shaders involving noise algorithms for texturing. Using Unity’s URP Pipeline, I rendered depth and normal buffers to implement post-process outline detection.

FK & IK Solvers

C++

Implementations of forward kinematics, limb-based inverse kinematics, and cyclic coordinate descent (CCD) inverse kinematics using matrix calculations.

During a walk cycle, IK is used to orient the character’s feet when it walks on sloped terrain.

OpenGL Shaders

OpenGL/GLSL

Various surface and post-process shaders written in GLSL, including:

  • Blinn-Phong

  • Matcap

  • Color gradient

  • Vertex deformation

  • Gaussian blur

  • Sobel

  • Bloom

  • Worley noise-based pointillism