Skip to content

Commit f3b37ff

Browse files
authored
Merge pull request #3957 from kpolonski-atomic/dev
Add option to fallback to mayaDefaultStandardSurface shader fragment
2 parents e549a67 + 3db2589 commit f3b37ff

File tree

11 files changed

+1381
-28
lines changed

11 files changed

+1381
-28
lines changed

lib/mayaUsd/render/vp2RenderDelegate/material.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ TF_DEFINE_PRIVATE_TOKENS(
215215
(Float3ToFloatX)
216216
(Float3ToFloatY)
217217
(Float3ToFloatZ)
218+
(FloatToFloat3)
218219

219220
// When using OCIO from Maya:
220221
(Maya_OCIO_)

lib/mayaUsd/render/vp2RenderDelegate/renderDelegate.cpp

+51-15
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@
3636
#include <pxr/imaging/hd/rprim.h>
3737
#include <pxr/imaging/hd/tokens.h>
3838

39+
#include <maya/MGlobal.h>
3940
#include <maya/MProfiler.h>
41+
#include <maya/MString.h>
42+
#include <maya/MStringArray.h>
4043

4144
#include <tbb/spin_rw_mutex.h>
4245

@@ -49,6 +52,11 @@ TF_DEFINE_ENV_SETTING(
4952
false,
5053
"This env tells the viewport to only draw glslfx UsdPreviewSurface shading networks.");
5154

55+
TF_DEFINE_ENV_SETTING(
56+
MAYAUSD_VP2_USE_LAMBERT_FALLBACK,
57+
false,
58+
"This env flag allows forcing the fallback shaders to the legacy lambert shader fragments.");
59+
5260
namespace {
5361

5462
/*! \brief List of supported Rprims by VP2 render delegate
@@ -85,6 +93,18 @@ const MString kPointSizeParameterName = "pointSize"; //!< Shader parameter
8593
const MString kCurveBasisParameterName = "curveBasis"; //!< Shader parameter name
8694
const MString kStructOutputName = "outSurfaceFinal"; //!< Output struct name of the fallback shader
8795

96+
//! Returns a boolean of whether or not we want the standardSurface shader fragment graph fallbacks
97+
bool WantStandardSurfaceFallback()
98+
{
99+
bool useStandardSurface
100+
= (MGlobal::executeCommandStringResult("defaultShaderName()") != "lambert1");
101+
if (TfGetEnvSetting(MAYAUSD_VP2_USE_LAMBERT_FALLBACK)) {
102+
// Explicit request for legacy Lambert:
103+
useStandardSurface = false;
104+
}
105+
return useStandardSurface;
106+
}
107+
88108
//! Enum class for fallback shader types
89109
enum class FallbackShaderType
90110
{
@@ -100,19 +120,6 @@ enum class FallbackShaderType
100120
//! Total number of fallback shader types
101121
constexpr size_t FallbackShaderTypeCount = static_cast<size_t>(FallbackShaderType::kCount);
102122

103-
//! Array of constant-color shader fragment names indexed by FallbackShaderType
104-
const MString _fallbackShaderNames[] = { "FallbackShader",
105-
"BasisCurvesLinearFallbackShader",
106-
"BasisCurvesCubicFallbackShader",
107-
"BasisCurvesCubicFallbackShader",
108-
"BasisCurvesCubicFallbackShader",
109-
"PointsFallbackShader" };
110-
111-
//! Array of varying-color shader fragment names indexed by FallbackShaderType
112-
const MString _cpvFallbackShaderNames[]
113-
= { "FallbackCPVShader", "BasisCurvesLinearCPVShader", "BasisCurvesCubicCPVShader",
114-
"BasisCurvesCubicCPVShader", "BasisCurvesCubicCPVShader", "PointsFallbackCPVShader" };
115-
116123
//! "curveBasis" parameter values for three different cubic curves
117124
const std::unordered_map<FallbackShaderType, int> _curveBasisParameterValueMapping
118125
= { { FallbackShaderType::kBasisCurvesCubicBezier, 0 },
@@ -177,14 +184,33 @@ class MShaderCache final
177184
if (_isInitialized)
178185
return;
179186

187+
_useStandardSurface = WantStandardSurfaceFallback();
188+
189+
_fallbackShaderNames.append(
190+
_useStandardSurface ? "FallbackShaderStandardSurface" : "FallbackShader");
191+
_fallbackShaderNames.append("BasisCurvesLinearFallbackShader");
192+
_fallbackShaderNames.append("BasisCurvesCubicFallbackShader");
193+
_fallbackShaderNames.append("BasisCurvesCubicFallbackShader");
194+
_fallbackShaderNames.append("BasisCurvesCubicFallbackShader");
195+
_fallbackShaderNames.append("PointsFallbackShader");
196+
197+
_cpvFallbackShaderNames.append(
198+
_useStandardSurface ? "FallbackCPVShaderStandardSurface" : "FallbackCPVShader");
199+
_cpvFallbackShaderNames.append("BasisCurvesLinearCPVShader");
200+
_cpvFallbackShaderNames.append("BasisCurvesCubicCPVShader");
201+
_cpvFallbackShaderNames.append("BasisCurvesCubicCPVShader");
202+
_cpvFallbackShaderNames.append("BasisCurvesCubicCPVShader");
203+
_cpvFallbackShaderNames.append("PointsFallbackCPVShader");
204+
180205
MHWRender::MRenderer* renderer = MHWRender::MRenderer::theRenderer();
181206
const MHWRender::MShaderManager* shaderMgr
182207
= renderer ? renderer->getShaderManager() : nullptr;
183208
if (!TF_VERIFY(shaderMgr))
184209
return;
185210

186-
_3dDefaultMaterialShader
187-
= shaderMgr->getStockShader(MHWRender::MShaderManager::k3dDefaultMaterialShader);
211+
_3dDefaultMaterialShader = _useStandardSurface
212+
? shaderMgr->getStockShader(MHWRender::MShaderManager::k3dStandardSurfaceShader)
213+
: shaderMgr->getStockShader(MHWRender::MShaderManager::k3dDefaultMaterialShader);
188214

189215
TF_VERIFY(_3dDefaultMaterialShader);
190216

@@ -518,6 +544,16 @@ class MShaderCache final
518544
private:
519545
bool _isInitialized { false }; //!< Whether the shader cache is initialized
520546

547+
//! Boolean of whether or not to use shader fragments using the default
548+
//! standardSurface material.
549+
bool _useStandardSurface { false };
550+
551+
//! Array of constant-color shader fragment names indexed by FallbackShaderType
552+
MStringArray _fallbackShaderNames;
553+
554+
//! Array of varying-color shader fragment names indexed by FallbackShaderType
555+
MStringArray _cpvFallbackShaderNames;
556+
521557
//! Shader registry used by fallback shaders
522558
MShaderMap _fallbackShaders[FallbackShaderTypeCount];
523559
MShaderMap _3dSolidShaders;

lib/mayaUsd/render/vp2ShaderFragments/CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ list(APPEND SHADERFRAGMENTS_XMLS
1818
Float3ToFloatX.xml
1919
Float3ToFloatY.xml
2020
Float3ToFloatZ.xml
21+
FloatToFloat3.xml
2122
UsdPreviewSurfaceLightAPI1.xml
2223
UsdPreviewSurfaceLightAPI2.xml
2324
UsdPreviewSurfaceLightAPI3.xml
@@ -49,7 +50,9 @@ list(APPEND SHADERFRAGMENTS_XMLS
4950
BasisCurvesLinearFallbackShader.xml
5051
BasisCurvesLinearHull.xml
5152
FallbackCPVShader.xml
53+
FallbackCPVShaderStandardSurface.xml
5254
FallbackShader.xml
55+
FallbackShaderStandardSurface.xml
5356
Float4ToFloat3.xml
5457
Float4ToFloat4.xml
5558
NwFaceCameraIfNAN.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
<!--
2+
========================================================================
3+
Copyright 2024 Atomic Cartoons Inc.
4+
5+
Licensed under the Apache License, Version 2.0 (the "License");
6+
you may not use this file except in compliance with the License.
7+
You may obtain a copy of the License at
8+
9+
http://www.apache.org/licenses/LICENSE-2.0
10+
11+
Unless required by applicable law or agreed to in writing, software
12+
distributed under the License is distributed on an "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
See the License for the specific language governing permissions and
15+
limitations under the License.
16+
========================================================================
17+
-->
18+
<fragment_graph name="FallbackCPVShaderStandardSurface" ref="FallbackCPVShaderStandardSurface" class="FragmentGraph" version="1.0" feature_level="0" >
19+
<fragments>
20+
<fragment_ref name="mayaDefaultStandardSurface" ref="mayaDefaultStandardSurface" />
21+
<fragment_ref name="FloatToFloat3" ref="FloatToFloat3" />
22+
<fragment_ref name="Float4ToFloat3" ref="Float4ToFloat3" />
23+
<fragment_ref name="Float4ToFloatW" ref="Float4ToFloatW" />
24+
<fragment_ref name="mayaCPVPassing" ref="mayaCPVPassing" />
25+
</fragments>
26+
<connections>
27+
<connect from="Float4ToFloat3.output" to="mayaDefaultStandardSurface.baseColor" name="color" />
28+
<connect from="FloatToFloat3.output" to="mayaDefaultStandardSurface.opacity" name="opacity" />
29+
<connect from="Float4ToFloatW.output" to="FloatToFloat3.input" name="alphavec" />
30+
<connect from="mayaCPVPassing.C_4F" to="Float4ToFloat3.input" name="rgb" />
31+
<connect from="mayaCPVPassing.C_4F" to="Float4ToFloatW.input" name="a" />
32+
</connections>
33+
<properties>
34+
<float3 name="mayaTangentIn" ref="mayaDefaultStandardSurface.mayaTangentIn" semantic="tangent" flags="varyingInputParam" />
35+
<float name="base" ref="mayaDefaultStandardSurface.base" />
36+
<float name="diffuseRoughness" ref="mayaDefaultStandardSurface.diffuseRoughness" />
37+
<float name="metalness" ref="mayaDefaultStandardSurface.metalness" />
38+
<float name="specular" ref="mayaDefaultStandardSurface.specular" />
39+
<float3 name="specularColor" ref="mayaDefaultStandardSurface.specularColor" />
40+
<float name="specularIOR" ref="mayaDefaultStandardSurface.specularIOR" />
41+
<float name="specularRoughness" ref="mayaDefaultStandardSurface.specularRoughness" />
42+
<float name="specularAnisotropy" ref="mayaDefaultStandardSurface.specularAnisotropy" />
43+
<float name="specularRotation" ref="mayaDefaultStandardSurface.specularRotation" />
44+
<float name="transmission" ref="mayaDefaultStandardSurface.transmission" />
45+
<float3 name="transmissionColor" ref="mayaDefaultStandardSurface.transmissionColor" />
46+
<float name="subsurface" ref="mayaDefaultStandardSurface.subsurface" />
47+
<float3 name="subsurfaceColor" ref="mayaDefaultStandardSurface.subsurfaceColor" />
48+
<float name="coat" ref="mayaDefaultStandardSurface.coat" />
49+
<float3 name="coatColor" ref="mayaDefaultStandardSurface.coatColor" />
50+
<float name="coatIOR" ref="mayaDefaultStandardSurface.coatIOR" />
51+
<float name="coatRoughness" ref="mayaDefaultStandardSurface.coatRoughness" />
52+
<float name="coatAnisotropy" ref="mayaDefaultStandardSurface.coatAnisotropy" />
53+
<float name="coatRotation" ref="mayaDefaultStandardSurface.coatRotation" />
54+
<float name="coatAffectRoughness" ref="mayaDefaultStandardSurface.coatAffectRoughness" />
55+
<float name="coatAffectColor" ref="mayaDefaultStandardSurface.coatAffectColor" />
56+
<float name="sheen" ref="mayaDefaultStandardSurface.sheen" />
57+
<float3 name="sheenColor" ref="mayaDefaultStandardSurface.sheenColor" />
58+
<float name="sheenRoughness" ref="mayaDefaultStandardSurface.sheenRoughness" />
59+
<float name="emission" ref="mayaDefaultStandardSurface.emission" />
60+
<float3 name="emissionColor" ref="mayaDefaultStandardSurface.emissionColor" />
61+
<float name="extraOpacity" ref="mayaDefaultStandardSurface.extraOpacity" />
62+
<bool name="fogEnabled" ref="mayaDefaultStandardSurface.fogEnabled" />
63+
<float3 name="Pw" ref="mayaDefaultStandardSurface.Pw" semantic="Pw" />
64+
<float4x4 name="ViewProj" ref="mayaDefaultStandardSurface.ViewProj" semantic="viewprojection" />
65+
<float name="fogStart" ref="mayaDefaultStandardSurface.fogStart" />
66+
<float name="fogEnd" ref="mayaDefaultStandardSurface.fogEnd" />
67+
<int name="fogMode" ref="mayaDefaultStandardSurface.fogMode" />
68+
<float name="fogDensity" ref="mayaDefaultStandardSurface.fogDensity" />
69+
<float4 name="fogColor" ref="mayaDefaultStandardSurface.fogColor" />
70+
<float name="fogMultiplier" ref="mayaDefaultStandardSurface.fogMultiplier" />
71+
<float3 name="IrradianceEnv" ref="mayaDefaultStandardSurface.IrradianceEnv" />
72+
<float3 name="SpecularEnv" ref="mayaDefaultStandardSurface.SpecularEnv" />
73+
<int name="selectionIndex" ref="mayaDefaultStandardSurface.selectionIndex" />
74+
<struct name="light0" ref="mayaDefaultStandardSurface.light0" />
75+
<struct name="light1" ref="mayaDefaultStandardSurface.light1" />
76+
<struct name="light2" ref="mayaDefaultStandardSurface.light2" />
77+
<struct name="light3" ref="mayaDefaultStandardSurface.light3" />
78+
<struct name="light4" ref="mayaDefaultStandardSurface.light4" />
79+
<struct name="light5" ref="mayaDefaultStandardSurface.light5" />
80+
<struct name="light6" ref="mayaDefaultStandardSurface.light6" />
81+
<struct name="light7" ref="mayaDefaultStandardSurface.light7" />
82+
<struct name="light8" ref="mayaDefaultStandardSurface.light8" />
83+
<struct name="light9" ref="mayaDefaultStandardSurface.light9" />
84+
<struct name="light10" ref="mayaDefaultStandardSurface.light10" />
85+
<struct name="light11" ref="mayaDefaultStandardSurface.light11" />
86+
<struct name="light12" ref="mayaDefaultStandardSurface.light12" />
87+
<struct name="light13" ref="mayaDefaultStandardSurface.light13" />
88+
<struct name="light14" ref="mayaDefaultStandardSurface.light14" />
89+
<struct name="light15" ref="mayaDefaultStandardSurface.light15" />
90+
<float3 name="Nw" ref="mayaDefaultStandardSurface.N" flags="varyingInputParam" />
91+
<float3 name="Vw" ref="mayaDefaultStandardSurface.V" flags="varyingInputParam" />
92+
<string name="selector" ref="mayaDefaultStandardSurface.selector" />
93+
<float3 name="ambientColor" ref="mayaDefaultStandardSurface.ambientColor" />
94+
<float3 name="ambientIn" ref="mayaDefaultStandardSurface.input" />
95+
<undefined name="GPUStage" ref="mayaDefaultStandardSurface.GPUStage" semantic="GPUStage" />
96+
<float4 name="diffuseColor" ref="mayaCPVPassing.colorIn" flags="varyingInputParam" />
97+
</properties>
98+
<values>
99+
<float name="base" value="1.000000" />
100+
<float name="specular" value="1.000000" />
101+
<float3 name="specularColor" value="1.000000,1.000000,1.000000" />
102+
<float name="specularIOR" value="1.500000" />
103+
<float name="specularRoughness" value="0.500000" />
104+
<float3 name="transmissionColor" value="1.000000,1.000000,1.000000" />
105+
<float3 name="subsurfaceColor" value="1.000000,1.000000,1.000000" />
106+
<float3 name="coatColor" value="1.000000,1.000000,1.000000" />
107+
<float name="coatIOR" value="1.500000" />
108+
<float name="coatRoughness" value="0.100000" />
109+
<float3 name="sheenColor" value="1.000000,1.000000,1.000000" />
110+
<float name="sheenRoughness" value="0.300000" />
111+
<float3 name="emissionColor" value="1.000000,1.000000,1.000000" />
112+
<float name="extraOpacity" value="1.000000" />
113+
<bool name="fogEnabled" value="false" />
114+
<float name="fogStart" value="0.000000" />
115+
<float name="fogEnd" value="92.000000" />
116+
<int name="fogMode" value="0" />
117+
<float name="fogDensity" value="0.100000" />
118+
<float4 name="fogColor" value="0.500000,0.500000,0.500000,1.000000" />
119+
<float name="fogMultiplier" value="1.000000" />
120+
<float3 name="IrradianceEnv" value="0.000000,0.000000,0.000000" />
121+
<float3 name="SpecularEnv" value="0.000000,0.000000,0.000000" />
122+
<int name="selectionIndex" value="0" />
123+
<string name="selector" value="mayaLightSelector16" />
124+
<float3 name="ambientColor" value="0.000000,0.000000,0.000000" />
125+
<float4 name="diffuseColor" value="0.18,0.18,0.18,1.0" />
126+
</values>
127+
<outputs>
128+
<float4 name="outSurfaceFinal" ref="mayaDefaultStandardSurface.outSurfaceFinal" />
129+
</outputs>
130+
</fragment_graph>

0 commit comments

Comments
 (0)