Menu Close

Author: changsooeun

MaterialX in 3dsMax

The USD for 3ds Max 0.5 release adds full support for MaterialX to 3ds Max. You can load, import, edit, create, and export within 3ds Max using native tools.

So, what is MaterialX? According to, it is…

MaterialX is an open standard for representing rich material and look-development content in computer graphics, enabling its platform-independent description and exchange across applications and renderers.

MaterialX addresses the need for a common, open standard to represent the data values and relationships required to describe the look of a computer graphics model, including shading networks, patterns and texturing, complex nested materials and geometric assignments. To further encourage interchangeable CG look setups, MaterialX also defines a large set of standard shading and processing nodes with a precise mechanism for functional extensibility.

So, it is an open standard for material. It is a specification, an explicit set of requirements. Any renderer that follows this spec should give the same result for a MaterialX document. We could author a MaterialX material in 3dsMax/VRay, render in Maya/Arnold, and get the same result as long as we follow the spec. I’ll talk about it later again.

This update allow users to 1)Load MaterialX document 2)Render them with any renderer that supports Physical material/OSLmap(All CPU renderer and supported GPU renderer) 3) Edit the loaded material/maps 4)Author MaterialX material from scratch 5)Export as MaterialX document and 6)Export as material binding when export USD file. What do you need more than this?

Now why is MaterialX released as a part of USD for 3ds Max? This is because MaterialX is emerging as a material standard for USD. USD has UsdPreviewSurface. However, it only supports a very basic bitmap-based material tree without more advanced features such as subsurface and anisotropic specular highlights. Also, Material X has its own XML-based file format which goes along well with USD. USD loves files.

Let’s see how it actually works in 3ds Max.

Loading MaterialX

As I mentioned, MaterialX has its own file format, and the new MaterialX Material allows loading this .mtlx file.

As you can see, .mtlx file supports multiple materials in a file, and you can choose a sub-material from the dropdown.

OK, that was easy.

MaterialX Import/Export Utility(MtlXOIUtil)

Another way of bring MaterialX into 3dsMax is using the new MaterialX Import/Export Utility(MtlXOIUtil).

Press “Import MaterialX…” button and choose a .mtlx file. Then, the MaterialX materials are imported and assigned to the selected objects.

If you have not selected objects or selected less objects than materials in the file, this utility will automatically created teapots and assign the imported materials on them.

If you choose a material library file(.mat) and check “Add to Material LIbrary”, imported materials are stored in the material library. They will be imported(exploded), Physical material not MaterialX material.

“Populate Material Editor” will put imported materials in the material editor slots.

Editing MaterialX

MaterialX in 3dsMax is implemented using Physical material and OSL maps. I heard that one of the reasons for adding OSL map support to 3dsMax was actually part of the grand plan for this initiative.Therefore, you can edit MaterialX material tree just like any other 3dsMax materials/maps using CME or Slate. This also means that any third-party renderer that supports 3dsMax Physical material and OSL map will be supported automatically.

MaterialX material provides 2 ways to edit the material tree.

  • Explode Permanently – Pressing this button will convert the MaterialX material to Physical material + OSL map setup. The MaterialX file loader material will disappear from Slate and the new Plysical material will be assigned to the objects.
  • Open for Edit – Pressing this button will make a new tab with the Material node name(Not the MaterialX file name. The 3dsMax Material name) and put exploded material tree there. As you can see, the MaterialX material is still assigned to the objects(the white triangles around the corners show that). But, any changed on the material tree in the new tab will be applied to the objects.

Authoring MaterialX

If we can load and edit a MaterialX shader tree, well, that means we can make one from scratch, too. I mentioned any renderer that supports MaterialX will give us the same result for Material materials as long as we follow the spec.

MaterialX certainly can do more than bitmap-only-based PBR material. It has a bunch of Standard Library Nodes, and 3dsMax MaterialX supports them. Would this set of nodes cover all your production needs? Well, see for yourself. Here is the spec document. You will probably need to sacrifice the flexibility and features for compatibility. “Standard” always means the least common denominator. It will never be the best of all. But, When you need it, you will need it. Having good comprehensive support for such an open standard is a good thing.

Let me say it again. A material standard only works when you follow the standard exactly. Even one parameter difference in the shader tree can make totally different result. Some might want to have an automagic converter for all our 3dsMax maps and 3rd party maps. But, doing that will open a can of worms. I rather have a clear explicit way to author MaterialX when I need MaterialX.

As I mentioned, this MaterialX support is implemented by Physical material + OSL map combo. Therefore, only Physical material is supported for the material. The good thing is that most 3rd party renderers support Physical materials which means they will get MaterialX support automatically.

For maps, there are MaterialX maps category under OSL. You can find 1:1 MaterialX Standard Library Nodes here.

 Here are a few things you need to know.

  • 3dsMax “Normal Bump” can be used for MaterialX “normalmap”
  • Each data type has its own map. For instance, there are 4 “acos” maps for float, vector2, vector3, and vector4. This may seem tedious, but in my experience, it actually makes it much clearer which data type I am currently working with. If you use the wrong data type, MaterialX will simply not export those invalid trees.
  • Make sure to use “color” type for color. Never use “color” type for data. All color-type maps will be color-managed. This means you can’t load a map and use it for baseColor and Roughness. You must use 2 separate texture nodes to load one as color and another as data.
  • Bitmap material is supported. But, only the filename will be used. If you want to adjust tiling and offset, use “mx_image” or “mx_tiliedimage” maps.
  • If you want to know what each map does, check the MaterialX spec document.

This is what I made in 3dsMax using Physical material and

And loaded in QuilitiX

Hers is another good news. 3dsMax has a few specialty materials that use Physical material under the hood. If you use any of these materials, you can exported them to MaterialX.

  • PBR Material (Metal/Rough)
  • PBR Material (Spec/Gross)
  • glTF Material
  • USD Preview Surface Material.

Exporting MaterialX

You can export the new/edited materials using MaterialX Import/Export Utility(MtlXOIUtil). Just select objects with materials to export and Press “Export MaterialX”

If there are multiple materials in the selection, all those materials will be stored in a .mtlx file.

Make sure to check Maxscript LIstener for validation checks. Your material tree might not be valid. If you see warnings, you must fix them to export properly.

Integration with USD

The MaterialX plug-in comes with a Shader Writer for the 3ds Max USD Plug-in that will allow the USD export to bind references to the MaterialX files to USD Prims when exporting scenes using a MaterialX Material.

Here is a short video of MaterialX in 3dsMax in action.

csMakePreview 1.21

csMakePreview is a scripted UI of the newly improved MXS createPreview function in 3dsMax 2024. For the details, please check this post. Now it has been updated to 1.21 with a few new features including the new Mini mode.

Download csMakePreview 1.21 Here   Download csMakePreview 1.21 Application Package Here

Mini Mode

  • Press Mini Mode button to change to Mini mode.
    Mini mode status will be saved in the settings file which means it will be kept across max session.
  • Only few options are exposed in Mini mode.
    The intended workflow is making presets using full mode and use for Mini mode.
  • If you want to return to full mode, click “Mini” button.

Other new features

  • Custom resolution by pixel. Turn on the “Resolution” button and set the preview resolution as you want.
  • <version> token.
    It’ll add 3 digit padded version number.
    This value is saved for each scene file. So, you will know which version you used last time for the scene.
  • Preview path preview button
    This button will show the preview of the resolved preview path. If you press button, the preview path will be printed in the listener.
  • Open/P{lay button will be disabled then there are no files in the preview path.
    When button is disabled, the line color will be slightly darker(left).
  • Quality Override for the temporary override of ShadowMap size and Anti-Aliasing setting.
  • Play When Done moved to Settings dialog.

Other features

csMakePreview looks similar and based on 3dsMmax MakePreview. But, it has a few additional features.

  • Use Current Viewport Settings check button
    If this button is on, the current Viewport Preset/Stylem Edges Faces and Texture settings of the active viewport will be used. Basically, it will make a preview as you can see in the viewport. This is on by default.
  • The output path textbox is editable.
    You can directly type/edit in the textbox.
  • Token support!
    It supports all tokens in “Name Template”.  You can also use any global variable or global function.
    For example, you can make a  setPrefiewPath global function and set <setPrefiewPath> as path. This script will run the global function and use the result as the output path.
    Ot, If you want to add fps in the name, you can use <FrameRate>.
  • mpt4 support via ffmpeg
    You need to download ffmpeg by yourself and set the path in the Settings dialog. Eventually.
  • Ramplayer, ChaosPlayer, Custom player support.
    To use a custom player, you need to make csPlayPreview global function with 4 arguments [output path], [fps],  [start], [end].
  • Play Preview button
  • Open the preview folder button
  • Presets
    you can save/load as many as presets you want.



It seems everybody loves the new multiple image drag and drop to Slate material editor in 3dsMax 2024.1.

As I mentioned in the video. You can make own function for the new callback. Here is an example script that supports VRay, Corona, Arnold and OSL map. You can add this as a startup script folder. It will auto-detect VRay, Corona, Arnold, FStorm, Octane, Redshift and make a native image loader for each renderer. If you edit as “local useOSL = true”, it will generate OSL UberBitmap.

Here is the download Download - Updated to 1.2

Here is the code.

-- cs_sme_drop v1.1
-- by Changsoo Eun
local maxver = (maxversion())
if maxver.count > 7 and maxver[8] > 2023 and maxver[5] > 0 then (
fn cs_sme_drop test urls pos = (
if not test then (
for f in urls do (
-- Set this to true if you want OSL UberBitmap
local useOSL = false
local amap = (bitmaptexture())
amap.filename = f
if useOSL then 
amap = (osl_UberBitmap2b())
amap.filename = f
if Corona != undefined and ((classof renderers.current) == Corona) then (
amap = (CoronaBitmap())
amap.filename = f
if vray != undefined and (matchpattern (renderers.current as string) pattern:"*v_ray*") then (
amap = (vrayhdri())
amap.HDRIMapName = f
if (matchpattern (renderers.current as string) pattern:"*FStorm*") then (
amap = (FStormBitmap())
amap.filename = f
if (matchpattern (renderers.current as string) pattern:"*octane*") then (
amap = (RGB_image())
amap.filename = f
if (matchpattern (renderers.current as string) pattern:"*redshift*") then (
amap = (RS_Bitmap())
amap.tex0_filename = f
if Arnold != undefined and ((classof renderers.current) == Arnold) then (
amap = (ai_image())
amap.filename = f
if useOSL then (
pos.x += 100
pos.y += 100
) = (getFilenameFile f)
(sme.getview sme.activeview).createnode amap pos
sme.fileDropCallback = cs_sme_drop
else (
messagebox "3dssMax 2024.1+ is required"



3dsMax 2024 bring a lot of new features. Some of them are hard to show in a video. This is one of those features.

I always have wanted to have a modified version of Make Preview. For example, if you are a pipe guy at a studio, you probably would not want to give assess to the output path to artists. How about forcing some consistent studio-default options?

I have used UIAccessor in the past. I also know some studio just made their own make preview utility. But, with the update in 3dsMax 2020, I really wanted to use Max’s own Make Preview engine since it can make bigger than screen size preview.

There is a MXS command, createPreview. But, it didn’t have all the functionality of UI version. Especially, there was no way to control viewport settings. Finally, the 3dsMax 2024 createPreview function exposes every single UI option to MXS function.

So, I re-created Make Preview dialog as a script for the following reasons.

  • I wanted to check if it still misses anything compared to UI.
  • I wanted to give a template implementation for other users.
  • I wanted to add some of the features that users wanted
Download csMakePreview from here.

The added features

  • Use Current Viewport Settings checkbutton – If this button is on, the current Viewport Preset/Stylem Edges Faces and Texture settings of the active viewport will be used. Basically, it will make a preview as you can see in the viewport. This is on by default.
  • The output path textbox is editable. You can directly type/edit in the textbox.
  • Token! It supports all tokens in “Name Template”.  You can also use any global variable or global function.
    For example, you can make a  setPrefiewPath global function and set <setPrefiewPath> as path. This script will run the global function and use the result as the output path.
    Ot, If you want to add fps in the name, you can use <FrameRate>.
  • mpt4 support via ffmpeg – you need to download ffmpeg by yourself and set the path in the Settings dialog. Eventually.
  • Ramplayer, ChaosPlayer, Custom player support.
    To use a custom player, you need to make csPlayPreview global function with 4 arguments [output path], [fps],  [start], [end].
  • Set default button –  you can save default settings per user.
  • Play Preview button
  • Open the preview folder button
  • Presets – you can save/load as many as presets you want.

3dsMax Rocks

This is a full procedural setup with some of the new additions of #3dsMax in recent releases such as Array modifier, Boolean modifier and Subdivide modifier. Especially, the new OpenVDB based boolean opens up so many new possibilities.

I originally planned to release a sample pack for Boolean modifier. But, somehow this video has gotten so much response. I decide to release this scene file first.

Download here(3dsMax 2024 file)


3dsMax 2024 Highlights

3dsMax is here with tons of new features. Here are some of highlights.

#3dsMax 2024 OCIOv2 Color Management
OCIO v2 based color management is here, From image loading to rendering space, output and color picker, comprehensive color management is possible now.

#3dsMax 2024 – Boolean modifier
New MNMesh2 powered modifier-based Boolean workflow. Capture mode will embed operands into the main object. If you don’t want to embed, you can still choose to live reference. For example, for animation, you may want live reference. The UX has also been a big focus for this modifier. You will notice a lot of small but thoughtful features throughout the modifier.

#3dsMax 2024 Boolean – OpenVDB Volume Boolean
In addition to mesh boolean, OpenVDB-based volume boolean mode is added. It enables simple and easy mesh <> volume workflow. Combined with the Retopology modifier, it opens a lot of new possibilities

#3dsMax 2024 Boolean – SplitAttach
2 New boolean operationstypes. Split cut meshes by keeping Intersection and Subtraction result. Attach combines multiple objects into one without affecting their topology.
It also has improved support for booleans across multiple elements. For example, when performing a Split or Inset operation on the Boolean Modifier, these operations will be processed one at a time on each element.

#3dsMax 2024 Boolean – Topology
By nature, boolean is prone to generate bad topology. The boolean modifier has a lot of built-in clean-up code for input/output topology. This also allows more stable Boolean operations.

#3dsMax 2024 Qt Slate ME
Slate material editor ahs been Qtfied with the new look and faster performance. Now it is dockable, and the colors of UI elements are customizable.

#3dsMax 2024 Compound material/map
Allows the user to group and collect materials, maps, and node trees in a single collector that can be collapsed or expanded. Just use like anyother material/maps.

#3dsMax 2024 Material Switcher
Allow to switch among sub materials up to 9999. You can switch between multi/sub materials, too.

#3dsMax 2024 Transform List controller
Just like all other list controller. But, for transform. No need to have list controllers for position, rotation, scale separately. Also all list controller has been Qtfied and got a new index mode. The index mode allow you to simply switch between sub-controllers without weight adjusting.

#3dsMax 2024 Qt Modifier LIst
The modifier list has been Qtfied which maker it a lot faster. It also now has search filter. Scroll bar now has size Preference option.

#3dsMax 2024 Array v2
Awesome Array modifie has gotten even better with New Phyllotaxis Distribution method. It also has new Mateiral ID option and Proigressive transform option, ransform Before Projection checkbox/.

#3dsMax 2024 STLCheck/STLImport Performance Improvement
STLCheck/STLImport Performance has been improved thousands times faster. Ye, thousand times.

#3dsMax 2024 Triangulation Improvement
The improved triangular algorithm which was introduced in 2023.1 has been improved further. Now also used in Edit Poly modifier.  The following Editable Poly/Edit Poly operations now use the new triangulation algorithm – Face splitting by insertion of edges, Slice, Cut, Bridge, Vertex extrusion, Edge extrusion, Cap, Smart Extrude. Cap Holesmodifier is using this new algorithm

#3dsMax 2024 USD 0 4

SmartExtrude Toggle

Smart Extrude is awesome. But, I know sometimes you want to be not so smart.
Good news. There is a maxscript property which you can turn on/off “Smart”.

Editable_Poly and Edit_Poly has #enableEnhancedHotkeyExtrude property, and as you expect, it turns Smart Extrude on/off.

For your convenience, I made a simple macroscript. Unzip and drag and drop to a viewport. Since it is a macroscript, you can make button or assign to a hotkey or add to the quad menu and etc.

Because this is a property of Editable Poly and Edit Poly modifier, each Editable Poly/Edit Poly will remember the status.

If you want to turn off all the time, you can use DefaultParamInterface or CustomDefaultParamManager or just run the following code to set off by default.

DefaultParamInterface.SetDefaultParamValue Editable_Poly "enableEnhancedHotkeyExtrude" false persistent:true
DefaultParamInterface.SetDefaultParamValue Edit_Poly "enableEnhancedHotkeyExtrude" false persistent:true



DCM mini tutorial #2 – Transform Element

Nowadays “proceduralism” is a very hot trend. Yet many 3dsMax users don’t realize that 3dsMax has had a wide range of procedural features for decades. One of the not-so-well-known procedural features is Data Channel modifier which was introduced in 2017!.

A few days ago. I saw a question about how to make this animation on the tyFlow Facebook group. It was a perfect example of what DCM can easily do with a simple setup. Now with Array modifier, it took 5 min for me to put it together.

1. Let’s start with a box. I guess I don’t need to explain more. 🙂

2. Then, 15×15 Grid Array.

3. Then, Wave modifier. I rotated the gizmo 45 drgree.

4. Then, I applied Vol.Select. Rotate the Gizmo 45 degree again and moved out of mesh.

5. Then, animate the gizmo to select all vertex on the verts. This is frame 36.

Frame 72.

As you can expect, Ill drive the scale animation of each element with animated soft selection using Data Channel modifier. Apply Data Channel modifier.

6. Apply Data Channel modifier.

7. Click “Add Operator” button.

8. Add “Transform Elements” and “Vertex Output”

9. Transform Element modifer allow you to transform(move, rotate, scale) each element using a selected channel. For this setup, we will use soft selection channel as a driver. Set “Input Channel” as Soft Selection.

10. Set Transfrom as “Scale %(Uniform)”. Leave everything as is. It should look like the following image.

This setup means, DCM will scale each element from 0 to 100% using soft selection value 0-1. So, if the average of soft selection value of an element is 0. The element will be scale to 0. If the average is 0.5, it will be half size(50&), of the average is 1.0, it will be full size(100&).

11. Select “Vertex Output” and set Position/Replace. The Transform Element generates transformed vertex position data for each vertex and store in a vertex channel and pass down. We need to replace vertex position channel with the new vector channel to see the animation. “Vertex Output” operator is doing that,

12. If you want to make it more interesting, you can add one more Transform Elements for rotation. Make sure to right click the second Transform Element and change to “Replace” since you are adding a new separate channel. If you choose “Add”, the value will be added to the vector channel coming from the above “Transform Element”.

13. Set “Transform” to “Rotation” and set all “Max” value to 360. So, you can do a complete turn.

That’s it! So easy right?

There are a lot more you can do DCM. If you want to learn more about DCM. I collected some tutorials here.

And.. here is the scene file.