Home Unity

Are you using Unity's ORM Map? How do you adjust the Roughness values ?

I created the ORM map using Substance Painter, and I assigned the AO, Roughness, and Metallic channels to the RGB channels. However, when I plug in the ORM map in Unity, I can't achieve the desired result. There is a difference between what I see in Substance Painter's viewport and what I see in Unity, especially in the roughness values. Do you use ORM maps, and if so, what is your method? What is the correct method for transferring the roughness map of the model in Unity?

Replies

  • Eric Chadwick
    An image would help. What exactly are you seeing?

    Are you completely sure you have each of the correct ORM values in the corresponding RGB channels? It might be exporting RMA for example (rough Red, metal Green, ambientocclusion Blue)

    Also, it's best to set up the same lighting environment in both apps, like using the same HDR env map. Much easier to isolate differences.
  • DEVLiminal

     Firstly, thank you for your response

    As you can see, the Roughness details from Substance Painter are not being applied to the model in Unity. It either becomes overly shiny or the texture color becomes darker. The same issue occurs with the AO connection.

    I've tried two different ways of connecting the channels in RGBA. In the first attempt, I used R (AO), G (Roughness), B (Metallic), A (empty). In the second attempt, I applied R (AO), G (Metallic), B (empty), A (Roughness). However, the result remained the same for both methods.

    By the way, I'm using a texture resolution of 1024x1024 for the entire model. I'm using the Built-in render pipeline in Unity.
  • Eric Chadwick
    What lighting are you using in Unity? Looks really flat. Like I said, get the same lighting in both apps, to help you judge the textures.
  • Eric Chadwick
    Another way to validate your pipeline is to apply a very simple obvious test using a material ball.
  • Fabi_G
    Offline / Send Message
    Fabi_G high dynamic range
    Hi! Iirc, Unity uses smoothness instead of roughness (inverse). Are you using a custom shader which inverts the value? Painter should have a Unity preset too, if working with default shaders.
  • DEVLiminal

    I used the same HDRI lighting in both programs. In Unity, the ORM map I used applies a uniform roughness to the entire model, as if it's not receiving specific information from the map about which areas should be rougher.

  • DEVLiminal

    By the way, I'm not using any custom shaders. I haven't made any customizations on the Unity 3D Core (Built-in renderer) template. I simply placed the models in the scene and assigned materials.

    I also exported from Substance Painter using the metallicsmoothness presets and applied them to my other models using that texture set. In the metallicsmoothness preset in Substance Painter, Metallic was in the RGB channel, and Glossiness was in the Alpha channel. I changed the Alpha channel to Roughness. Is this the correct usage of metallicsmoothness?


  • Fabi_G
    Offline / Send Message
    Fabi_G high dynamic range
    Some engine use Roughness (Unreal, Blender) others Smoothness (Unity). It should be written in the documentation of the engine, but is also apparent from the parameter name. Roughness is the opposite of Smoothness.

    So with Unity using Smoothness, it's to be expected that the result you get is different/inverted Smoothness when you put in Roughness.

    Puzzeled why you modified the Painter preset, I'd expect it to work out of the box.
  • DEVLiminal
    I tried changing it according to the Unity documentation, which states, 'Use the Alpha channel of the Specular or Metallic map (depending on which of these two modes you are using) as the Smoothness value.' However, I didn't know that the Glossiness value carries the same information as Roughness and expresses the opposite... Afterwards, by setting it to 0 in Unity, it seems like I achieved the desired result in metallicsmoothness format. Now, I'll revert back to the Substance preset...
     However, I still haven't been able to solve the issue with ORM maps in models where I'll be using AO maps. 

  • Fabi_G
    Offline / Send Message
    Fabi_G high dynamic range
    When you write "ORM", I assume it's packed Occlusion, Roughness, Metallic? I think this packing is of no use for the default Unity shader. If I'm not mistaken for Occlusion it simply takes a greyscale image. Here is the page in the docu for reference:  https://docs.unity3d.com/2018.4/Documentation/Manual/StandardShaderMaterialParameters.html
     
    I mean, you could plug together your own shader using Unitys' nodebased shadergraph, defining your own parameters. But without a good understanding, it increases the chance of error.
  • DEVLiminal

    As you mentioned, I had an idea that the ORM texture set is not used with the default shader system. However, I was confused because I saw examples of asset packages using ORM maps without any shader customization. I am new to Unity, and as you said, getting into complex shader systems will likely cause errors at this stage. It would be better for me to work with the metallic smoothness workflow. I will also try using the Roughness channel on the Albedo texture by writing it to the Alpha channel for non-metallic models.

    Thank you very much for your help, I am grateful.

  • Fabi_G
    Offline / Send Message
    Fabi_G high dynamic range
    Just checked in Painter 2022, and it seems the "Unity Universal Render Pipeline (Metallic Standard)" export preset doesn't include an Occlusion map. You could copy the export preset, then add the AO map like in the screenshot (or mesh map if you just need baked AO). On a side note, I would adjust the naming to fit ones needs.


    Btw, here is the wiki page on channel packing: http://wiki.polycount.com/wiki/ChannelPacking
Sign In or Register to comment.