My development team behind The Wild West is working on a new game, and we wanted to showcase some cool custom water we worked on utilizing some creativity combined with PBR and Vertex Deformation(Skinned Meshes)
Inspired by how games such as Sea of Thieves do their water, water is all real time and deterministic, but is only updated/rendered within the camera’s viewing frustum and a set distance. Doing this correctly allows us to keep it optimized and scale on lower end devices, while keeping the illusion that the water is endless by fading seamlessly into larger, flat planes(bones near the update borders interpolate smoothly to be flat near the edges) - Flat planes are textured the same as the bone planes
Some cool features/information about the water:
Optimized(scales bone update distance to stay under 1ms per frame)
Real Time(not baked) - Allows for more randomness and different areas to have different wave parameters
Bones displaced on all axes using summed gertsner waves
Completely synced to the server other clients using @Quenty 's synced clock method
Both server and clients have a fast wave height lookup function at any given Vector2(to do things like objects bobbing in the water, underwater camera effects, etc.) - Uses an octree like system to get the bone polygons nearest to your camera then does some math to determine height based on that
Zone system that allows us to paint zones and assign different wave parameters to them(in the video you can see an island zone which is much calmer) - Storms are supported but not in this video
Water has a global wind direction which it adheres to
By doing water like this, we can have a completely endless ocean without worrying about making massive boxes of smooth terrain water.
Something I wish it’d have that I haven’t found a good way to do(mostly because there’s no way to edit surface appearance in real time) is foam. It’d make it look even better and would be pretty trivial to do , but there’s just sadly no support for it unless I want to try to generate it in real time using more bones on top of the mesh, but that could decimate performance.
I just can’t get over how lifelike that water looks, and the way you’ve implemented this is actually quite clever.
This also opens the door to having bodies of different liquids in the same world, since you’re no longer relying on smooth terrain. Absolutely fantastic, and I can’t wait to see how far we can take this concept.
Both Skinned Meshes and PBR open up so many doors for so many creative endeavors. Feels nice being able to make nicer things finally - not to mention bones can be super fast
Im not sure if you took this into account but it might look better if the waves came up onto the beach(the waves went in the direction towards the beach) cause right know it looks like they have a mind of there own.
It didn’t look right initially having the waves go up on the beach, so we currently just pin them if they’re inside of an island. We may change in the future if we can find something else that looks good
I love that this isn’t even the full implementation of PBR, and it already looks this good. As for skinned meshes / deformation, what did you use to create this effect?
Generally I avoid image-based responses in favor of descriptive text, but in this case, I’ll have to make an exception:
Outstanding work. I hope you plan to release a simplified version of this to the public (e.g. the basic wave generator + the water part), as this is instrumental to my own work. It’s the solution I’ve been looking for.
Wow! That is honestly amazing, are you considering open-sourcing the basics (i.e. the moving waves minus PBR, and all the fancy optimisations and stuff)? Something like this would change the way water is viewed in Roblox forever.
Blown away. I have always wanted to develop a game with similarities to that of Sea of Thieves. I hope what you are working gets completed for my sake. Never have I been satisfied with seafaring games on roblox.
From your vantage does Stormworks water clipping (prevention) seem possible with this custom water implementation?
Could one go so far as to snap water vertices to the faces of the hull preserving water face normals and having the interior dry? ( while also being able to reality-proof view the outside through portholes and see it’s not just being unrendered )
Wowser, that is genuinely awesome, my biggest question is how are you “scales bone update distance to stay under 2ms per frame,” I didn’t even know there was a method to detect the time it took for operations.