Seamless, endless, and performant custom water using skinned meshes and PBR

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.

384 Likes

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.

20 Likes

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

9 Likes

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.

5 Likes

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

6 Likes

Absolute banger of a creation here

4 Likes

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?

This is fantastic. Period.

I hope your game will be as engaging as this water effect!

Keep up the good work. :+1::+1:

The sound of the water feels so natural, I can feel the sound surrounding me, it feels like virtual reality. Overall, well done!

Generally I avoid image-based responses in favor of descriptive text, but in this case, I’ll have to make an exception:

removes sunglasses

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.

19 Likes

Love it! Really looks like sea of thieves, can’t wait to see more from this upcoming game.

1 Like

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.

1 Like

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.

Woah… i love that! really hyped for the game. :wink:

Looks really good! Just curious; would you be able to show how efficient it is? would really satisfy my curiosity :sweat_smile:

4 Likes

Awesome!
Is the water a custom material?

2 Likes

can you share the asset link or something?

2 Likes

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 )

1 Like

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.

Super cool! How did you setup the bones of the mesh?

3 Likes