Game Programmer

Portfolio

 

Below are some of the games and other interactive applications I have worked on.

 

C++ Sparse Voxel Octree Raytracer - Rendering Lots Of Voxels

This is a raytracer written in C++. Through OpenCL, it uses the GPU to accelerate the raytracing. The algorithm used is sparse voxel octree raytracing. The resolution of the rendered frames is 1920x1080.

Sparse voxel octree raytracing can handle very large amounts of voxels. But it is hard to fit so many voxels in memory. So I’m using instancing and modular level design to save memory. That way, I can have scenes with a lot of voxels, but they will be stored only once and rendered multiple times. The grid size of each module is 128x128x128.


C++ Sparse Voxel Octree Raytracer - Runtime Generation

This is a raytracer written in C++. Through OpenCL, it uses the GPU to accelerate the raytracing. The algorithm used is sparse voxel octree raytracing. The octree is stored as a linear octree. The resolution of the rendered frames is 1920x1080. The voxel grid is generated using value noise.

The entire voxel grid and octree generation can be done in a highly parallel way, so they are both done on the GPU. This makes the level generation very fast, and in this video, the entire voxel grid and octree are regenerated every frame. The voxel grid size is 512x512x512.


C++ Sparse Voxel Octree Raytracer - Level Of Detail

This is a raytracer written in C++. Through OpenCL, it uses the GPU to accelerate the raytracing. The algorithm used is sparse voxel octree raytracing. The resolution of the rendered frames is 1920x1080.

Level of detail is used to fit large levels in memory and render them. The level of detail that every node is rendered at is changed based on the node’s distance from the camera.


C++ Rigid Body Physics Engine - Collision Detection

This is the collision detection and contact generation system in a rigidbody physics engine that I wrote in C++. Any convex polyhedron can be used as a physics shape. For narrow phase collision detection, the Separating Axis Test is used. For contact generation, the Sutherland-Hodgman clipping algorithm is used. The thick white lines highlight the faces participating in the collision. One of those faces is clipped using the other. The pink spheres are the vertices of the resulting clipped polygon, and hence are the points in the contact manifold.


C++ Rigid Body Physics Engine - Collision Response

This is the collision response system in a rigid body physics engine that I wrote in C++. It is an iterative, impulse based solver.


C++ Convex Mesh Raytracer

This is a raytracer written using C++ and OpenGL. The raytracing is done in a GLSL compute shader. The convex meshes are sent to the GPU as a collection of planes. A ray-convex polyhedron intersection test is then performed in the compute shader. The white cube in the middle represents the position of a point light. One shadow ray is used per pixel to determine of the point seen at that pixel is in shadow or not.


Unity Mesh Splitter

This is a runtime mesh splitting tool written for unity. It can split any convex 3D mesh.


C++/OpenGL Projects

These are some of my earlier projects. Things implemented include steering behaviors, state machines, forward shading using the Phong lighting model, pathfinding and collision detection.