Advanced graphics projects in grad school

A compilation of the projects I worked on during my Master’s at the University of Utah

3D Modelling Research

The goal of this research project is to improve the ease of 3d modelling with a different way of interaction. I have been working on this project with Benjamin Mastripolito advised by Prof Cem Yuksel since fall 2023.

The project is still in its early stages, and the only major contribution I can talk about is my implementation of sculpting using compute shaders. No vertex data is communicated between the CPU & GPU, the compute shaders directly modify the vertex buffers of the model. I’ve implemented clay brush, symmetry, and masking at the moment. More features will be added soon.

Mass-Spring System simulation

This project was built during my independent study with Prof Yin Yang. The study revolved around the use of the Alternating Direction Method of Multipliers(ADMM) solver in physics-based animation.

I implemented mass-spring systems with Newton’s method first as a reference, and then implemented the paper “Fast simulation of Mass Spring Systems”. In the following gif, the purple bunny is using newton’s method while the orange bunny uses ADMM. They are simulated with a fixed timestep of 1/30 seconds. Newton’s method takes 20 ms while ADMM take 7 ms.

Real-time Hair Rendering & Simulation

This is a project I worked on along with Benjamin & Alper.

I implemented three hair shading models:

On the physics side, we implemented The Discrete Elastic Rods model to simulate hair strands. My contributions are:


I implemented an OpenGl rasterizer in C++ as part of my coursework. The features implemented are:

  • 3D Model loading with textures
  • Blinn-Phong Shading
  • Direction & Spot Lights
  • Cubemaps
  • Reflection of cubemap
  • Planar Reflection
  • Shadow Mapping
  • Rigidbody physics

Disk Parameterization

This was the final project I chose to do for my computational geometry course, written in Python using ligbl. I implemented tutte’s embedding to parameterize a genus-0 mesh with an open boundary. Here I show how such 3D models are mapped to a 2D plane

I use this parameterization to remesh the geometry. This part is an implementation of the paper Interactive Geometry Remeshing

The area of each triangle and the curvature of the original model are used to determine where the new vertices are placed. The textures generated to guide this process are shown below.

Nerual PBR Textures

This was the final project for my Deep Learning course built using Python and PyTorch. I created 3 deep learning models to extract PBR textures from an image by modifying the resnet34 model:

  • Model that takes a lit image as input and predicts an unlit image
  • Model that takes a lit image and an unlit image as inputs to generate a normal map
  • Model that takes the same inputs as the previous model to generate a roughness map

Example inputs and results are shown below. I used mean-squared error loss to train the models due to time and resource constraints, and it did not yield good results. Looking at papers that tackle the same issues, it seems like a differential rendering setup is the way to go.