From f456bb97ef4649eeded9de17f846292b19516946 Mon Sep 17 00:00:00 2001 From: Jerry Gamache Date: Thu, 16 Jun 2022 09:45:04 -0400 Subject: [PATCH 1/3] Add support for MaterialX 1.38.5 while preserving compatibility with previous versions. --- .../GlslFragmentGenerator.cpp | 38 +++++++++++++++---- .../GlslFragmentGenerator.h | 2 + .../MaterialXGenOgsXml/OgsXmlGenerator.cpp | 4 +- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp index 7894015ea5..6e0189ea2e 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp @@ -171,14 +171,31 @@ ShaderPtr GlslFragmentGenerator::generate( const bool lighting = requiresLighting(graph); -#if MATERIALX_MAJOR_VERSION == 1 && MATERIALX_MINOR_VERSION == 38 && MATERIALX_BUILD_VERSION == 3 - std::string libRoot; +#if !defined(MATERIALX_NAMESPACE_BEGIN) +// Consider all older builds (that do not have version info) as being 1.38.3 +#define MX_COMBINED_VERSION 13803 #else +#define MX_COMBINED_VERSION \ + ((MATERIALX_MAJOR_VERSION * 100 * 100) + (MATERIALX_MINOR_VERSION * 100) \ + + MATERIALX_BUILD_VERSION) +#endif + +#if MX_COMBINED_VERSION == 13804 + // 1.38.4 is the only version requiring "libraries" in the path std::string libRoot = "libraries/"; +#else + // No libRoot for other versions: + std::string libRoot; +#endif + +#if MX_COMBINED_VERSION <= 13804 +#define MX_EMIT_INCLUDE emitInclude +#else +#define MX_EMIT_INCLUDE emitLibraryInclude #endif // Emit common math functions - emitInclude(libRoot + "stdlib/genglsl/lib/mx_math.glsl", context, pixelStage); + MX_EMIT_INCLUDE(libRoot + "stdlib/genglsl/lib/mx_math.glsl", context, pixelStage); emitLineBreak(pixelStage); int specularMethod = context.getOptions().hwSpecularEnvironmentMethod; @@ -202,18 +219,18 @@ ShaderPtr GlslFragmentGenerator::generate( emitLine("#define MX_NUM_FIS_SAMPLES 64", pixelStage, false); } emitLineBreak(pixelStage); - emitInclude( + MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_v3.glsl", context, pixelStage); } else if (specularMethod == SPECULAR_ENVIRONMENT_PREFILTER) { if (OgsXmlGenerator::useLightAPI() < 2) { - emitInclude( + MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_v1.glsl", context, pixelStage); } else { - emitInclude( + MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_v2.glsl", context, pixelStage); } } else if (specularMethod == SPECULAR_ENVIRONMENT_NONE) { - emitInclude( + MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_none.glsl", context, pixelStage); } else { throw ExceptionShaderGenError( @@ -224,9 +241,16 @@ ShaderPtr GlslFragmentGenerator::generate( // Set the include file to use for uv transformations, // depending on the vertical flip flag. +#if MX_COMBINED_VERSION <= 13804 _tokenSubstitutions[ShaderGenerator::T_FILE_TRANSFORM_UV] = string(libRoot + "stdlib/genglsl") + (context.getOptions().fileTextureVerticalFlip ? "/lib/mx_transform_uv_vflip.glsl" : "/lib/mx_transform_uv.glsl"); +#else + _tokenSubstitutions[ShaderGenerator::T_FILE_TRANSFORM_UV] + = (context.getOptions().fileTextureVerticalFlip ? "mx_transform_uv_vflip.glsl" + : "mx_transform_uv.glsl"); + _tokenSubstitutions[HW::T_REFRACTION_ENV] = MX_REFRACTION_SUBSTITUTION; +#endif // Add all functions for node implementations emitFunctionDefinitions(graph, context, pixelStage); diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h index 938cf78fac..d33b12e950 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h @@ -15,6 +15,8 @@ MATERIALX_NAMESPACE_BEGIN +#define MX_REFRACTION_SUBSTITUTION "(mayaGetSpecularEnvironmentNumLOD() > 0)" + namespace Stage { /// A special stage for private uniform definitions that are not included /// in the GLSL fragment but need to be known to the GLSL-to-HLSL diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/OgsXmlGenerator.cpp b/lib/mayaUsd/render/MaterialXGenOgsXml/OgsXmlGenerator.cpp index 2c3084d951..5a86c7c581 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/OgsXmlGenerator.cpp +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/OgsXmlGenerator.cpp @@ -94,6 +94,7 @@ const pugi::char_t* DIFFUSEI("diffuseI"); const pugi::char_t* ENVMATRIX("u_envMatrix"); const pugi::char_t* ENVRADIANCEMIPS("u_envRadianceMips"); const pugi::char_t* ENVRADIANCESAMPLES("u_envRadianceSamples"); +const pugi::char_t* ENVREFRACTION(MX_REFRACTION_SUBSTITUTION); const pugi::char_t* FEATURE_LEVEL("feature_level"); const pugi::char_t* FLAGS("flags"); const pugi::char_t* FRAGMENT("fragment"); @@ -141,7 +142,8 @@ const pugi::char_t* VERSION("version"); // here: bool isUnusedUniform(const std::string& name) { - return name == ENVMATRIX || name == ENVRADIANCEMIPS || name == ENVRADIANCESAMPLES; + return name == ENVMATRIX || name == ENVRADIANCEMIPS || name == ENVRADIANCESAMPLES + || name == ENVREFRACTION; } std::string DOT_COMBINE(const pugi::char_t* frag, const pugi::char_t* attr) From e1a6c65c19ee9ee2b4f541f4a765037cd6da9578 Mon Sep 17 00:00:00 2001 From: Jerry Gamache Date: Thu, 4 Aug 2022 09:43:21 -0400 Subject: [PATCH 2/3] Disable experimental transmission approximation --- .../MaterialXGenOgsXml/GlslFragmentGenerator.cpp | 13 ++++--------- .../MaterialXGenOgsXml/GlslFragmentGenerator.h | 9 +++++++++ .../render/MaterialXGenOgsXml/OgsFragment.cpp | 8 ++++++++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp index 6e0189ea2e..a7be595011 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp @@ -171,15 +171,6 @@ ShaderPtr GlslFragmentGenerator::generate( const bool lighting = requiresLighting(graph); -#if !defined(MATERIALX_NAMESPACE_BEGIN) -// Consider all older builds (that do not have version info) as being 1.38.3 -#define MX_COMBINED_VERSION 13803 -#else -#define MX_COMBINED_VERSION \ - ((MATERIALX_MAJOR_VERSION * 100 * 100) + (MATERIALX_MINOR_VERSION * 100) \ - + MATERIALX_BUILD_VERSION) -#endif - #if MX_COMBINED_VERSION == 13804 // 1.38.4 is the only version requiring "libraries" in the path std::string libRoot = "libraries/"; @@ -239,6 +230,10 @@ ShaderPtr GlslFragmentGenerator::generate( } emitLineBreak(pixelStage); +#if MX_COMBINED_VERSION >= 13805 + emitTransmissionRender(context, pixelStage); +#endif + // Set the include file to use for uv transformations, // depending on the vertical flip flag. #if MX_COMBINED_VERSION <= 13804 diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h index d33b12e950..e7a6890dd6 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h @@ -15,6 +15,15 @@ MATERIALX_NAMESPACE_BEGIN +#if !defined(MATERIALX_NAMESPACE_BEGIN) +// Consider all older builds (that do not have version info) as being 1.38.3 +#define MX_COMBINED_VERSION 13803 +#else +#define MX_COMBINED_VERSION \ + ((MATERIALX_MAJOR_VERSION * 100 * 100) + (MATERIALX_MINOR_VERSION * 100) \ + + MATERIALX_BUILD_VERSION) +#endif + #define MX_REFRACTION_SUBSTITUTION "(mayaGetSpecularEnvironmentNumLOD() > 0)" namespace Stage { diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/OgsFragment.cpp b/lib/mayaUsd/render/MaterialXGenOgsXml/OgsFragment.cpp index 796b328203..10188c0948 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/OgsFragment.cpp +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/OgsFragment.cpp @@ -128,6 +128,14 @@ class GlslGeneratorWrapperBase } } +#if MX_COMBINED_VERSION >= 13805 + // MaterialX has a new implementation of transmission as refraction in version 1.38.5, but + // does not work out of the box in Maya (probably because we only output a color). + // We will deactivate until we have time to upgrade the MaterialX output to a Maya surface + // struct where we can expose transmission values. + genOptions.hwTransmissionRenderMethod = mx::TRANSMISSION_OPACITY; +#endif + // Set to use no direct lighting if (mx::OgsXmlGenerator::useLightAPI() >= 2) { genOptions.hwMaxActiveLightSources = 0; From e2abeb8f8fda1690f3bffa97bd4e1c7d432ba803 Mon Sep 17 00:00:00 2001 From: Jerry Gamache Date: Thu, 4 Aug 2022 16:45:08 -0400 Subject: [PATCH 3/3] Improve comment clarity --- lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h index e7a6890dd6..67da77e4fe 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.h @@ -16,7 +16,8 @@ MATERIALX_NAMESPACE_BEGIN #if !defined(MATERIALX_NAMESPACE_BEGIN) -// Consider all older builds (that do not have version info) as being 1.38.3 +// The above define was introduced in MaterialX 1.38.3. If it does not exist, we know we are on an +// earlier 1.38 MaterialX version that can use the same code we use for 1.38.3 #define MX_COMBINED_VERSION 13803 #else #define MX_COMBINED_VERSION \