A dx12 river renderer using wave particles with interactive vortices.
In game industry water can be divided into two domains, ocean and river. This project focuses on river. Not too long ago, a demo of a real-time river editor was developed by graphics programmer Jean-Philippe Grenier from Ubisoft(now Unity). We think what he did was awesome and want to replicate it (as possible as we can).
Traditionally, rivers are rendered using flow maps. Flow maps are generated by fluid simulations or created by artist or even both. Flow maps are used for advection of water properties such as normal and uv. This technique can give the river a deterministic fluid look, but it fails to capture the sense of height compared with the less controlled ocean rendering techniques, which basically stack several noise functions together to generate the waves. Stacking noise functions together only works for ocean because the ocean does not flow. When you want the water both flow and have the sense of height, a new method should be used.
The new method is Wave Particles. Initially, Wave Particles were introduced into game industry by Naughty Dog for Uncharted 3 to simulate local high frequency wave of oceans. Then it was adopted and adapted to render rivers by Naughty Dog for Uncharted 4 paired with stacking technique.
The significance of the Jean-Philippe Grenier's work is that it generates flow map in real-time. That is why the user can interactively create rocks to block the river and affect the flow of river as we can see in the video. When performing advection on height and normal, previous implementations from Naughty Dog or Valve use noise and blending techniques to minimize repetition and pulsing caused by advection of a finite sized texture. But in this demo the developer used a new technique called Wave Profile Buffer to solve the repetition and pulsing.
Simple wave particle rendering.
Combine wave particle with flow map.
Update flow map in real-time.
Identify and solve the problems caused by advection of height, uv, normal. (extra features)
Milestone 1
DX12 frame work
Tessellation shader
Basic Interaction
Basic UI
Basic wave particle rendering
Milestone 2
Advanced wave particle rendering
Combine flow map with wave particle
Find some interesting flow maps
Use flow map to advect wave particle
Fluid simulation
Milestone 3
Improve rendering method
Update flow map in real-time
Create blockers (rocks and etc.)
Advect properties using simulation result
Final
Finish unfinished work
Identify the problems caused by advection of height, uv, normal
River Editor Water Simulation in Real-Time