Skip to content

Commit

Permalink
Merge branch 'main' into downstream_traversal
Browse files Browse the repository at this point in the history
  • Loading branch information
jstone-lucasfilm committed Jul 12, 2023
2 parents 9fce312 + 3e838e2 commit fa118ef
Show file tree
Hide file tree
Showing 29 changed files with 1,639 additions and 1,207 deletions.
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,27 @@ The [MaterialX Viewer](documents/DeveloperGuide/Viewer.md) leverages shader gene

**Figure 1:** Procedural and uniform materials in the MaterialX viewer
<p float="left">
<img src="/documents/Images/MaterialXView_Marble.png" width="204" />
<img src="/documents/Images/MaterialXView_Copper.png" width="204" />
<img src="/documents/Images/MaterialXView_Plastic.png" width="204" />
<img src="/documents/Images/MaterialXView_Carpaint.png" width="204" />
<img src="documents/Images/MaterialXView_Marble.png" width="204" />
<img src="documents/Images/MaterialXView_Copper.png" width="204" />
<img src="documents/Images/MaterialXView_Plastic.png" width="204" />
<img src="documents/Images/MaterialXView_Carpaint.png" width="204" />
</p>

**Figure 2:** Textured, color-space-managed materials in the MaterialX viewer
<p float="left">
<img src="/documents/Images/MaterialXView_TiledBrass.png" width="412" />
<img src="/documents/Images/MaterialXView_TiledWood.png" width="412" />
<img src="documents/Images/MaterialXView_TiledBrass.png" width="412" />
<img src="documents/Images/MaterialXView_TiledWood.png" width="412" />
</p>

### Open Chess Set

The Open Chess Set is an open reference asset, consisting of a [MaterialX file](resources/Materials/Examples/StandardSurface/standard_surface_chess_set.mtlx) in the Standard Surface shading model and a [geometry file](resources/Geometry) in the glTF format. It was authored by Moeen Sayed and Mujtaba Sayed, and was contributed to the MaterialX project by Side Effects.

**Figure 3:** The Open Chess Set, rendered in Arnold for Maya
<img src="/documents/Images/OpenChessSet_Arnold_01.png" />
<img src="documents/Images/OpenChessSet_Arnold_01.png" />

**Figure 4:** The Open Chess Set, rendered in Karma XPU for Houdini
<img src="/documents/Images/OpenChessSet_Karma_01.png" />
<img src="documents/Images/OpenChessSet_Karma_01.png" />

### Pre-Built Binaries

Expand Down
1,784 changes: 955 additions & 829 deletions javascript/MaterialXTest/package-lock.json

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions javascript/MaterialXTest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.20.2",
"@babel/preset-env": "^7.20.2",
"@babel/register": "^7.18.9",
"@babel/core": "^7.22.5",
"@babel/preset-env": "^7.22.5",
"@babel/register": "^7.22.5",
"chai": "^4.3.7",
"copyfiles": "^2.4.1",
"karma": "^6.4.1",
"karma": "^6.4.2",
"karma-chai": "^0.1.0",
"karma-chrome-launcher": "^3.1.1",
"karma-chrome-launcher": "^3.2.0",
"karma-mocha": "^2.0.1",
"karma-mocha-reporter": "^2.2.5",
"mocha": "^10.1.0",
"mocha": "^10.2.0",
"rimraf": "^3.0.2"
}
}
681 changes: 381 additions & 300 deletions javascript/MaterialXView/package-lock.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions javascript/MaterialXView/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
"dependencies": {
"dat.gui": "^0.7.9",
"three": "^0.135.0",
"webpack": "^5.75.0"
"webpack": "^5.88.1"
},
"devDependencies": {
"copy-webpack-plugin": "^8.1.1",
"html-webpack-plugin": "^5.5.0",
"html-webpack-plugin": "^5.5.3",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.11.1"
"webpack-dev-server": "^4.15.1"
}
}
7 changes: 1 addition & 6 deletions libraries/bxdf/gltf_pbr.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -148,11 +148,6 @@
<!-- Thin-film + Dielectric
Note: Due to limitations in codegen, the base layer BSDF is duplicated (#1035). -->

<oren_nayar_diffuse_bsdf name="tf_diffuse_bsdf" type="BSDF">
<input name="color" type="color3" interfacename="base_color" />
<input name="normal" type="vector3" interfacename="normal" />
</oren_nayar_diffuse_bsdf>

<dielectric_bsdf name="tf_transmission_bsdf" type="BSDF">
<input name="weight" type="float" value="1" />
<input name="tint" type="color3" interfacename="base_color" />
Expand All @@ -173,7 +168,7 @@
</generalized_schlick_bsdf>

<mix name="tf_transmission_mix" type="BSDF">
<input name="bg" type="BSDF" nodename="tf_diffuse_bsdf" />
<input name="bg" type="BSDF" nodename="diffuse_bsdf" />
<input name="fg" type="BSDF" nodename="tf_transmission_bsdf" />
<input name="mix" type="float" interfacename="transmission" />
</mix>
Expand Down
48 changes: 48 additions & 0 deletions libraries/pbrlib/genglsl/mx_blackbody.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/// XYZ to Rec.709 RGB colorspace conversion
const mat3 XYZ_to_RGB = mat3( 3.2406, -0.9689, 0.0557,
-1.5372, 1.8758, -0.2040,
-0.4986, 0.0415, 1.0570);

void mx_blackbody(float temperatureKelvin, out vec3 colorValue)
{
float xc, yc;
float t, t2, t3, xc2, xc3;

// if value outside valid range of approximation clamp to accepted temperature range
temperatureKelvin = clamp(temperatureKelvin, 1667.0, 25000.0);

t = 1000.0 / temperatureKelvin;
t2 = t * t;
t3 = t * t * t;

// Cubic spline approximation for Kelvin temperature to sRGB conversion
// (https://en.wikipedia.org/wiki/Planckian_locus#Approximation)
if (temperatureKelvin < 4000.0) { // 1667K <= temperatureKelvin < 4000K
xc = -0.2661239 * t3 - 0.2343580 * t2 + 0.8776956 * t + 0.179910;
}
else { // 4000K <= temperatureKelvin <= 25000K
xc = -3.0258469 * t3 + 2.1070379 * t2 + 0.2226347 * t + 0.240390;
}
xc2 = xc * xc;
xc3 = xc * xc * xc;

if (temperatureKelvin < 2222.0) { // 1667K <= temperatureKelvin < 2222K
yc = -1.1063814 * xc3 - 1.34811020 * xc2 + 2.18555832 * xc - 0.20219683;
}
else if (temperatureKelvin < 4000.0) { // 2222K <= temperatureKelvin < 4000K
yc = -0.9549476 * xc3 - 1.37418593 * xc2 + 2.09137015 * xc - 0.16748867;
}
else { // 4000K <= temperatureKelvin <= 25000K
yc = 3.0817580 * xc3 - 5.87338670 * xc2 + 3.75112997 * xc - 0.37001483;
}

if (yc <= 0.0) { // avoid division by zero
colorValue = vec3(1.0);
return;
}

vec3 XYZ = vec3(xc / yc, 1.0, (1.0 - xc - yc) / yc);

colorValue = XYZ_to_RGB * XYZ;
colorValue = max(colorValue, vec3(0.0));
}
3 changes: 3 additions & 0 deletions libraries/pbrlib/genglsl/pbrlib_genglsl_impl.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,7 @@
<!-- <artistic_ior> -->
<implementation name="IM_artistic_ior_genglsl" nodedef="ND_artistic_ior" file="mx_artistic_ior.glsl" function="mx_artistic_ior" target="genglsl" />

<!-- <blackbody> -->
<implementation name="IM_blackbody_genglsl" nodedef="ND_blackbody" file="mx_blackbody.glsl" function="mx_blackbody" target="genglsl" />

</materialx>
3 changes: 3 additions & 0 deletions libraries/pbrlib/genmsl/pbrlib_genmsl_impl.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,7 @@
<!-- <artistic_ior> -->
<implementation name="IM_artistic_ior_genmsl" nodedef="ND_artistic_ior" file="../genglsl/mx_artistic_ior.glsl" function="mx_artistic_ior" target="genmsl" />

<!-- <blackbody> -->
<implementation name="IM_blackbody_genmsl" nodedef="ND_blackbody" file="../genglsl/mx_blackbody.glsl" function="mx_blackbody" target="genmsl" />

</materialx>
48 changes: 48 additions & 0 deletions libraries/pbrlib/genosl/mx_blackbody.osl
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
void mx_blackbody(float temperature, output color color_value)
{
float xc, yc;
float t, t2, t3, xc2, xc3;

// if value outside valid range of approximation clamp to accepted temperature range
temperature = clamp(temperature, 1667.0, 25000.0);

t = 1000.0 / temperature;
t2 = t * t;
t3 = t * t * t;

// Cubic spline approximation for Kelvin temperature to sRGB conversion
// (https://en.wikipedia.org/wiki/Planckian_locus#Approximation)
if (temperature < 4000.0) { // 1667K <= temperature < 4000K
xc = -0.2661239 * t3 - 0.2343580 * t2 + 0.8776956 * t + 0.179910;
}
else { // 4000K <= temperature <= 25000K
xc = -3.0258469 * t3 + 2.1070379 * t2 + 0.2226347 * t + 0.240390;
}
xc2 = xc * xc;
xc3 = xc * xc * xc;

if (temperature < 2222.0) { // 1667K <= temperature < 2222K
yc = -1.1063814 * xc3 - 1.34811020 * xc2 + 2.18555832 * xc - 0.20219683;
}
else if (temperature < 4000.0) { // 2222K <= temperature < 4000K
yc = -0.9549476 * xc3 - 1.37418593 * xc2 + 2.09137015 * xc - 0.16748867;
}
else { // 4000K <= temperature <= 25000K
yc = 3.0817580 * xc3 - 5.87338670 * xc2 + 3.75112997 * xc - 0.37001483;
}

if (yc <= 0.0) { // avoid division by zero
color_value = color(1.0);
return;
}

vector XYZ = vector(xc / yc, 1.0, (1 - xc - yc) / yc);

/// XYZ to Rec.709 RGB colorspace conversion
matrix XYZ_to_RGB = matrix( 3.2406, -0.9689, 0.0557,
-1.5372, 1.8758, -0.2040,
-0.4986, 0.0415, 1.0570);

color_value = transform(XYZ_to_RGB, XYZ);
color_value = max(color_value, vector(0.0));
}
3 changes: 3 additions & 0 deletions libraries/pbrlib/genosl/pbrlib_genosl_impl.legacy
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,7 @@
<!-- <artistic_ior> -->
<implementation name="IM_artistic_ior_genosl" nodedef="ND_artistic_ior" file="mx_artistic_ior.osl" function="mx_artistic_ior" target="genosl" />

<!-- <blackbody> -->
<implementation name="IM_blackbody_genosl" nodedef="ND_blackbody" file="mx_blackbody.osl" function="mx_blackbody" target="genosl" />

</materialx>
3 changes: 3 additions & 0 deletions libraries/pbrlib/genosl/pbrlib_genosl_impl.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,7 @@
<!-- <artistic_ior> -->
<implementation name="IM_artistic_ior_genosl" nodedef="ND_artistic_ior" file="mx_artistic_ior.osl" function="mx_artistic_ior" target="genosl" />

<!-- <blackbody> -->
<implementation name="IM_blackbody_genosl" nodedef="ND_blackbody" file="mx_blackbody.osl" function="mx_blackbody" target="genosl" />

</materialx>
10 changes: 10 additions & 0 deletions libraries/stdlib/stdlib_defs.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -2546,6 +2546,16 @@
<output name="out" type="stringarray" defaultinput="in1" />
</nodedef>

<!--
Node: <trianglewave>
Generate a triangle wave from the given scalar input.
The generated wave ranges from zero to one and repeats on integer boundaries.
-->
<nodedef name="ND_trianglewave_float" node="trianglewave" nodegroup="math">
<input name="in" type="float" value="0" />
<output name="out" type="float" />
</nodedef>

<!-- ======================================================================== -->
<!-- Adjustment nodes -->
<!-- ======================================================================== -->
Expand Down
26 changes: 26 additions & 0 deletions libraries/stdlib/stdlib_ng.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -1540,6 +1540,32 @@
</magnitude>
<output name="out" type="float" nodename="N_mtlxmagnitude" />
</nodegraph>

<!--
Node: <trianglewave>
Generate a triangle wave from the given scalar input.
The generated wave ranges from zero to one and repeats on integer boundaries.
-->
<nodegraph name="NG_trianglewave_float" nodedef="ND_trianglewave_float">
<absval name="absval1" type="float">
<input name="in" type="float" interfacename="in" />
</absval>
<modulo name="modulo1" type="float">
<input name="in1" type="float" nodename="absval1" />
</modulo>
<subtract name="subtract1" type="float">
<input name="in1" type="float" nodename="modulo1" />
<input name="in2" type="float" value="0.5" />
</subtract>
<absval name="absval2" type="float">
<input name="in" type="float" nodename="subtract1" />
</absval>
<subtract name="subtract2" type="float">
<input name="in1" type="float" value="0.5" />
<input name="in2" type="float" nodename="absval2" />
</subtract>
<output name="out" type="float" nodename="subtract2" />
</nodegraph>

<!-- ======================================================================== -->
<!-- Adjustment nodes -->
Expand Down
16 changes: 16 additions & 0 deletions resources/Materials/TestSuite/pbrlib/bsdf/blackbody.mtlx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<materialx version="1.38" colorspace="lin_rec709">
<nodegraph name="NG_blackbody">
<input name="blackbody_temperature" type="float" value="5000.0" uimin="1500.0" uimax="25000.0" uistep="100.0" uiname="Blackbody Temperature Kelvin" />
<blackbody name="blackbody_color_out" type="color3">
<input name="temperature" type="float" interfacename="blackbody_temperature" />
</blackbody>
<output name="emission_color_output" type="color3" nodename="blackbody_color_out" />
</nodegraph>
<surface_unlit name="SR_blackbody" type="surfaceshader">
<input name="emission_color" type="color3" nodegraph="NG_blackbody" output="emission_color_output" />
</surface_unlit>
<surfacematerial name="Blackbody" type="material">
<input name="surfaceshader" type="surfaceshader" nodename="SR_blackbody" />
</surfacematerial>
</materialx>
21 changes: 18 additions & 3 deletions source/MaterialXGenMdl/MdlShaderGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ const vector<string> DEFAULT_IMPORTS =
"import ::anno::*",
"import ::tex::*",
"import ::mx::swizzle::*",
"import ::mx::cm::*",
"using ::mx::core import *",
"using ::mx::stdlib import *",
"using ::mx::pbrlib import *",
Expand Down Expand Up @@ -273,9 +272,22 @@ ShaderPtr MdlShaderGenerator::generate(const string& name, ElementPtr element, G
// Get final result
const string result = getUpstreamResult(outputSocket, context);

const TypeDesc* outputType = outputSocket->getType();
if (graph.hasClassification(ShaderNode::Classification::TEXTURE))
{
emitLine("color finalOutput__ = mk_color3(" + result + ")", stage);
if (outputType == Type::DISPLACEMENTSHADER)
{
emitLine("float3 displacement__ = " + result + ".geometry.displacement", stage);
emitLine("color finalOutput__ = mk_color3("
"r: math::dot(displacement__, state::texture_tangent_u(0)),"
"g: math::dot(displacement__, state::texture_tangent_v(0)),"
"b: math::dot(displacement__, state::normal()))", stage);
}
else
{
emitLine("float3 displacement__ = float3(0.0)", stage);
emitLine("color finalOutput__ = mk_color3(" + result + ")", stage);
}

// End shader body
emitScopeEnd(stage);
Expand All @@ -289,13 +301,16 @@ ShaderPtr MdlShaderGenerator::generate(const string& name, ElementPtr element, G
" intensity : finalOutput__ * math::PI,\n"
" mode : intensity_radiant_exitance\n"
" )\n"
" ),\n"
" geometry: material_geometry(\n"
" displacement : displacement__\n"
" )\n"
");";
emitBlock(textureMaterial, FilePath(), context, stage);
}
else
{
emitLine(_syntax->getTypeSyntax(outputSocket->getType()).getName() + " finalOutput__ = " + result, stage);
emitLine(_syntax->getTypeSyntax(outputType).getName() + " finalOutput__ = " + result, stage);

// End shader body
emitScopeEnd(stage);
Expand Down
6 changes: 3 additions & 3 deletions source/MaterialXGenMdl/MdlSyntax.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -397,9 +397,9 @@ MdlSyntax::MdlSyntax()
registerTypeSyntax(
Type::DISPLACEMENTSHADER,
std::make_shared<ScalarTypeSyntax>(
"float3",
"float3(0.0)",
"float3(0.0)"));
"material",
"material()",
"material()"));

registerTypeSyntax(
Type::LIGHTSHADER,
Expand Down
3 changes: 3 additions & 0 deletions source/MaterialXGenMdl/Nodes/MaterialNodeMdl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ void MaterialNodeMdl::emitFunctionCall(const ShaderNode& _node, GenContext& cont
for (ShaderInput* input : node.getInputs())
{
shadergen.emitString(delim, stage);
shadergen.emitString("mxp_", stage);
shadergen.emitString(input->getName(), stage);
shadergen.emitString(": ", stage);
shadergen.emitInput(input, context, stage);
delim = ", ";
}
Expand Down
Loading

0 comments on commit fa118ef

Please sign in to comment.