The following is a collection of ongoing small projects to explore shader techniques in various use-cases. The majority of these are not from any particular individual project and are one-offs.
Exploration with mirror surface properties. Initially, reflections were handled by simply outputting the rendered fragments directly to the surface, which was fine for perfectly reflective surfaces but unsatisfying for anything grimy or distorting. By instead piping the mirror render result into a standard surface-defined shader in the emission channel and adding distortion and blur based on the normal and roughness maps, a significantly more realistic and flexible end result was achieved.
Wheat, initially designed for Aether. This wheat system was initially designed to be a geometry shader, but it wasn't performant enough for the size of the scene and doubled computation speed while using Virtual Reality or other binocular rendering.
I then attempted to use Unity's Graphics.RenderMeshIndirect instead, but that didn't allow for flexibility or dynamic movement. Finally I decided to allocate a buffer on the GPU that stayed on the GPU, and then modified it with a compute shader that executed indirectly with no CPU callbacks. This method allowed me to generate 5 million individual instances of wheat that were fully dynamic at extremely low performance cost.
I then attempted to use Unity's Graphics.RenderMeshIndirect instead, but that didn't allow for flexibility or dynamic movement. Finally I decided to allocate a buffer on the GPU that stayed on the GPU, and then modified it with a compute shader that executed indirectly with no CPU callbacks. This method allowed me to generate 5 million individual instances of wheat that were fully dynamic at extremely low performance cost.
Particle simulation in the game engine I developed, Lithic. Seen here are 7 million particles experiencing force from a field of Fractal Brownian motion, maintaining a steady 120 fps. This is a notable benchmark, as the laptop the simulation was executing on had only integrated graphics.
Dithering shader in Unity 5, designed to hit a certain graphical style requested by another developer on a server I was on. He couldn't figure out how to make a dithering shader that would look good at all resolutions and execute in WebGL, so I offered a hand. Ultimately very simple, it samples 1-bit bitmap textures packed into gpu memory for extremely fast results on all devices.
Volumetric cloud rendering, using a modification of the "Metaballs" algorithm. This allows for clouds and other visual effects that are random and look real, while still retaining customizability. This would allow developers to place semi-fixed cloud shapes into their games. Notably, this saves a massive amount on performance as only the fragments on-screen that are within the metaballs execute the cloud shader, saving up to 90% of rendering time that would otherwise be wasted. Light simulations are done with heuristic raymarching, and rather than generate noise on-gpu it is precomputed and tiled to render faster at runtime for mobile devices.
Jumbotron shader, allowing for extremely massive displays that show a clear image but that resolve to individual pixel fragments when viewed up close. Initially a shader, ultimately achieved for no extra computation overhead with the use of mip maps
Early exploration into unity's HDRP system, before they added volumetric rendering as a native feature. In this case, I used it to render incense floating up into a lamp to add a focal point to a scene.