Workflow for converting entire 3ds Max scenes

I recently spent a couple weeks figuring out how best to convert an entire 3ds Max scene into the Unreal Engine. The scene in question had already been 100 percent completed in 3ds Max using Physical Materials and Arnold lights and I had already rendered final images using the Arnold renderer.

I couldn’t really find good resources for bringing an entire scene over and I had to figure out the nuances of the messy Datasmith import and manual conversion process. So I figured I would share my experience and discoveries here in case anyone else was facing the same challenges.

I was not using any raytracing in Unreal because my hardware does not support it, so that meant that I would never get a perfect match to my 3ds Max Arnold renders, but in the end I did get very close.

I will not focus on GI quality or Post Processing here, as those are normal things that any Unreal project would have to deal with. I just want to share the steps necessary after the Datasmith import. So here it goes:

Materials
Most textures will import with sRGB enabled, whether it was enabled in 3ds Max or not open each texture and disable sRGB if necessary
Some textures may import with RGBCurve set to .454545 open each texture and change RGBCurve to 1 if necessary
Assume that no materials have imported correctly the easiest way to correct the materials is to rebuild them by deleting all Texture Sample nodes created by the Datasmith import and dragging in new Texture Sample nodes (this must be done after the sRGB setting has been corrected on all necessary textures)
displacement objects must have a reasonable amount of segments in 3ds max, no amount of tessellation will make a large single poly wall look correct with displacement (unlike in 3ds Max, where you can get away with that)
delete the Desaturation node created by the Datasmith import and reconnect the necessary nodes
the Const B value in the 2nd Multiply node created by the Datasmith import is height in cm (this is the equivalent of the 3ds Max Displacement value, but the units might need to be converted)
unlit card material change Shading Model to Unlit
connect the albedo texture to Emissive and not Base Color
emissive material if the material is used exclusively for a completely emissive object with no other surface, change Shading Model to Unlit
connect the emissive texture to a Multiply node and multiply it by a constant to increase the emission (I found 10 was a good starting value)
select all objects with this material and change these settings:
[INDENT=2]Lighting[/INDENT]
[INDENT=3]Lightmass Settings[/INDENT]
[INDENT=4]enable Use Emissive for Static Lighting
change Emissive Boost (I found 10 was a good starting value)[/INDENT]
anisotropic material make sure Use anisotropic BRDF (Beta) is enabled in Project Settings
connect a constant to the Anisotropy node
a negative value creates vertical reflections, a positive value creates horizontal reflections
sub surface scattering material change Shading Model to Subsurface
connect the albedo texture to Base Color and Subsurface Color
connect a constant to Opacity and change this for the desired look (I found .1 was a good value, but was never able to fully recreate what I was seeing in 3ds Max)
material with clear coat change Shading Model to Clear Coat
connect a constant to Clear Coat (use the same value as the 3ds Max material)
connect a constant to Clear Coat Roughness (use the same value as the 3ds Max material)
glass material I did not have a specific need for glass in my scene, but this tutorial looked like it would be helpful: Unreal Engine 4 Tutorial: Glass Material (english) - YouTube
fabric material I did not have a specific need for fabric in my scene, but this tutorial looked like it would be helpful: Creating a Curtain Material in Unreal Engine 4 - YouTube
Lighting
The Arnold lights imported through Datasmith showed up as some weird hybrid type of light. I’m not sure if Photometric lights in 3ds Max would have imported better. I simply deleted all the imported lights and created new Stationary lights positioned in the same places only 4 Stationary lights can overlap if they have Cast Shadows enabled, so some may need shadows turned off or be replaced with Static lights (which do not look quite as good, but may be fine)
enabling Use Area Shadows for Stationary Light in the Lightmass settings for each light appeared to get more realistic shadows that look closer to what I am used to in 3ds Max
hdri
The HDRi skydome and lighting will not be imported at all via Datsmith create HDRI Backdrop with the HDRi texture selected in the Cubemap
This will be extremely low resolution by default, so change these texture settings: Compression
[INDENT=2]change Compression Settings to HDR (RGB, no sRGB)
change Maximum Texture Size to 2048 (unfortunately this is the maximum, so my HDRi always looked a little soft)[/INDENT]
Level of Detail
[INDENT=2]change Mip Gen Settings to NoMipmaps[/INDENT]
Sun sources in the HDRi will not cast direct light (although it is possible raytracing may allow this) create a Stationary Directional Light rotated to match the sun placement in the HDRi
Reflections
It was impossible to recreate realistic reflections from 3ds Max without having raytraced reflections in Unreal, but here was my strategy for faking reflections to look good enough create multiple Sphere Reflection Captures to cover the entire environment
create a Planar Reflection for each flat glossy surface
[INDENT=2]resize the X and Y scale to cover only the area of the object, but Z scale must stay at 1
here are settings I changed on each Planar Reflection object:[/INDENT]
[INDENT=3]Planar Reflection[/INDENT]
[INDENT=4]change Normal Distortion Strength to 150
change Prefilter Roughness to .03
change Prefilter Roughness to 200
change Screen Percentage to 100
change Extra FOV to 5[/INDENT]

I’ve been having many of the issues you outline in this thorough post. Thanks for all the info.

I’d love to find a piece of code that would set all texture RGBCurves to 1.0. I’m doing it one by one and with 230 of them it takes a long time. I have some curves at 0.2, some at 0.4545 and a few at 1.0.