maya-usd icon indicating copy to clipboard operation
maya-usd copied to clipboard

Maya USDZ Import Incorrectly Displays USD Preview Surface Material, Unable to Export Properly

Open stevetalkowski opened this issue 9 months ago • 10 comments

I am importing USDZ files generated from Substance Painter. These files have all the textures properly hooked up, and they import fine into Blender, Unreal Engine and Reality Composer Pro. I can easily view them via Quick Look in macOS, iOS and visionOS when using Apple Vision Pro headset.

When I import the file to Maya and open the Hypershade Window, all of the textures are set to sRGB, even the normal map. If I attempt to reexport this file to USDZ, the PBR doesn't work as expected.

I've been made aware that I should be using LookdevX and MaterialX for proper authoring of USD Preview Surface materials. However, I can't seem to locate the exact workflow and options to successfully export back to USDZ.

Additionally, should there be a warning/suggestion to view and edit the shader in LookdevX when importing and working with USDZ files? Is this even possible, or, does one need to create a new shader and assign prior to export?

Ideally, I want to be able to work normally in Maya, setting up the proper materials with textures, with the knoweldge and confidence that these assets are going to be exported for use with Xcode and Reality Composer Pro.

I've attached several screenshots, one showing what the Hypershade window shows upon import, and the other my first attempt at what I hope is the proper way to setup the shader in LookdevX with MaterialX. I notice there appears to be two ways to create a USD Preview Shader - one through right clicking the mtl prim and Add New Material -> MaterialX -> USD Preview Surface, and the other Add New Material -> USD -> USD Preview Surface.

Which option is the preferred, correct material to use for USDZ export? I tried exporting this version, checkmarking USD Preview Surface, MaterialX Shading, both checked, and non checked during USD Export -> Export Selection Options, and neither of them are exporting properly.

I am using Maya 2026.1 with mayaUsdPlugin 0.32.0 on Windows 11, and Maya 2026.1 on macOS Tahoe 26.0 beta.

Thx!

Image Image Image

EDIT: I forgot to mention that I am importing USDZ with defaults. Just now checking Import Options, and see there is a "Convert to:" option, which is set to Automatic. Should I be converting to USD Preview Surface?

Image

EDIT: I just tried that and it still imports with all textures set to sRGB.

My 2-part question remains - how do we:

  1. view and edit a material that was created in Substance Painter
  2. create a new, compliant material with textures from scratch in Maya for USD/USDZ export

stevetalkowski avatar Jul 21 '25 15:07 stevetalkowski

Thanks for the post. I will try to help answer your questions.

Generally speaking the goal of our team is to provide native USD editing, which means that we don't recommend a continuous import/export workflow. Instead, get the data into USD and then just work with it there. So importing the USDZ into Maya data to edit the shaders in Hypershade isn't the recommended workflow moving forward. LookdevX is where we are focusing our material workflows.

Viewing the Materials: Your best method for viewing the materials is not import the USDZ file but instead load it into a USD Stage. Do this via Create > Universal Scene Description > Stage From File. Once loaded, turn on Arnold in your viewport. Note if the USD doesn't contain lights, you may need to add a light to see the results.

Creating New Materials: To create a new material directly in USD you should use the Add New Material > MaterialX > OpenPBR Surface if you want to use the latest open standard for materials. Since this is a newer material, you may need to fall back to the Standard Surface instead of OpenPBR if your target applications don't yet support OpenPBR yet. From there, simply open that Material in LookdevX and edit from there. Some caveats are that at this stage it isn't always clear what nodes are compatible with the different data models (Arnold vs MaterialX vs USD) in the search menu, so be careful to take note of the data model at right side of the search results designating the model. If you require USD Preview Surface, then you may need again to know the limitations of your target applications--as some simpler ones may only support very basic USD Preview Surface setups--if so, stick with the USD data model.

Regarding the sRGB comment above, that may be a defect. We should be preserving the color spaces embedded in the data. We will investigate that.

wallworm avatar Jul 21 '25 19:07 wallworm

@wallworm Shawn, thanks for the quick and thorough reply.

Here's what I just tried for the Viewing Materials suggestion- i imported the known, working USDZ file exported from Substance Painter via Create > Universal Scene Description > Stage From File. Imported my goto default HDRI for verification. Hit 7 key for All Lights On. It's looking super shiny, like the roughness and metallic maps me not be rendering correctly, and the normal map (horizontal lines in the green light) are not visible in the viewport.

Image

I then select Arnold under Viewport Renderer, and it renders with the normal map properly.

Image

Naturally, I then want to go check out the shader to see what's going on. I expand the USD Stage, select M_TrafficBot > Show in LookdevX, get the message "Issues were found inside this compound"

Image

and see two error warnings indicated in red:

normalTextureShader: Port rgb: A009: Attribute should be 'float3' as defined in 'UsdUVTexture'."

Image

and:

PreviewSurface: Port diffuseColor: A009: Attribute should be 'color3f' as defined in 'UsdPreviewSurface'."

Image

It appears there is a UvPrimvarFloat2Shader connected to St on all of the textures. Do I need to make new nodes and manullay hook these up? Clicking on the textures themselves, i see the St value, but it is grayed out, showing it is, in fact, already connected to the UvPrimvarFloat2Shader note. Is this an error during the intial USDZ import?

I will next try your Creating New Material suggestion, as I will need to rebuild this shader on a file that I'm currently animating that has the same geometry and material assignment. I will post my results in the next reply. Thx!

stevetalkowski avatar Jul 21 '25 20:07 stevetalkowski

Creating New Materials: To create a new material directly in USD you should use the Add New Material > MaterialX > OpenPBR Surface

Ok, so, the file i'm animating is not a USD stage type, but just a regular Maya file. I can't figure out how to add the new MaterialX OpenPBR Surface. If I click on a piece of geometry and right click, I see Assing New Material > BXDF > OpenPBR Surface, but no mention of MaterialX. I selected that, it created a materalXStack1 in the Outliner, and i then right click on open_pbr_surface1 > show in LookdevX, and see the graph. Let me see if I can get this to work. :)

EDIT: I assume to add a texture, I use a fileTexture node? However, I am not seeing any way to actually pick a file from a file browser input anywhere. Help?

EDIT2: Ok, I searched for image and that has a Filename window. Proceeding...

Image

stevetalkowski avatar Jul 21 '25 20:07 stevetalkowski

@wallworm A bit of confusion over there. I THINK i'm setting this up properly, but my normal map isn't registering properly. I attached the node to geometry_tangent and changed the Node Type to vector3, (weird that it says Float3 in the window to the right) but i'm not seeing any indication of it in the viewport or when changing to Arnold. Hmm, i'm stuck.

If you require USD Preview Surface, then you may need again to know the limitations of your target applications--as some simpler ones may only support very basic USD Preview Surface setups--if so, stick with the USD data model.

Whatever Substance Painter was exporting, i'm able to read that over in Reality Composer Pro and on headset. I suppose i could try Standard Surface, but your suggestion for sticking with USD data model - does this mean not to use MaterialX. I'm really confused now.

Image

stevetalkowski avatar Jul 21 '25 21:07 stevetalkowski

Hi @stevetalkowski,

I agree with you on the confusion surrounding the naming. We have plans to simplify the naming, which should improve in future versions.

You can use the MaterialX nodes, but some nodes created in LookdevX might not import properly with other DCCs, for example., In the LookdevX, there are custom nodes like ADSK_Converter, ramp, etc. The converter node is autogenerated when making incompatible port connections like color3 --> Vector3. These nodes are hidden, so we might accidentally introduce them in the graph. Otherwise, using the standard_library ones and compatible connections should work correctly.

I see in the screenshot, the normalmap connections are going to geometry_tangent. Can you connect that to geometry_normal and also with the normal_map node, and see if that works for you?

I have also made a short video showing this workflow.

LookdevX_Mtlx.zip

Satyan1990 avatar Jul 22 '25 13:07 Satyan1990

Good morning @Satyan1990

Thx for the video! I didn't hear any audio, so followed along best I could. I was able to recreate, and also added my roughness and metallic textures, changing their Node Type to "float". I'm seeing the effect of the Normal map in Vieport 2.0, and it renders as expected in Arnold.

Now, here's where I need help completing the USD/USDZ export. I see that you are creating a USD Stage with New Layer. And then you Duplicate as USD Data that single piece of geometry to the StageShape1 layer and then show it now has a USD data type.

My character is comprised of 128 pieces of geometry, and bound to a skeleton, that is animated via a control rig structure. Am I supposed to Duplicate this entire heirarchy to a USD Stage in order to successfully export as a USD/USDZ file that I can send over to macOS for use with Reality Composer Pro and Xcode?

We're almost there! I just need to know how to properly export this. Thx!!

Image

stevetalkowski avatar Jul 22 '25 17:07 stevetalkowski

@stevetalkowski Sorry, there was no audio:)

USDZ export is not supported. But you can do .usda/ .usdc I would recommend using the Maya File > Export All > USD export options More info on the options can be found here https://help.autodesk.com/view/MAYAUL/2026/ENU/?guid=GUID-3A763D43-E626-4832-9824-57AAA9BC0A00

Let us know how it goes.

Satyan1990 avatar Jul 22 '25 17:07 Satyan1990

@Satyan1990 Confused, as the initial request is for proper material setup for exporting to USDZ.

As a quick test, I did try File > Export All > USD (Materials and MaterialX Shading both check on) and saved as .usdc, then tried importing to Blender, but the materials didn't make it over.

It's this one last step for successful export of the newly created MaterialX material that remains ellusive.

stevetalkowski avatar Jul 22 '25 17:07 stevetalkowski

@stevetalkowski, we could manually type the extension and export it as usdz, but it does not seem to pack the textures, which might be due to some of the known limitations at the moment. I am working on this to figure out this workflow. I will update you as soon as I have more information on this.

Satyan1990 avatar Jul 23 '25 13:07 Satyan1990

@Satyan1990 Interesting development on my end - I created a MaterialX standard surface shader in LookdevX, hooked up my maps - including a normalmap set to tangent space connected to the normal texture - exported to .USD with MaterialX checked in Materials and can actually see it saved with textures and animation in macOS finder window. When I tried importing this to Reality Composer Pro, I see the shader, however there's an error on the Standard_Surface1 node that states "Unsupported Node - Prim unsupported with info:id 'ND_standard_surface_surfaceshader', type 'Shader'.

Image

You can see that I was able to create a PreviewSurface node and attach the same textures to it, and it's rendering as expected in the RCP viewport.

I also tried exporting out as .USDC (the object is rotated 90 degrees, and the forearm geometry is broken, placed above the elbow?) and the USDA version exports with textures visible in the finder, but same error on the Standard_Surface1 node in the Shader Graph in RCP. So, it appears something is up with the actual node during export?

On a positive note - I'm digging LookdevX, especially being able to solo a texture and see it's effect, similar to how I can isolate a channel in Substance Painter.

stevetalkowski avatar Jul 24 '25 03:07 stevetalkowski