Export USDZ With Unlit Shader From Maya

Hello! I have the great fortune to be working on a joint Apple/(unnamed brand) app. I am teamed up with a photogrammetry vendor, and will be assembling a scene in Maya, using a UDIM workflow from retouched assets in Substance Painter. This will be for an immersive environment, similar to Joshua Tree and the Hawaiian environments on AVP, which are great.

We did a first pass, bringing USDZ files into Reality Composer Pro and sending to headset - very cool. However the models have a specular component that is washing everything out. After further researching, I learned that I need to not be using a Physically based shader, but instead, an Unlit shader. I had to manually create this in RCP, then it viewed properly. The issue is, every time I need to add a new asset, will I now have to manually create numerous custom shaders? Ideally, I am wanting to either figure out how to get an Unlit shader specified in Substance Painter that will get exported out properly, in addition to getting it to export from Maya. I tried using a Maya SurfaceShader - which is essentially unlit - but that does not export properly. I found that a Maya StandardSurface will export properly, however, it still imports as Physically Based shader. The conundrum is, I'll be working with a UDIM workflow, and would like to avoid having to manually create and hookup what could be between 10-40 textures per USDZ file.

I guess what I'm trying to ask is - what is the preferred shader to use in Maya when exporting to USDZ that will import as Unlit? Or, is there a way to easily switch from Physically Based to Unlit inside RCP? And NOT doing it in Xcode/Swift, because the files I need to deliver need to be USDZ, the the developer will be assembling themselves.

I'm using Maya because I need to work on my PC for the heavy GPU lifting, and also, it's just easier to assemble everything there VS Reality Composer Pro, which is like the iMovie of game engines. ;) (please take that constructively, it really needs to be more industry standard). I just need to make sure I can use Maya with the proper shaders to export my pieces, quickly send to RCP (with proper Unlit specification) then over to headset so I can check stuff in realtime with my photogrammetry vendor.

Any help or advice is greatly appreciated! I'm really excited to be working on my first Vision Pro app. Thx!

Answered by Graphics and Games Engineer in 801867022

Hey Steve!

So there are a few options. Though first I'd mention that UDIMs aren't supported (they're not very realtime friendly as a concept in general), you have to have a material per UDIM effectively. Though for best performances, I'd really recommend reducing your texture size and count down.

Option 1: Change it over manually

Easiest way to switch without any custom work is to export using a USDPreviewSurface (, and then in Reality Composer Pro do the following:

  1. Select your material and change the Shader from Physically Based to Shader Graph
  2. Remove the Preview Surface and hook up a Unlit surface and reconnect the nodes

Option 2: Use LookDevX in Maya

If You are using Maya, we have some MaterialX nodes that are available here https://developer.apple.com/documentation/ShaderGraph that include the Unlit. This will work in Maya if you use LookDevX to assign the shaders, and you'll find a RealityKit Unlit shader in there that'll just import in as is.

Option 3: Use a post process script in Maya or Blender, or external to your DCC

Both Maya and Blender support export chasers/hooks that let you change the exported USD during the export.

Alternatively, you could do the same to the USD with Python outside the DCC.

If you prepare a single USD file with your Unlit shader network, you could reference that into your USD files on your Material prim out of Maya and then set the texture parameters there to change what texture you need.

Though of course this does require a little bit of coding to do, but doesn't require anything more than the USD API that is available in your DCC or from pypi , so could be done on your windows machine as well.

Accepted Answer

Hey Steve!

So there are a few options. Though first I'd mention that UDIMs aren't supported (they're not very realtime friendly as a concept in general), you have to have a material per UDIM effectively. Though for best performances, I'd really recommend reducing your texture size and count down.

Option 1: Change it over manually

Easiest way to switch without any custom work is to export using a USDPreviewSurface (, and then in Reality Composer Pro do the following:

  1. Select your material and change the Shader from Physically Based to Shader Graph
  2. Remove the Preview Surface and hook up a Unlit surface and reconnect the nodes

Option 2: Use LookDevX in Maya

If You are using Maya, we have some MaterialX nodes that are available here https://developer.apple.com/documentation/ShaderGraph that include the Unlit. This will work in Maya if you use LookDevX to assign the shaders, and you'll find a RealityKit Unlit shader in there that'll just import in as is.

Option 3: Use a post process script in Maya or Blender, or external to your DCC

Both Maya and Blender support export chasers/hooks that let you change the exported USD during the export.

Alternatively, you could do the same to the USD with Python outside the DCC.

If you prepare a single USD file with your Unlit shader network, you could reference that into your USD files on your Material prim out of Maya and then set the texture parameters there to change what texture you need.

Though of course this does require a little bit of coding to do, but doesn't require anything more than the USD API that is available in your DCC or from pypi , so could be done on your windows machine as well.

Thank you for the quick reply! Regarding the UDIM workflow, do you have any suggestions for an alternative approach? I was told that the developers mentioned it would be no problem with multiple 4K maps, which these large environments need to ensure crisp textures (at least up close and within a 50-100 feet radius). I will look into the first 2 options presented immediately. Option 3 is good to be aware of, but I'd need to work with a programmer familiar enough to execute it.

Side note while I have your attention - is there any way in RCP to combine camera Orbit, Dolly and Pan into a single command assessable via Option+Right/Middle/Left mouse click, exactly similar to how Maya works? This would be a huge improvement for quick navigation. :)

I think the best approach for UDIM workflows is baking them down into a single texture set. It's usually fairly easy to do, since UDIMs just expand the UV set out, so just needs scaling back into the 0-1 space. Then Photoshop its straightforward to combine them into one texture atlas , but afaik Substance has the option on export? Its been a while.

Regarding camera controls, I don't believe there's anything like that but you should definitely file feedback.

Thx for the feedback! I should mention that I actually talked with one of my contacts at Substance 3d specifically about this. I am able to use multiple UDIMs, but keep as a single texture set. This way, I can paint over the seams of 14 hand-defined UV chunks, each with 4k baseColor maps with baked lighting. This enables me to re-project higher, 8K images from the drone and handheld Nikon footage, to make the ground texture that more detailed.

I added to my previous RCP navigation->industry standard feedback. :) Fingers crossed!

Export USDZ With Unlit Shader From Maya
 
 
Q