I think it has do with the method I use to also project the same textures on all LODs:
[Image Removed]I export each LOD section of the metahuman skin and import them to my Marking CO, then project it and import that projection back in the main CO to pass it in to all sections.
For LOD0 however, I use the EditMeshSection directly.
Initially, I tried to use EditMeshSection for all LODs, but it only works on one, even if they all have the tag. Probably because the projection needs a specific mesh.
I can use the same method I use on LOD1-7 also on LOD0, but it is very pixelated compared to EditMeshSection.
Do you have recommendation on how to do it on a metahuman face? The LOD setup makes it quite complicated…
Just as a heads up, I’m building a repro of your case using Metehuman, I’ll have an answer for this and some of your other questions as well. It’s just going to take a bit of time.
Yes, you example image doesn’t have all the information, but I believe that you’re running into issue because when the LOD is switched the base lod isn’t there and that is where the modifier is coming from.
Have you looking into GroupProjectorParameter and using the projectors pin on the GroupObject nodes? These apply a projection to whatever elements are output from the group. So you don’t need to implement LOD support or even support per mesh.
[Image Removed]The green section is the projection placement.
The blue is the parameterized data, which you can also place in a table.
I made a small repro to boil the problem down. After 5s the player should get a tattoo (BeginPlay event). Maybe that makes it easier to find the issue.
I clicked on “AddLayer”, but it seems like no layer got added, for me.
Layers are added based on the customizable instances MultilayerProjectorNumLayers. What happens when you click add layer in terms of the UI? Do you have a screenshot?
how do I control it in code? is it an Int or Enum parameter?
I’m not sure what you’re asking here exactly. When you add and modify a layer its done via a UI layer. You can see in: FCustomizableInstanceDetails::OnProjectorLayerAdded how the ui layer interfaces with the instance. Suffice to say none of this is exposed.
This currently isn’t possible through conventional means. You would need to modify UCustomizableObjectInstance::SetProjectorValueor add a new function to support that. Most likely, this is because the team typically doesn’t want people to script it, as there could be knock-on effects. I would need to ask them as I bring forth the other things.
But if you want to try, you could modify the function and add a parameter to make that adjustment.
With states, you can have something like a character creator state that disables texture streaming, and then a runtime state that leaves it on for performance.
Hey there, the error you’re getting indicates that the LOD data isn’t present. I’m verifying with the team still but I think this is a bug when using BuildOnlyFirstLOD. If you turn that off for the moment, I don’t think you’ll run into that issue again.
Hello [mention removed], thanks again for your help. The crash only occurs for me when using mesh streaming on the player character, which has indeed one state for customization with BuildOnlyFirstLOD enabled, but as NPCs are our main problem, I just disabled mesh streaming on the player character for now.
Mesh streaming seems to work now on the NPC bodies, it brought VRAM usage of body meshes down from 800MB to 170MB in the NPC village, which is a big achievement.
However, when going far away, body mesh data of 150MB are staying on the VRAM seemingly forever. Is there anything else we can do here, or do we need to solve that by destroying the actors when you go very far away so GC takes care of the meshes?
PS: groom assets are now the biggest VRAM problem, but I will open another question about that topic
However, when going far away, body mesh data of 150MB are staying on the VRAM seemingly forever. Is there anything else we can do here, or do we need to solve that by destroying the actors when you go very far away so GC takes care of the meshes?
Non-streamed mesh LODs are kept in VRam until the meshes are destroyed. So your highest LODs need to be really low-resolution to reduce that, or yes, have them destroyed.
Edit: after making the Texture Parameter Mode “Node Defined” instead of “Mutable”, the parameter shows up. however I cannot change it and it doesn’t display a tattoo.