Unity nBody Simulation

nBody Simulation ― Solar System formation simulation written in C# (using Unity API & Compute Shaders for quadtree parallel processing).

Minecraft Style VR App

Minecraft-Style VR App ― A simple app I created to acquaint myself with VR concepts in Unity.

PBR Rocket Engine

Rocket Engine ― real-time asset I made to demonstrate PBR concepts to artists.

City Unity Render

OpenSteetMap Procedural Buidlings ― Real-time procedural building generator written in C# (using Unity API and OpenStreetMap vector data).

Mandelbrot Set

Mandelbrot Set ― Render of Mandelbrot set member cubes (using MAXScript).

Mandelbrot Set

Mandelbrot Set ― Animation showing detail refinement as iteration limit is incrementally increased. Iteration limit is a threshold at which cubes are assumed to be Mandelbrot set members (3DS Max viewport).

PBR Terrain

Procedural Temple Floor Texture Set ― Designed to modulate between 'light damage' & 'heavy damage' versions using height maps. Created to demonstrate modern art methodologies.

PBR Terrain

Procedural Temple Floor Texture Set ― Demonstration of end result. No repeat patterns or seams exist due to height modulation contributing to texture blending.

Anisotropic Shader

Stylised anisotropic highlight material ― Created for a friend's project. This was developed before Epic Games implemented intrinsic anisotropic highlights into UE4.

UE4 Vector Dispacement

Vector Displacement Material ― UE4 wave material capable of deforming a plane into any shape using vector displacement maps. Animated maps will produce animated geometry.

Mandelbrot Set in MAXScript

The Mandelbrot set is an interesting phenomenon as it encapsulates an infinite number of elements. This makes it a good candidate for a data visualisation project. It can be defined with the following expressions:

M = \begin{Bmatrix}
c \in \mathbb{C} \mid \lim_{n \to \infty} Z_n \neq \infty
&s=2 &bg=ffffff $


$latex Z_0 = c &s=2 &bg=ffffff $
$latex Z_{n+1} = Z_n^2 + c &s=2 &bg=ffffff $

I set myself this project in order to learn MAXScript. The idea was to visualise the Mandelbrot set, a 2D entity, in a 3D environment. Rather than using the convention of pixels, I thought it befitting to instead use cubes, creating an unusual depiction of this mysterious fractal.

A detailed tutorial examining the implimentation of the Mandelbrot set in MAXScript can be found on my blog here: The Mandelbrot Set (MAXScript Fractal).


Old Rocket Engine

This is one my latest projects. I intend to create a particle animation in Unreal Engine 4 of the rocket engine firing-up and ejecting exhaust fumes/flames.

I began by creating an intermediary mesh in 3DS Max, which was then converted into high and low poly meshes. Geometric detail was added to the high poly mesh in ZBrush. It also received a lick of polypaint at this point. The bulk of the texturing was then done in Substance Painter, followed by refinement carried-out in Photoshop. The low-poly mesh was unwrapped in headus UVLayout and baking was done in xNormal.


Procedural Temple Floor Texture Set

I made this texture set to experiment with DX11 realtime tesselation and height-based texture interpolation. I wanted to create a crumbling stone floor with sand slowly swalling-up the stone slabs.

I made a base mesh in 3DS Max, consisting of stone slabs repeated in a pattern. From this base mesh, I made two high poly meshes: a stone floor with light damage, and anouther with heavy damage. Damage was inflicted upon the stone slabs in both 3DS Max and ZBrush ― the former, for breaking some of the slabs into fragments, and the latter, for more subtle damage.

The texture bake in xNormal produced high quality height maps, used for DX11 tessellation and displacement, and to modulate between maps based upon height.


Queens Horror Project

This is the product of a group project for which I was project manager and technical artist in my second year of university. We were tasked with recreating a university building interior with a horror theme of our choosing applied. I worked on all materials for this projects in addition to making 33% of the total 3D assets.

This was my first exposure to a game engine. I had many responsibilities, including:

  • Coordinating a team of six’s efforts by overseeing asset production and establishing deadlines/project milestones
  • Implimentation of all assets in UDK (including, materials, positioning and composing of all assets in scene)
  • Facilitating bi-weekly meetings, and bringing into effect contingeny measures where nessesisary
  • Conveying technical concepts to the team, and demonstrating various techniques, workflows and computer graphics concepts (such as per-pixel shading and the bidirectional reflectance distribution function)
  • Acting as a quality control arbiter, requesting work to be refined where necessary
  • Technical troubleshooting and bug fixing
  • Establishing workflows and conventions for the team to follow, and speficying optimisation measures
  • Creating all level blockouts/orange boxes for quick level design prototyping, and creating the final level layout
  • Creating 33% of the game assets in the final product environment


Vector Displacement Material

This is an on-going project for a material I plan to release onto the UE4 Marketplace. The final product will be extremely realistic with foamy, rolling waves on the shore and larger waves in the deeper depths of the ocean.

So far I have developed a system capable of displacing a plane (or any 3D geometry really) according to the information in a vector displacement map (projected in world-space). The material can rotate the vector displacement map around an abitrary axis, meaning waves can propagate in any direction. In the final product, this will allow vertex colours and/or a flow map to control the wave propagation direction.

To create the crashing effect, the material pans down the vector displacement map row-by-row, interpreting it in a similar way to a flipbook texture.

In its current form, the material also has a parent-child UV system whereby the tiling of a parent UV set (world-space derived) can be specified. A series of child UV sets are then generated within the parent UV set with pseudorandom offsets and scales. This allows multiple vector displacement maps to be layered, creating a more natural effect. By scaling the parent UV set, all scale dependent variables (such as the child UV sets’ size) will be altered accordingly.