Here is a selection of my previous work and contributions related to graphics, physics, game engine, and other areas of programming.
Virtual Reality City Simulation (2018) - currently in progress
For my MSc dissertation project, I am currently using the Unity game engine to build an explorable city environment which can be experienced in VR using Oculus Rift or HTC Vive. The goal of the project is to explore the feasibility of utilising these technologies as part of psychiatric therapy.
The user will be able to explore the environment by walking or using simulated public transport, and will encounter various scenarios which they will be able to respond to in a number of ways.
More details will be available when the project is completed.
OpenGL Graphics Demo (2017)
This graphics demo was written using a custom engine in C++, and demonstrates a number of interesting rendering techniques across three example scenes. It was developed as a coursework submission for the Advanced Graphics for Games module of my MSc in Games Engineering.
- Screen-space Ambient Occlusion (with Gaussian Blur)
- Deferred rendering pipeline with G-buffer
- Normal (“bump”) mapping
- Runtime heightmap generation from image file (Scene 1)
- Multitexturing with texture selection map (oasis grass in Scene 1)
- Distance-based fog (Scenes 1 and 2)
- Phong shading
- Omni-directional shadow mapping using cubemaps
- Multiple lights (moon and firefly in Scene 2)
- Dynamic environment map to reflect surrounding objects (Scene 3)
- Tessellation with heightmap (walls in Scene 3)
- Scene graph with transparency sorting and frustum culling
- GUI (using Dear ImGUI) for showing debug info about frustum culling, camera, FPS, and for controlling effects
- Cross-platform support by using SDL and OpenGL
Stunt Track Racer (2017)
The objective is simple - complete the circuit by reaching all the checkpoints before the time runs out. If you fall off the track, you can reset to the previous checkpoint, BUT it will cost you 10 seconds!
The game features:
- A custom game engine written from scratch in C++
- Cross-platform support by using SDL and OpenGL
- Sophisticated vehicle physics using Bullet
- Custom “zone”-based memory allocation and management (à la the Doom and Quake engines)
- Data-driven track, car, and asset loading by means of parsing YAML (.yml) files
- Semi-automated track geometry generation by using control points loaded from data files to create Catmull-Rom splines
Screen-Space Ambient Occlusion (2017)
For my final year BSc dissertation project, I chose to implement an advanced graphics rendering technique called Screen-Space Ambient Occlusion, or SSAO. This technique allows one to add realtime soft shadows to a 3D scene as a fast post-processing stage within a deferred rendering pipeline.
The aim of the project was to evaluate the performance of the algorithm, both in terms of efficiency and visual appearance. The Crytek Sponza was chosen as a test scene, and a cross-platform engine was developed as a test bench for the algorithm. SDL was used to ease porting between Windows and Android.
The software project features:
- A 4-stage deferred rendering pipeline for OpenGL 3.x and OpenGL ES 3.x
- Frames-per-second counter
- Configurable number of SSAO samples
- Ability to enable/disable blurring stage
- Ability to examine the “G-buffer” to visualise the different stages of the pipeline
This project was very interesting as it gave me experience of leveraging framebuffer objects and “render-to-texture” to implement post-processing effects. It was also nice to see that SSAO is feasible on mobile GPUs in 2017; 10 years ago SSAO was just becoming a possibiliy on desktop PC GPUs.
Contributions to other projects
MilkyTracker is a cross-platform music creation tool based around the .XM (eXtended Module) format. Developed as a clone of FastTracker II for MS-DOS, which gained popularity in the 1990s within the games industry and the demoscene, MilkyTracker has become a go-to tool for musicians aiming to achieve a “retro” or “chiptune” sound.
My involvement with the project began in 2014, when I contributed a reworked port of the program for macOS based around modern APIs (“Cocoa”). Originally, MilkyTracker’s Macintosh port was based around “Carbon”, a depracated legacy compatibility layer intended as a stop-gap solution for bringing apps from MacOS 9.x to Mac OS X. A more modern port of MilkyTracker based around OpenGL and Cocoa meant that tighter integration with modern macOS features could be achieved.
I now make fairly regular contributions as co-maintainer of the project.
Some of my previous contributions include:
- Replacing the old Automake build system with a new cross-platform CMake-based one.
- Setting up Travis and AppVeyor continuous integration for the project to cover the three major ports (Windows, macOS, Linux).
- Bugfixes to the Mac Core Audio sound driver.
- Implementation of miscellaneous feature requests and addressing bug reports.
- Reworking the old website to use GitHub Pages and Jekyll for easier maintenance.