Separable Subsurface Scattering for Photo-realistic Real-Time Skin Rendering.

Originally presented in a paper by Activation-Blizzard in coordination with the University of Zaragoza and the Vienna University of Technology. The aim was to provide a method for increasing the realism of organic materials in a way that could run fast enough to be used in real-time simulations and video games.

This project involved implementing this technique using the modern Vulkan API (rather than DirectX/Direct3D) and combining it with an translucency/light transport algorithm to prove that efficient realistic run-time organic rendering is possible when using the modern tools available to game developers. The project pulls together important key elements of research from many different papers to produce the best results while keeping the solution scalable by applying it entirely in screen space. The end result runs in only 0.35 milliseconds per frame and is detailed enough to make it a perfect effect for first-person real-time scenarios.

The effect uses a pre-integrated separable filter kernel calculated using values from the Three-Layer Skin Model and runs in 2 passes each with a single 1-dimensional convolution for efficiency. The pre-integrated method can be used to estimate the diffusion of light accurately with very little run-time over-head. The translucency algorithm, based on Simon Green’s work, for calculating light transport through thin parts of the body such as ears helps to improve the quality of lighting, especially when light is behind an object.

In short, the method used in this project is fast and efficient while producing realistic results while also being parameterised in such a way to be easily tweaked by an artist.


Unity3D Shader Effects (SFAS)

This is a short clip of some shader effects  I made over a few days for the Search for a Star competition.


  • Dissolve – Uses a noise texture with an increasing intensity over time. Any fragments with an intensity over a given value is discarded, any fragments within a small range of this threshold are given a emissive colour and the rest is rendered normally.
  • Texture and Colour Transition – This is a simple distance check and swaps between 2 textures and 2 colours based on the distance from a given point in world space to the fragment position. Mixed with an attenuation factor to smooth out the edges and using the squared transition value to produce the bright wave.
  • Weighted Vertex Displacement – This checks the distance from the incoming wave and the veracities that make up the trees to push the position back as the wave passes by in the same direction as the wave. The height (y value) of each vertex is normalized between 0 and 1 (1 being the top of the tree 0 being the base), this allows the top of the tree to move more by multiplying the force by the height value. The height value is squared before use to make the tree curve having a heavier weighting the further up the tree (e.g. 1*1 = 1 [top of the tree], 0.5 * 0.5 = 0.25[middle], 0 * 0 = 0 [base]).