As a Roblox developer, it is currently impossible to have a shallow terrain water ocean just for looks, where if the player goes underwater, they don’t see… another layer of the ocean?
This is where options for Terrain Vertex Culling should come in.
Devs should have the option to hide the bottom face and top face of both the start and ending of the terrain water.
If Roblox is able to address this issue, it would be nice for the use-case of a shallow ocean where only the top level of the ocean is visible to create the realistic effect of the one true ocean position. Currently, players who go under water can see the floor of the terrain water. (they could go under water with custom swim tools, I disabled automatic swimming hence why I only have a 1 voxel thick ocean)
I know this is a temporary fix, but you can use several layers of glass* @ .99 transparency to hide the waves. At low quality levels, one layer isn’t enough. For this, I used five layers.
The cargo hold is completely flooded. I could add a hatch at the top and simply provide the player a non visual way to access their cargo hold. (Using a User Interface) But with this Cargo Hold being sunk, That leaves the water occasionally appearing at the lower deck.
Since the water is a volume, with texture and fog. It’d be pretty awesome if we could get some water culling where water simply don’t show up. Maybe we could set a part as Part.DisplacesWater or Part.CullWater. And for the volume of the part water and its effects wouldn’t be visible. For more efficiency only running this behavior on mesh parts. That way we can customize shapes into a union or an imported mesh where water shouldn’t be present.
The way most games solve your issue is by combining culling, deformation and dual render.
Subnautica solves this problem by just simply being a game where underwater is the main part of the entire game. The only time you are forced to see the limit between water and air is when surfacing or entering structures. You need 2 rendering subjects. The first one is the ship’s interior, while the other includes the entire world and the outer model. When inside, you render the exterior first and overlay it with the interior. When outside, you reverse the above.