I’m making a game that has many small islands spread out across the ocean (think Sea of Thieves, or Zelda Windwaker), and want to blend objects into the ground nicely using RVTs. I am not using landscape, or world partition. What is the best/correct/most performant way to do this?
A) One huge RVT volume that spans across the entire world, that writes to a single RVT
Is this performant? I feel like I’d run into resolution issues over this huge space, and most of that space is going to be ocean that won’t be writing any data to the RVT at all. This seems like a waste (is it?)
Does Virtual Texture store anything for bits of the texture that hasn’t had anything written in them? If the answer is no, then the fact that most of the RVT is ocean/not written to might be okay?
B) One (smaller) RVT Volume and one RVT for every island.
I feel like this would give me the best resolution/memory usage, and the best performance. But how do I handle actually writing to these RVTs? For example I have a rock material that I want to read RVT data from, the rock would need to know which RVT it needs to read from, and thus means each different island would need it’s own material (instances?) that explicitly set which RVT it’s using. This seems like a workflow nightmare.
Is there any other options? Or tricks on how to do this with RVTS? Open to suggestions or advice.
My guess is that either one will work, but for what it’s worth it was mentioned in the VT livestream that Fortnite used two RVTs, one for the lobby and one for the island. No clue how true this is today.
I assume multiple RVTs is probably the more efficient of the two options, but a lot of that probably depends on how many islands you need and where they’re located.
Again just guessing but I suspect that it probably computes lower resolution mips even if they aren’t immediately visible so that it has something to display when new tiles come in, however there’s an option to pre-compute these in the editor so that they can just be streamed at runtime; From the documentation:
When an RVT covers a large world with many components, rendering to the low resolution mips of the RVT can be a slow operation. Also, in this scenario, world Actors need to be permanently resident to be available to render to low mips that represent distant parts of the world. Just keep in mind that this can be expensive for memory.
In this situation, it’s more efficient to bake and stream the low resolution mips of an RVT. The higher resolution mips can still be rendered at runtime. In this way, a single virtual texture can make the best use of both Streaming Virtual Texturing and Runtime Virtual Texturing approaches.
The option to bake them is on the RVT volume actor.
Yeah that’s not fun, you may be able to deal with this through some editor scripting… not sure how Epic dealt with it on Fortnite.