Home Technical Talk

Different rendering of normal map between blender and substance painter?

edit: Problem solved

Hi, I did all my textures on painter, I bake the normal map on my low from a high with bevels.
On painter everything looks good so I'm doing my textures and exporting everything.
But on blender the result is awful

I then decide to test a triangulation and the result is much better but not perfect
then I test to remake the bake of my normal map from blender and there the result is almost perfect (as good as what I saw in painter)
Then I try to import this new map in painter to see what it gives and it's as bad as the painter map in blender (after triangulation)

you can see here the minor differences between the 2 maps:

My conclusion is that the two programs do not bake in the same way and their way of baked is well rendered by their own engine but is not necessarily good elsewhere?


  • poopipe
    Offline / Send Message
    poopipe godlike master sticky
    To get a normal map to look the same in two different renderers you need to make sure you're using the same tangent basis and that there is no difference between the mesh you bake to and the mesh you apply the normal map to. If you're going through an intermediate format like FBX you must endure that you're passing tangent and binormal information across correctly

    Painter has the (possibly default) option to use mikktspace tangent basis which is pretty standard (unreal and unity use the same).  I think Blender also supports it so with the correct export/import settings you should be able to get them to match very closely

  • chopsuey
    Thank you for your answer I don't know if I understood everything I don't really understand what tangent space is but while searching i found an option on substance painter "compute tangent space per fragment" and now my exports are identical in blender.
    But I didn't touch anything in the fbx export.
    I tried also to import it in sketchfab to see and it's ok so thank you it solved my problem

  • Gorion103
    Offline / Send Message
    Gorion103 polycounter lvl 10
    Maybe You exported Normalmap in wrong format (DirectX vs OpenGL) for blender and You have to invert Y channel to render it correctly.

  • chopsuey
    Gorion103 Thanks for your answer but no that was not the problem, I export well in OpenGL, the problem is solved it was the tangent.
    There is another easier way to do this, use the rgb curves and reverse the green curve

  • gnoop
    Offline / Send Message
    gnoop polycounter
    We don't use Unreal or Unity   but last time I tried  it in both of them,   mikt or not mikt, recalculating tangents and binormals or importing them,  they  still can't render those normal map gradients perfectly ,especially on  reflective surfaces .     So IMO it 's better to get rid of shading gradients before you bake anything.    By proper smooth groups ,  vertex normals editing etc.

    Or  does Unreal  deal with normal map gradients perfectly already?     That would be a great achievement for sure?

  • poopipe
    Offline / Send Message
    poopipe godlike master sticky
    the per-fragment calculation helps but none of them are 100% perfect - precision is a legitimate issue when dealing with game assets in terms of both textures and mesh information. 

    if you throw enough data at the problem it'll go away but you can't do that cos videogames

  • AdrianoRegino
    Offline / Send Message
    AdrianoRegino polycounter lvl 6

    Nice you solved this, I´m having the same issue. Do you mind telling how did you fixed the tangents?

  • chopsuey

    Hi, In substance painter in edit>project configuration I checked an option called "compute tangent space per fragment"

    I also recommend to triangulate your 3D objects before exporting (and keep the same triangulation for all the 3D engines you want to use this texture)

    In blender I use the triangulate modifier, very practical.

Sign In or Register to comment.