Skip to content

Commit

Permalink
Unify HW shading implementations of geometric/convolution nodes (#2206)
Browse files Browse the repository at this point in the history
I noticed that the C++ implementations of these nodes were either identical, or nearly identical, so I think it makes sense to merge them together and provide a single HW shader version of these nodes.

GeomPropValueNode, GeomPropValueNodeAsUniform and GeomColorNode, the C++ implementation code is identical.

HeightToNormal and Blur both `#include` a separate shader source file that is language specific - so here the implementation registration uses a lambda function to wrap the differing filename in the `create()` call registered.

Note : Fix metal sobel sampling function to work with height to normal node, this provides a non-constant memory address space variable to the function.
  • Loading branch information
ld-kerley authored Feb 1, 2025
1 parent 4582901 commit 18c9eab
Show file tree
Hide file tree
Showing 20 changed files with 117 additions and 559 deletions.
2 changes: 1 addition & 1 deletion libraries/stdlib/genmsl/lib/mx_sampling.metal
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ vec2 mx_compute_sample_size_uv(vec2 uv, float filterSize, float filterOffset)
// Compute a normal mapped to 0..1 space based on a set of input
// samples using a Sobel filter.
//
vec3 mx_normal_from_samples_sobel(constant float S[9], float _scale)
vec3 mx_normal_from_samples_sobel(float S[9], float _scale)
{
float nx = S[0] - S[2] + (2.0*S[3]) - (2.0*S[5]) + S[6] - S[8];
float ny = S[0] + (2.0*S[1]) + S[2] - S[6] - (2.0*S[7]) - S[8];
Expand Down
27 changes: 14 additions & 13 deletions source/MaterialXGenGlsl/GlslShaderGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@
#include <MaterialXGenGlsl/GlslShaderGenerator.h>

#include <MaterialXGenGlsl/GlslSyntax.h>
#include <MaterialXGenGlsl/Nodes/GeomColorNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/GeomPropValueNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/SurfaceNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/UnlitSurfaceNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/LightNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/LightCompoundNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/LightShaderNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/LightSamplerNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/NumLightsNodeGlsl.h>
#include <MaterialXGenGlsl/Nodes/BlurNodeGlsl.h>

#include <MaterialXGenShader/Nodes/MaterialNode.h>
#include <MaterialXGenShader/Nodes/HwBlurNode.h>
#include <MaterialXGenShader/Nodes/HwImageNode.h>
#include <MaterialXGenShader/Nodes/HwGeomColorNode.h>
#include <MaterialXGenShader/Nodes/HwGeomPropValueNode.h>
#include <MaterialXGenShader/Nodes/HwHeightToNormalNode.h>
#include <MaterialXGenShader/Nodes/HwTexCoordNode.h>
#include <MaterialXGenShader/Nodes/HwTransformNode.h>
#include <MaterialXGenShader/Nodes/HwPositionNode.h>
Expand All @@ -35,6 +35,7 @@ MATERIALX_NAMESPACE_BEGIN

const string GlslShaderGenerator::TARGET = "genglsl";
const string GlslShaderGenerator::VERSION = "400";
const string GlslSamplingIncludeFilename = "stdlib/genglsl/lib/mx_sampling.glsl";

//
// GlslShaderGenerator methods
Expand All @@ -61,9 +62,9 @@ GlslShaderGenerator::GlslShaderGenerator() :
registerImplementation("IM_texcoord_vector2_" + GlslShaderGenerator::TARGET, HwTexCoordNode::create);
registerImplementation("IM_texcoord_vector3_" + GlslShaderGenerator::TARGET, HwTexCoordNode::create);
// <!-- <geomcolor> -->
registerImplementation("IM_geomcolor_float_" + GlslShaderGenerator::TARGET, GeomColorNodeGlsl::create);
registerImplementation("IM_geomcolor_color3_" + GlslShaderGenerator::TARGET, GeomColorNodeGlsl::create);
registerImplementation("IM_geomcolor_color4_" + GlslShaderGenerator::TARGET, GeomColorNodeGlsl::create);
registerImplementation("IM_geomcolor_float_" + GlslShaderGenerator::TARGET, HwGeomColorNode::create);
registerImplementation("IM_geomcolor_color3_" + GlslShaderGenerator::TARGET, HwGeomColorNode::create);
registerImplementation("IM_geomcolor_color4_" + GlslShaderGenerator::TARGET, HwGeomColorNode::create);
// <!-- <geompropvalue> -->
elementNames = {
"IM_geompropvalue_integer_" + GlslShaderGenerator::TARGET,
Expand All @@ -74,10 +75,10 @@ GlslShaderGenerator::GlslShaderGenerator() :
"IM_geompropvalue_vector3_" + GlslShaderGenerator::TARGET,
"IM_geompropvalue_vector4_" + GlslShaderGenerator::TARGET,
};
registerImplementation(elementNames, GeomPropValueNodeGlsl::create);
registerImplementation("IM_geompropvalue_boolean_" + GlslShaderGenerator::TARGET, GeomPropValueNodeGlslAsUniform::create);
registerImplementation("IM_geompropvalue_string_" + GlslShaderGenerator::TARGET, GeomPropValueNodeGlslAsUniform::create);
registerImplementation("IM_geompropvalue_filename_" + GlslShaderGenerator::TARGET, GeomPropValueNodeGlslAsUniform::create);
registerImplementation(elementNames, HwGeomPropValueNode::create);
registerImplementation("IM_geompropvalue_boolean_" + GlslShaderGenerator::TARGET, HwGeomPropValueNodeAsUniform::create);
registerImplementation("IM_geompropvalue_string_" + GlslShaderGenerator::TARGET, HwGeomPropValueNodeAsUniform::create);
registerImplementation("IM_geompropvalue_filename_" + GlslShaderGenerator::TARGET, HwGeomPropValueNodeAsUniform::create);

// <!-- <frame> -->
registerImplementation("IM_frame_float_" + GlslShaderGenerator::TARGET, HwFrameNode::create);
Expand All @@ -99,7 +100,7 @@ GlslShaderGenerator::GlslShaderGenerator() :
registerImplementation("IM_spot_light_" + GlslShaderGenerator::TARGET, LightShaderNodeGlsl::create);

// <!-- <heighttonormal> -->
registerImplementation("IM_heighttonormal_vector3_" + GlslShaderGenerator::TARGET, HeightToNormalNodeGlsl::create);
registerImplementation("IM_heighttonormal_vector3_" + GlslShaderGenerator::TARGET, []() -> ShaderNodeImplPtr { return HwHeightToNormalNode::create(GlslSamplingIncludeFilename);});

// <!-- <blur> -->
elementNames = {
Expand All @@ -110,7 +111,7 @@ GlslShaderGenerator::GlslShaderGenerator() :
"IM_blur_vector3_" + GlslShaderGenerator::TARGET,
"IM_blur_vector4_" + GlslShaderGenerator::TARGET,
};
registerImplementation(elementNames, BlurNodeGlsl::create);
registerImplementation(elementNames, []() -> ShaderNodeImplPtr { return HwBlurNode::create(GlslSamplingIncludeFilename);});

// <!-- <ND_transformpoint> ->
registerImplementation("IM_transformpoint_vector3_" + GlslShaderGenerator::TARGET, HwTransformPointNode::create);
Expand Down
27 changes: 0 additions & 27 deletions source/MaterialXGenGlsl/Nodes/BlurNodeGlsl.cpp

This file was deleted.

25 changes: 0 additions & 25 deletions source/MaterialXGenGlsl/Nodes/BlurNodeGlsl.h

This file was deleted.

26 changes: 0 additions & 26 deletions source/MaterialXGenGlsl/Nodes/GeomColorNodeGlsl.h

This file was deleted.

119 changes: 0 additions & 119 deletions source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.cpp

This file was deleted.

27 changes: 14 additions & 13 deletions source/MaterialXGenMsl/MslShaderGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@
#include <MaterialXGenMsl/MslShaderGenerator.h>

#include <MaterialXGenMsl/MslSyntax.h>
#include <MaterialXGenMsl/Nodes/GeomColorNodeMsl.h>
#include <MaterialXGenMsl/Nodes/GeomPropValueNodeMsl.h>
#include <MaterialXGenMsl/Nodes/SurfaceNodeMsl.h>
#include <MaterialXGenMsl/Nodes/UnlitSurfaceNodeMsl.h>
#include <MaterialXGenMsl/Nodes/LightNodeMsl.h>
#include <MaterialXGenMsl/Nodes/LightCompoundNodeMsl.h>
#include <MaterialXGenMsl/Nodes/LightShaderNodeMsl.h>
#include <MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.h>
#include <MaterialXGenMsl/Nodes/LightSamplerNodeMsl.h>
#include <MaterialXGenMsl/Nodes/NumLightsNodeMsl.h>
#include <MaterialXGenMsl/Nodes/BlurNodeMsl.h>

#include <MaterialXGenShader/Nodes/MaterialNode.h>
#include <MaterialXGenShader/Nodes/HwBlurNode.h>
#include <MaterialXGenShader/Nodes/HwImageNode.h>
#include <MaterialXGenShader/Nodes/HwGeomColorNode.h>
#include <MaterialXGenShader/Nodes/HwGeomPropValueNode.h>
#include <MaterialXGenShader/Nodes/HwHeightToNormalNode.h>
#include <MaterialXGenShader/Nodes/HwTexCoordNode.h>
#include <MaterialXGenShader/Nodes/HwTransformNode.h>
#include <MaterialXGenShader/Nodes/HwPositionNode.h>
Expand All @@ -39,6 +39,7 @@ MATERIALX_NAMESPACE_BEGIN

const string MslShaderGenerator::TARGET = "genmsl";
const string MslShaderGenerator::VERSION = "2.3";
const string MslSamplingIncludeFilename = "stdlib/genmsl/lib/mx_sampling.metal";

//
// MslShaderGenerator methods
Expand All @@ -65,9 +66,9 @@ MslShaderGenerator::MslShaderGenerator() :
registerImplementation("IM_texcoord_vector2_" + MslShaderGenerator::TARGET, HwTexCoordNode::create);
registerImplementation("IM_texcoord_vector3_" + MslShaderGenerator::TARGET, HwTexCoordNode::create);
// <!-- <geomcolor> -->
registerImplementation("IM_geomcolor_float_" + MslShaderGenerator::TARGET, GeomColorNodeMsl::create);
registerImplementation("IM_geomcolor_color3_" + MslShaderGenerator::TARGET, GeomColorNodeMsl::create);
registerImplementation("IM_geomcolor_color4_" + MslShaderGenerator::TARGET, GeomColorNodeMsl::create);
registerImplementation("IM_geomcolor_float_" + MslShaderGenerator::TARGET, HwGeomColorNode::create);
registerImplementation("IM_geomcolor_color3_" + MslShaderGenerator::TARGET, HwGeomColorNode::create);
registerImplementation("IM_geomcolor_color4_" + MslShaderGenerator::TARGET, HwGeomColorNode::create);
// <!-- <geompropvalue> -->
elementNames = {
"IM_geompropvalue_integer_" + MslShaderGenerator::TARGET,
Expand All @@ -78,10 +79,10 @@ MslShaderGenerator::MslShaderGenerator() :
"IM_geompropvalue_vector3_" + MslShaderGenerator::TARGET,
"IM_geompropvalue_vector4_" + MslShaderGenerator::TARGET,
};
registerImplementation(elementNames, GeomPropValueNodeMsl::create);
registerImplementation("IM_geompropvalue_boolean_" + MslShaderGenerator::TARGET, GeomPropValueNodeMslAsUniform::create);
registerImplementation("IM_geompropvalue_string_" + MslShaderGenerator::TARGET, GeomPropValueNodeMslAsUniform::create);
registerImplementation("IM_geompropvalue_filename_" + MslShaderGenerator::TARGET, GeomPropValueNodeMslAsUniform::create);
registerImplementation(elementNames, HwGeomPropValueNode::create);
registerImplementation("IM_geompropvalue_boolean_" + MslShaderGenerator::TARGET, HwGeomPropValueNodeAsUniform::create);
registerImplementation("IM_geompropvalue_string_" + MslShaderGenerator::TARGET, HwGeomPropValueNodeAsUniform::create);
registerImplementation("IM_geompropvalue_filename_" + MslShaderGenerator::TARGET, HwGeomPropValueNodeAsUniform::create);


// <!-- <frame> -->
Expand All @@ -104,7 +105,7 @@ MslShaderGenerator::MslShaderGenerator() :
registerImplementation("IM_spot_light_" + MslShaderGenerator::TARGET, LightShaderNodeMsl::create);

// <!-- <heighttonormal> -->
registerImplementation("IM_heighttonormal_vector3_" + MslShaderGenerator::TARGET, HeightToNormalNodeMsl::create);
registerImplementation("IM_heighttonormal_vector3_" + MslShaderGenerator::TARGET, []() -> ShaderNodeImplPtr { return HwHeightToNormalNode::create(MslSamplingIncludeFilename);});

// <!-- <blur> -->
elementNames = {
Expand All @@ -115,7 +116,7 @@ MslShaderGenerator::MslShaderGenerator() :
"IM_blur_vector3_" + MslShaderGenerator::TARGET,
"IM_blur_vector4_" + MslShaderGenerator::TARGET,
};
registerImplementation(elementNames, BlurNodeMsl::create);
registerImplementation(elementNames, []() -> ShaderNodeImplPtr { return HwBlurNode::create(MslSamplingIncludeFilename);});

// <!-- <ND_transformpoint> ->
registerImplementation("IM_transformpoint_vector3_" + MslShaderGenerator::TARGET, HwTransformPointNode::create);
Expand Down
25 changes: 0 additions & 25 deletions source/MaterialXGenMsl/Nodes/BlurNodeMsl.h

This file was deleted.

Loading

0 comments on commit 18c9eab

Please sign in to comment.