diff --git a/build_scripts/build_usd.py b/build_scripts/build_usd.py
index cfe243effb..a4bb94eee1 100644
--- a/build_scripts/build_usd.py
+++ b/build_scripts/build_usd.py
@@ -1415,7 +1415,7 @@ def InstallDraco(context, force, buildArgs):
 ############################################################
 # MaterialX
 
-MATERIALX_URL = "https://github.com/materialx/MaterialX/archive/v1.38.4.zip"
+MATERIALX_URL = "https://github.com/materialx/MaterialX/archive/v1.38.5.zip"
 
 def InstallMaterialX(context, force, buildArgs):
     with CurrentWorkingDirectory(DownloadURL(MATERIALX_URL, context, force)):
diff --git a/pxr/imaging/hdSt/materialXShaderGen.cpp b/pxr/imaging/hdSt/materialXShaderGen.cpp
index df80ff119f..e4b5f04a73 100644
--- a/pxr/imaging/hdSt/materialXShaderGen.cpp
+++ b/pxr/imaging/hdSt/materialXShaderGen.cpp
@@ -136,8 +136,7 @@ HdStMaterialXShaderGen::HdStMaterialXShaderGen(
                             "st" : mxHdInfo.defaultTexcoordName;
 
     // Register the customized version of the Surface node generator
-    registerImplementation("IM_surface_" + GlslShaderGenerator::TARGET, 
-        HdStMaterialXSurfaceNodeGen::create);
+    registerImplementation("IM_surface_genglsl", HdStMaterialXSurfaceNodeGen::create);
 }
 
 // Based on GlslShaderGenerator::generate()
@@ -273,8 +272,7 @@ HdStMaterialXShaderGen::_EmitMxFunctions(
     mx::ShaderStage& mxStage) const
 {
     // Add global constants and type definitions
-    emitLibraryInclude("stdlib/" + mx::GlslShaderGenerator::TARGET
-                       + "/lib/mx_math.glsl", mxContext, mxStage);
+    emitLibraryInclude("stdlib/genglsl/lib/mx_math.glsl", mxContext, mxStage);
     emitLine("#if NUM_LIGHTS > 0", mxStage, false);
     emitLine("#define MAX_LIGHT_SOURCES NUM_LIGHTS", mxStage, false);
     emitLine("#else", mxStage, false);
@@ -394,16 +392,24 @@ HdStMaterialXShaderGen::_EmitMxFunctions(
         emitSpecularEnvironment(mxContext, mxStage);
     }
     if (shadowing) {
-        emitLibraryInclude("pbrlib/" + mx::GlslShaderGenerator::TARGET
-                           + "/lib/mx_shadow.glsl", mxContext, mxStage);
+        emitLibraryInclude("pbrlib/genglsl/lib/mx_shadow.glsl", mxContext, mxStage);
     }
 
+#if MATERIALX_MAJOR_VERSION > 1 || \
+    (MATERIALX_MAJOR_VERSION == 1 && MATERIALX_MINOR_VERSION > 38) || \
+    (MATERIALX_MAJOR_VERSION == 1 && MATERIALX_MINOR_VERSION == 38 && MATERIALX_BUILD_VERSION > 4)
+    // MaterialX 1.38.5 changes the default transmission method to "refraction".
+    mxContext.getOptions().hwTransmissionRenderMethod = mx::TRANSMISSION_OPACITY;
+
+    // Emit transmission code
+    emitTransmissionRender(mxContext, mxStage);
+#endif
+
     // Emit directional albedo table code.
     if (mxContext.getOptions().hwDirectionalAlbedoMethod == 
             mx::HwDirectionalAlbedoMethod::DIRECTIONAL_ALBEDO_TABLE ||
         mxContext.getOptions().hwWriteAlbedoTable) {
-        emitLibraryInclude("pbrlib/" + mx::GlslShaderGenerator::TARGET
-                           + "/lib/mx_table.glsl", mxContext, mxStage);
+        emitLibraryInclude("pbrlib/genglsl/lib/mx_table.glsl", mxContext, mxStage);
         emitLineBreak(mxStage);
     }
 
@@ -421,7 +427,7 @@ HdStMaterialXShaderGen::_EmitMxFunctions(
     // Emit uv transform code globally if needed.
     if (mxContext.getOptions().hwAmbientOcclusion) {
         emitLibraryInclude(
-            "stdlib/" + mx::GlslShaderGenerator::TARGET + "/lib/" +
+            "stdlib/genglsl/lib/" +
             _tokenSubstitutions[ShaderGenerator::T_FILE_TRANSFORM_UV],
             mxContext, mxStage);
     }
@@ -490,10 +496,30 @@ HdStMaterialXShaderGen::_EmitMxSurfaceShader(
             // closure/shader nodes and need to be emitted first.
             emitFunctionCalls(mxGraph, mxContext, mxStage, mx::ShaderNode::Classification::TEXTURE);
 
+#if MATERIALX_MAJOR_VERSION == 1 &&  \
+    MATERIALX_MINOR_VERSION == 38 && \
+    MATERIALX_BUILD_VERSION <= 4
             // Emit function calls for all surface shader nodes.
             // These will internally emit their closure function calls.
             emitFunctionCalls(mxGraph, mxContext, mxStage, mx::ShaderNode::Classification::SHADER | 
                                                            mx::ShaderNode::Classification::SURFACE);
+#else
+            // Emit function calls for "root" closure/shader nodes.
+            // These will internally emit function calls for any dependent closure nodes upstream.
+            for (mx::ShaderGraphOutputSocket* socket : mxGraph.getOutputSockets())
+            {
+                if (socket->getConnection())
+                {
+                    const mx::ShaderNode* upstream = socket->getConnection()->getNode();
+                    if (upstream->getParent() == &mxGraph &&
+                        (upstream->hasClassification(mx::ShaderNode::Classification::CLOSURE) ||
+                            upstream->hasClassification(mx::ShaderNode::Classification::SHADER)))
+                    {
+                        emitFunctionCall(*upstream, mxContext, mxStage);
+                    }
+                }
+            }
+#endif
         }
         else
         {
