Next update is done! There were some things that came up, so I didn’t have as much to work on things as I usually do, but even so, there were still some important things that happened. I was actually going to do the update last week, saying how I had done some testing and decided to go with the Unreal landscape for the ground, since it seemed to be almost the same FPS as my own landscape, but then I tested the game on another computer, and decided I better do even more testing of things :). So long story short, I’m actually going to go with my own landscape using Static Meshes, but I’m doing it differently than I was before. If it is helpful to anyone, here are the results of some of the testing I did that made me decide to go with my own landscape, and how I created it. I also didn’t update the builds this time since there isn’t really anything new to see yet.
For the first test, I tried out using the landscape that can be made in Unreal using a Heightmap, and also tried using the new things that Epic had added to it since I last tried it. With that I was getting about 73 Frames Per Second, with everything on the highest settings and only having the landscape in the scene, which is about the same as what i was getting with my own landscape made in blender and imported into Unreal as separate models. Both were being limited from going any faster by the “Game” thread part of Unreal’s rendering.
After that test I had thought that, since they were about the same FPS and it would be easier to work with in the end ,I might as well go with Unreal’s landscape. So after getting all of that done, and being just about ready to do an update, I then tested it on another computer that had a weaker GPU, but this time I got quite a large difference between my landscape and the Unreal landscape, where my own landscape was about 10 Frames Per Second better, I think it was. The thing about this though was that it was being limited by the “Draw” part of Unreal’s rendering, which is the part that gets all of the objects and various other things ready to send to the GPU. So if you’re being limited by that, it would partially have something to do with the amount of objects in the scene, which was true with the tests I did because the Unreal landscape had about 200 separate pieces to render, while mine had only 80 some, as well as a smaller triangle count. That gave me an idea that maybe if I did really large tiles, and only had maybe fifty of them, I could get even better performance than either option. So here is how I set things up in Blender. First I made one square tile that was subdivided a little bit just to give a bit of geometry to work with for vertex groups and things like that:
Then I made a grid of 48 of these tiles altogether that are about 1.2 Km on each side. With that, there is also the actual model that is being sculpted on, to create the landscape:
Then each of the 48 tiles are heavily subdivided even more and projected onto the sculpted landscape using a modifier that doesn’t ever get applied, so if there are any changes to the sculpted model, it will automatically update on the tiles… You can see the faint outline of the tiles in this image:
Doing it this way it picks up all the details of the landscape, but everything is still in a nice grid that will fit together with each other, and I can push and pull around the sculpted landscape without the actual grid of squares being moved around. After it’s projected, a decimate modifier is used to bring the polycount down, but still keep the shape of the landscape. Finally, there is a Data Transfer modifier that just transfers the vertex normals from the landscape to the very edge vertices of the tiles. This makes it so there isn’t any visible seam between the tiles. Altogether, the whole process is completely non-destructive and updates automatically with any changes made in the landscape sculpt, since only modifiers are used to change anything. Here are the different settings used:
So now I have 48 tiles altogether in Unreal with all the quality settings set to maximum, and the results of testing them on the computer with the lesser GPU are that I get 48 FPS with being limited by the GPU at about 21 milliseconds for each frame, with only the 48 tiles in the scene, which is a little better than what I had with my previously made landscape. Then with only the Unreal landscape in the scene, I got 33 FPS and about 30ms on the GPU thread.
On the other computer that has a better GPU, I get about 83 FPS with the tiles, while being limited by the Game thread at about 11.5ms per frame. Then with the Unreal landscape, it’s still at about 73 FPS, while still being limited by the Game thread at about 12ms. So the grid of tiles ended up being about 10 frames per second better with that computer, and about 15 with the other one! I’m not actually sure why it helped so much on the better computer, since as far as I know, the “Game” thread doesn’t have anything to do with rendering models, but for some reason it really helped quite a bit.
So in the end, I decided that it would probably be best to go with the custom made tile grid. Even though it is going to be more difficult to work with, I think the extra FPS you get from it are worth it, and I’ll be able to use those extra frames to add other things that you notice a lot more. So that’s a little summary of the whole setup and how things turned out with it.
A couple other ideas I tested and got working are that, irrelevant of which landscape I’m using, I think I’m going to try using a separate model for both the stream beds and the paths, instead of trying to do the texturing for those as part of the landscape. The main reason for doing it with the streams is that they can be quite different from each other with how sharp the edges are. Like with this picture of a meadow, the edges go straight down, which can’t really be done with just the landscape, but can be done when using a separate mesh:
The other reason for doing it with both the path and the streams is that there can be a lot of variety with how the textures look, and it seems like it would be quite boring if it was all the same texture throughout the level. The problem is that if I was doing it with just the landscape, I wouldn’t be able to add very many textures, since you’re limited to only 11 textures in a material, and I need to use the textures for other things. I’ll be using texture atlases as well, but I would still run into that 11 texture limit. So doing it this way, I’ll really have a lot of freedom to do lots of different textures for the paths and the stream beds, while also freeing up space on the main landscape for other textures and things.
To actually do it, all it takes is just creating another more rectangular grid model in Blender. Then you can create a bezier curve as a way to place the grid onto the landscape, by adding a curve modifier on the rectangular grid . After that, you just project the vertices of the rectangular grid onto the landscape, like I did with the 48 tiles, to make sure it follows the landscape in the up and down direction. As the last thing, I then just used the Data Transfer modifier again to transfer the vertex normals from the landscape onto the edges of the path or stream model, which makes the shading seamless between the transition. Here are the settings for the path. The stream is pretty much the same. I also added a decimate modifier, but I’m not sure if I’m going to keep that:
Then on the edges, I’ll just use vertex colors with the height textures I’ll be making later to blend between the landscape and the path mesh, using transparency to do the blending. In the end, it will look and be almost the same as if I was blending between two different textures using only the Unreal landscape. I’ll still have a little bit of work to do when I make the final meshes to make sure the landscape doesn’t intersect it, but here is how the basic idea works out in Unreal:
Something else I did on this update is I separated out the large rock features from the landscape grid of tiles. The main reason for doing this is, since I’m projecting the tiles on to the landscape only in the up and down direction, I can’t have any overhangs in order to do that. I also wouldn’t be able to have them with the Unreal landscape either, since you have to bake a Heightmap in order to create the landscape in Unreal. So they are separated now and will be ready to eventually create into final cliff faces and such. Here are some images of how that turned out:
Only the landscape without Rock Features:
Landscape with Rock Features:
I also figured out how to get the transition between the landscape and the top of the rock features pretty much unnoticeable. There are a few that will need more work, but I’ll work on those when I’m working on the final models. For most of them, you really can’t tell at all:
One last thing on this update is I also, almost, got another lower Aspen bark piece sculpted:
Something I wanted to show on the previous update, but didn’t have room to show, was all the trees shown together in Blender, since I think all the types of trees are done now, and it’s just working on variants next. So here is one of each size of tree all finished, with wireframes:
Another thing from the last update is a little bit about applying the leaves to the trees. In the end, I found the best way to do it was to create a bunch of small branches and bake those into a texture atlas. Then after putting the texture on planes, or maybe a plane and a few triangles that could change the shape a bit, I used them as almost kitbash pieces to create a large branch that looked good at all angles. Afterwards the large branch can be duplicated over and over again onto the tree using an instanced, or linked, model. Doing it this way, you can create nicely detailed branches, but you only have to create a few of them, and if you need to change something on one of them, all the duplicates update as well. Here are some screenshots of the large branches I made for the medium sized tree with a height between the saplings and the full grown trees:
One last thing is I also got the explanation of how the seasons work to the point of starting to explain how to create the Unreal materials to create the final effect. So slowly but surely, it will be done eventually
The main things I’ll be doing for the next update are creating the texture for the landscape to use under the aspen trees, making the flat plane mesh and textures to use as the last LOD for the Aspens, and also then putting the trees on the whole landscape. After that, I should be able to start adding small details and fleshing out the game world much more. So that will certainly be exciting!