The material is a basic landscape material with 3 layers. The only change I’ve really made is to alter the mapping scale of the landscape coordinates node, everything else is quite standard… just 3 layers with diffuse maps and textures, all pulled from the mobile starter content.
Sorry for the delay, I’ve been away from my computer for a few days.
Yes, there is a warning in the build log when launching on Android. It says cannot compile the landscape material for ES2, will display default material instead.
Here are some material screenshots. Note that the textures are the grass, gravel and rock textures from the starter content. Everything else is standard, other than my LandscpeCoords node which has a mapping scale of 5 applied (as shown in second image)
I wonder if you’re hitting the ES2 texture limit (it’s only 8 ). You have 6 textures in your material, the landscape will need one for weights, and I believe static lighting uses another. If I’m forgetting another somewhere then that would put you over the limit.
Does it say why it failed to compile?
EDIT: The docs say you can only use 5 textures on mobile, so having 6 in your material is probably the issue.
Setting your “layer blend” node’s preview weights to 1.0 for the first layer and 0.01 for the others (this will force all layers to be included in the material).
Pressing the “mobile stats” button on the right of the material editor toolbar.
This should try and compile the material for ES2 immediately and should tell you what the compile error is. If it compiles fine but is using all 8 samplers, then remember that landscape uses one extra for weights that the material editor might not know about.
I have asked about the number of textures used by lighting on mobile and it seems to be worse than I thought: It seems to be two for lighting and two for shadowing, 4 total. With the landscape requiring one for weights, that only leaves 3 textures for the user material under ES2 O.o
You can free one of the shadow texture samplers by going to Project Settings → Engine → Rendering → Mobile and disabling “Enable Combined Static and CSM Shadowing”.
I have been told we are working on ES3 support for an upcoming release, which would allow 16 textures. You would be able to use a feature level switch to remove some of the textures from your material for ES2-only devices (e.g. the normal maps) if you still need to support ES2-only devices, but the vast majority of modern mobile devices are capable of ES3.
Thanks for the answers Gareth.
I tried number 1 above, but this had no effect. Also, I had already tried number 2, but the mobile stats console reports no errors or warnings. It just says that I’m using 6 out of 8 texture samplers available for ES2
So that just left the final solution of reducing my textures to 3 total, which worked, but I guess is not the ideal solution.
It’s good to know that ES3 will fix this. In the meantime, it might be nice if the mobile preview reflected the actual performance of landscape materials on es2 devices… Would be much easier to debug. Would also be nice if there was a warning when compiling the material, that would save even more time!
Even when it use texture with the inputs or even texture atlases so to have only 3 base color textures and all other set to none. Even then it cannot paint more than 3 layers on each landscape component…
Which could only work if i subdivided the landscape = add more components which i can add more paint detail but this made the performance laggy…
Is there any solution to this? Or we are capped and we should use meshes to overcome this limitation?
Need some time AndrewHurley when i get to my PC i will. As i remember i was stuck on 3 layers per component, even if those layers where just 3 vector color nodes. Also didnt tested on mobile since i couldnt get any result on ES2 Preview. But i will try to screenshot my mats [ its been a while since i tried it]
I had the same issue with a different set up, I used material functions for each layer, and only one of the landscape materials was giving me the same problem, I just removed the specular value and added it as a constant. I connected the material function through a material function call that went into a break material, and from that I connected each value to the layer blend, everything with a weight value of 1. The material function has to connect to a make material before reaching the output.