From 1a8fdd9c84d3fd60867b26d3648f566599e63c01 Mon Sep 17 00:00:00 2001
From: lsemp3d <58790905+lsemp3d@users.noreply.github.com>
Date: Thu, 27 Jan 2022 15:45:33 -0800
Subject: [PATCH 01/26] Script Canvas: Added take screenshot button to toolbar
Signed-off-by: lsemp3d <58790905+lsemp3d@users.noreply.github.com>
---
.../Code/Editor/View/Windows/MainWindow.cpp | 14 +++++++++++++-
.../Code/Editor/View/Windows/MainWindow.h | 1 +
.../Windows/Resources/scriptcanvas_screenshot.png | 3 +++
.../View/Windows/ScriptCanvasEditorResources.qrc | 1 +
4 files changed, 18 insertions(+), 1 deletion(-)
create mode 100644 Gems/ScriptCanvas/Code/Editor/View/Windows/Resources/scriptcanvas_screenshot.png
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp
index c0b6758147..c6ac85d314 100644
--- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp
+++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp
@@ -513,7 +513,6 @@ namespace ScriptCanvasEditor
m_editorToolbar->AddCustomAction(m_createFunctionOutput);
connect(m_createFunctionOutput, &QToolButton::clicked, this, &MainWindow::CreateFunctionOutput);
-
{
m_validateGraphToolButton = new QToolButton();
m_validateGraphToolButton->setToolTip("Will run a validation check on the current graph and report any warnings/errors discovered.");
@@ -523,6 +522,18 @@ namespace ScriptCanvasEditor
m_editorToolbar->AddCustomAction(m_validateGraphToolButton);
+ // Screenshot
+ {
+ m_takeScreenshot = new QToolButton();
+ m_takeScreenshot->setToolTip("Captures a full resolution screenshot of the entire graph or selected nodes into the clipboard");
+ m_takeScreenshot->setIcon(QIcon(":/ScriptCanvasEditorResources/Resources/scriptcanvas_screenshot.png"));
+ m_takeScreenshot->setEnabled(false);
+ }
+
+ m_editorToolbar->AddCustomAction(m_takeScreenshot);
+ connect(m_takeScreenshot, &QToolButton::clicked, this, &MainWindow::OnScreenshot);
+
+
connect(m_validateGraphToolButton, &QToolButton::clicked, this, &MainWindow::OnValidateCurrentGraph);
m_layout->addWidget(m_editorToolbar);
@@ -3211,6 +3222,7 @@ namespace ScriptCanvasEditor
m_createFunctionOutput->setEnabled(enabled);
m_createFunctionInput->setEnabled(enabled);
+ m_takeScreenshot->setEnabled(enabled);
// File Menu
ui->action_Close->setEnabled(enabled);
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h
index 75c798a0d3..d05792c4ec 100644
--- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h
+++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h
@@ -648,6 +648,7 @@ namespace ScriptCanvasEditor
QToolButton* m_createFunctionInput = nullptr;
QToolButton* m_createFunctionOutput = nullptr;
+ QToolButton* m_takeScreenshot = nullptr;
QToolButton* m_createScriptCanvas = nullptr;
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Resources/scriptcanvas_screenshot.png b/Gems/ScriptCanvas/Code/Editor/View/Windows/Resources/scriptcanvas_screenshot.png
new file mode 100644
index 0000000000..7daa11d945
--- /dev/null
+++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Resources/scriptcanvas_screenshot.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ef1d048b1ef82137424b6c346e7f87f156e97402ecc89eca8c0dc0e2b6acc395
+size 400
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasEditorResources.qrc b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasEditorResources.qrc
index be90d229dc..9244f71ca3 100644
--- a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasEditorResources.qrc
+++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasEditorResources.qrc
@@ -34,6 +34,7 @@
Resources/scriptcanvas_nodes.png
Resources/scriptcanvas_outliner.png
Resources/scriptcanvas_properties.png
+ Resources/scriptcanvas_screenshot.png
Resources/scriptcanvas_variables.png
Resources/settings_icon.png
Resources/settings_dropdown_icon.png
From c3363fc22e867eb9fd46a24f9bc0e20a9eeb65e7 Mon Sep 17 00:00:00 2001
From: santorac <55155825+santorac@users.noreply.github.com>
Date: Fri, 28 Jan 2022 09:36:09 -0800
Subject: [PATCH 02/26] Updating StandardPbr.materialtype to follow the new
file format. In this commit all I did was combine the "groups" metadata
together with the property lists. The groups will now show up in the wrong
order in the Material Editor, because that was based on the "groups" list
that no longer exists. I wanted to keep the giant list of properties in the
same order for an easier diff review. In the next commit, I'll move the
property groups around to be in the same order as before.
Signed-off-by: santorac <55155825+santorac@users.noreply.github.com>
---
.../Materials/Types/StandardPBR.materialtype | 1945 ++++++++---------
1 file changed, 971 insertions(+), 974 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
index f324394309..571b3301b7 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
@@ -10,1013 +10,1010 @@
}
],
"propertyLayout": {
- "groups": [
+ "propertyGroups": [
+ {
+ "name": "general",
+ "displayName": "General Settings",
+ "description": "General settings.",
+ "properties": [
+ {
+ "name": "doubleSided",
+ "displayName": "Double-sided",
+ "description": "Whether to render back-faces or just front-faces.",
+ "type": "Bool"
+ },
+ {
+ "name": "applySpecularAA",
+ "displayName": "Apply Specular AA",
+ "description": "Whether to apply specular anti-aliasing in the shader.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_applySpecularAA"
+ }
+ },
+ {
+ "name": "enableShadows",
+ "displayName": "Enable Shadows",
+ "description": "Whether to use the shadow maps.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableShadows"
+ }
+ },
+ {
+ "name": "enableDirectionalLights",
+ "displayName": "Enable Directional Lights",
+ "description": "Whether to use directional lights.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableDirectionalLights"
+ }
+ },
+ {
+ "name": "enablePunctualLights",
+ "displayName": "Enable Punctual Lights",
+ "description": "Whether to use punctual lights.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enablePunctualLights"
+ }
+ },
+ {
+ "name": "enableAreaLights",
+ "displayName": "Enable Area Lights",
+ "description": "Whether to use area lights.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableAreaLights"
+ }
+ },
+ {
+ "name": "enableIBL",
+ "displayName": "Enable IBL",
+ "description": "Whether to use Image Based Lighting (IBL).",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableIBL"
+ }
+ },
+ {
+ "name": "forwardPassIBLSpecular",
+ "displayName": "Forward Pass IBL Specular",
+ "description": "Whether to apply IBL specular in the forward pass.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_materialUseForwardPassIBLSpecular"
+ }
+ }
+ ]
+ },
{
"name": "baseColor",
"displayName": "Base Color",
- "description": "Properties for configuring the surface reflected color for dielectrics or reflectance values for metals."
+ "description": "Properties for configuring the surface reflected color for dielectrics or reflectance values for metals.",
+ "properties": [
+ {
+ "name": "color",
+ "displayName": "Color",
+ "description": "Color is displayed as sRGB but the values are stored as linear color.",
+ "type": "Color",
+ "defaultValue": [ 1.0, 1.0, 1.0 ],
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_baseColor"
+ }
+ },
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Strength factor for scaling the base color values. Zero (0.0) is black, white (1.0) is full color.",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_baseColorFactor"
+ }
+ },
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "Base color texture map",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_baseColorMap"
+ }
+ },
+ {
+ "name": "useTexture",
+ "displayName": "Use Texture",
+ "description": "Whether to use the texture.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Base color map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_baseColorMapUvIndex"
+ }
+ },
+ {
+ "name": "textureBlendMode",
+ "displayName": "Texture Blend Mode",
+ "description": "Selects the equation to use when combining Color, Factor, and Texture.",
+ "type": "Enum",
+ "enumValues": [ "Multiply", "LinearLight", "Lerp", "Overlay" ],
+ "defaultValue": "Multiply",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_baseColorTextureBlendMode"
+ }
+ }
+ ]
},
{
"name": "metallic",
"displayName": "Metallic",
- "description": "Properties for configuring whether the surface is metallic or not."
+ "description": "Properties for configuring whether the surface is metallic or not.",
+ "properties": [
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "This value is linear, black is non-metal and white means raw metal.",
+ "type": "Float",
+ "defaultValue": 0.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_metallicFactor"
+ }
+ },
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_metallicMap"
+ }
+ },
+ {
+ "name": "useTexture",
+ "displayName": "Use Texture",
+ "description": "Whether to use the texture, or just default to the Factor value.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Metallic map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_metallicMapUvIndex"
+ }
+ }
+ ]
},
{
"name": "roughness",
"displayName": "Roughness",
- "description": "Properties for configuring how rough the surface appears."
+ "description": "Properties for configuring how rough the surface appears.",
+ "properties": [
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "Texture for defining surface roughness.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_roughnessMap"
+ }
+ },
+ {
+ "name": "useTexture",
+ "displayName": "Use Texture",
+ "description": "Whether to use the texture, or just default to the Factor value.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Roughness map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_roughnessMapUvIndex"
+ }
+ },
+ {
+ // Note that "factor" is mutually exclusive with "lowerBound"/"upperBound". These are swapped by a lua functor.
+ "name": "lowerBound",
+ "displayName": "Lower Bound",
+ "description": "The roughness value that corresponds to black in the texture.",
+ "type": "Float",
+ "defaultValue": 0.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_roughnessLowerBound"
+ }
+ },
+ {
+ // Note that "factor" is mutually exclusive with "lowerBound"/"upperBound". These are swapped by a lua functor.
+ "name": "upperBound",
+ "displayName": "Upper Bound",
+ "description": "The roughness value that corresponds to white in the texture.",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_roughnessUpperBound"
+ }
+ },
+ {
+ // Note that "factor" is mutually exclusive with "lowerBound"/"upperBound". These are swapped by a lua functor.
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Controls the roughness value",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_roughnessFactor"
+ }
+ }
+ ]
},
{
"name": "specularF0",
"displayName": "Specular Reflectance f0",
- "description": "The constant f0 represents the specular reflectance at normal incidence (Fresnel 0 Angle). Used to adjust reflectance of non-metal surfaces."
- },
- {
- "name": "normal",
- "displayName": "Normal",
- "description": "Properties related to configuring surface normal."
- },
- {
- "name": "occlusion",
- "displayName": "Occlusion",
- "description": "Properties for baked textures that represent geometric occlusion of light."
- },
- {
- "name": "emissive",
- "displayName": "Emissive",
- "description": "Properties to add light emission, independent of other lights in the scene."
+ "description": "The constant f0 represents the specular reflectance at normal incidence (Fresnel 0 Angle). Used to adjust reflectance of non-metal surfaces.",
+ "properties": [
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "The default IOR is 1.5, which gives you 0.04 (4% of light reflected at 0 degree angle for dielectric materials). F0 values lie in the range 0-0.08, so that is why the default F0 slider is set on 0.5.",
+ "type": "Float",
+ "defaultValue": 0.5,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_specularF0Factor"
+ }
+ },
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "Texture for defining surface reflectance.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_specularF0Map"
+ }
+ },
+ {
+ "name": "useTexture",
+ "displayName": "Use Texture",
+ "description": "Whether to use the texture, or just default to the Factor value.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Specular reflection map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_specularF0MapUvIndex"
+ }
+ },
+ // Consider moving this to the "general" group to be consistent with StandardMultilayerPBR
+ {
+ "name": "enableMultiScatterCompensation",
+ "displayName": "Multiscattering Compensation",
+ "description": "Whether to enable multiple scattering compensation.",
+ "type": "Bool",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_specularF0_enableMultiScatterCompensation"
+ }
+ }
+ ]
},
{
"name": "clearCoat",
"displayName": "Clear Coat",
- "description": "Properties for configuring gloss clear coat"
- },
+ "description": "Properties for configuring gloss clear coat",
+ "properties": [
+ {
+ "name": "enable",
+ "displayName": "Enable",
+ "description": "Enable clear coat",
+ "type": "Bool",
+ "defaultValue": false
+ },
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Strength factor for scaling the percentage of effect applied",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatFactor"
+ }
+ },
+ {
+ "name": "influenceMap",
+ "displayName": " Influence Map",
+ "description": "Strength factor texture",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatInfluenceMap"
+ }
+ },
+ {
+ "name": "useInfluenceMap",
+ "displayName": " Use Texture",
+ "description": "Whether to use the texture, or just default to the Factor value.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "influenceMapUv",
+ "displayName": " UV",
+ "description": "Strength factor map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatInfluenceMapUvIndex"
+ }
+ },
+ {
+ "name": "roughness",
+ "displayName": "Roughness",
+ "description": "Clear coat layer roughness",
+ "type": "Float",
+ "defaultValue": 0.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatRoughness"
+ }
+ },
+ {
+ "name": "roughnessMap",
+ "displayName": " Roughness Map",
+ "description": "Texture for defining surface roughness",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatRoughnessMap"
+ }
+ },
+ {
+ "name": "useRoughnessMap",
+ "displayName": " Use Texture",
+ "description": "Whether to use the texture, or just default to the roughness value.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "roughnessMapUv",
+ "displayName": " UV",
+ "description": "Roughness map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatRoughnessMapUvIndex"
+ }
+ },
+ {
+ "name": "normalStrength",
+ "displayName": "Normal Strength",
+ "description": "Scales the impact of the clear coat normal map",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 2.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatNormalStrength"
+ }
+ },
+ {
+ "name": "normalMap",
+ "displayName": "Normal Map",
+ "description": "Normal map for clear coat layer, as top layer material clear coat doesn't affect by base layer normal map",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatNormalMap"
+ }
+ },
+ {
+ "name": "useNormalMap",
+ "displayName": " Use Texture",
+ "description": "Whether to use the normal map",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "normalMapUv",
+ "displayName": " UV",
+ "description": "Normal map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatNormalMapUvIndex"
+ }
+ }
+ ]
+ },
{
- "name": "parallax",
- "displayName": "Displacement",
- "description": "Properties for parallax effect produced by a height map."
+ "name": "normal",
+ "displayName": "Normal",
+ "description": "Properties related to configuring surface normal.",
+ "properties": [
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "Texture for defining surface normal direction.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_normalMap"
+ }
+ },
+ {
+ "name": "useTexture",
+ "displayName": "Use Texture",
+ "description": "Whether to use the texture, or just rely on vertex normals.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Normal map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_normalMapUvIndex"
+ }
+ },
+ {
+ "name": "flipX",
+ "displayName": "Flip X Channel",
+ "description": "Flip tangent direction for this normal map.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_flipNormalX"
+ }
+ },
+ {
+ "name": "flipY",
+ "displayName": "Flip Y Channel",
+ "description": "Flip bitangent direction for this normal map.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_flipNormalY"
+ }
+ },
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Strength factor for scaling the values",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "softMax": 2.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_normalFactor"
+ }
+ }
+ ]
},
{
"name": "opacity",
"displayName": "Opacity",
- "description": "Properties for configuring the materials transparency."
+ "description": "Properties for configuring the materials transparency.",
+ "properties": [
+ {
+ "name": "mode",
+ "displayName": "Opacity Mode",
+ "description": "Indicates the general approach how transparency is to be applied.",
+ "type": "Enum",
+ "enumValues": [ "Opaque", "Cutout", "Blended", "TintedTransparent" ],
+ "defaultValue": "Opaque",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_opacity_mode"
+ }
+ },
+ {
+ "name": "alphaSource",
+ "displayName": "Alpha Source",
+ "description": "Indicates whether to get the opacity texture from the Base Color map (Packed) or from a separate greyscale texture (Split).",
+ "type": "Enum",
+ "enumValues": [ "Packed", "Split", "None" ],
+ "defaultValue": "Packed",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_opacity_source"
+ }
+ },
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "Texture for defining surface opacity.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityMap"
+ }
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Opacity map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityMapUvIndex"
+ }
+ },
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Factor for cutout threshold and blending",
+ "type": "Float",
+ "min": 0.0,
+ "max": 1.0,
+ "defaultValue": 0.5,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityFactor"
+ }
+ },
+ {
+ "name": "alphaAffectsSpecular",
+ "displayName": "Alpha affects specular",
+ "description": "How much the alpha value should also affect specular reflection. This should be 0.0 for materials where light can transmit through their physical surface (like glass), but 1.0 when alpha determines the very presence of a surface (like hair or grass)",
+ "type": "float",
+ "min": 0.0,
+ "max": 1.0,
+ "defaultValue": 0.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityAffectsSpecularFactor"
+ }
+ }
+ ]
},
{
"name": "uv",
"displayName": "UVs",
- "description": "Properties for configuring UV transforms."
+ "description": "Properties for configuring UV transforms.",
+ "properties": [
+ {
+ "name": "center",
+ "displayName": "Center",
+ "description": "Center point for scaling and rotation transformations.",
+ "type": "vector2",
+ "vectorLabels": [ "U", "V" ],
+ "defaultValue": [ 0.5, 0.5 ]
+ },
+ {
+ "name": "tileU",
+ "displayName": "Tile U",
+ "description": "Scales texture coordinates in U.",
+ "type": "float",
+ "defaultValue": 1.0,
+ "step": 0.1
+ },
+ {
+ "name": "tileV",
+ "displayName": "Tile V",
+ "description": "Scales texture coordinates in V.",
+ "type": "float",
+ "defaultValue": 1.0,
+ "step": 0.1
+ },
+ {
+ "name": "offsetU",
+ "displayName": "Offset U",
+ "description": "Offsets texture coordinates in the U direction.",
+ "type": "float",
+ "defaultValue": 0.0,
+ "min": -1.0,
+ "max": 1.0
+ },
+ {
+ "name": "offsetV",
+ "displayName": "Offset V",
+ "description": "Offsets texture coordinates in the V direction.",
+ "type": "float",
+ "defaultValue": 0.0,
+ "min": -1.0,
+ "max": 1.0
+ },
+ {
+ "name": "rotateDegrees",
+ "displayName": "Rotate",
+ "description": "Rotates the texture coordinates (degrees).",
+ "type": "float",
+ "defaultValue": 0.0,
+ "min": -180.0,
+ "max": 180.0,
+ "step": 1.0
+ },
+ {
+ "name": "scale",
+ "displayName": "Scale",
+ "description": "Scales texture coordinates in both U and V.",
+ "type": "float",
+ "defaultValue": 1.0,
+ "step": 0.1
+ }
+ ]
+ },
+ {
+ "name": "occlusion",
+ "displayName": "Occlusion",
+ "description": "Properties for baked textures that represent geometric occlusion of light.",
+ "properties": [
+ {
+ "name": "diffuseTextureMap",
+ "displayName": "Diffuse AO",
+ "description": "Texture for defining occlusion area for diffuse ambient lighting.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_diffuseOcclusionMap"
+ }
+ },
+ {
+ "name": "diffuseUseTexture",
+ "displayName": " Use Texture",
+ "description": "Whether to use the Diffuse AO map.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "diffuseTextureMapUv",
+ "displayName": " UV",
+ "description": "Diffuse AO map UV set.",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_diffuseOcclusionMapUvIndex"
+ }
+ },
+ {
+ "name": "diffuseFactor",
+ "displayName": " Factor",
+ "description": "Strength factor for scaling the values of Diffuse AO",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "softMax": 2.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_diffuseOcclusionFactor"
+ }
+ },
+ {
+ "name": "specularTextureMap",
+ "displayName": "Specular Cavity",
+ "description": "Texture for defining occlusion area for specular lighting.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_specularOcclusionMap"
+ }
+ },
+ {
+ "name": "specularUseTexture",
+ "displayName": " Use Texture",
+ "description": "Whether to use the Specular Cavity map.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "specularTextureMapUv",
+ "displayName": " UV",
+ "description": "Specular Cavity map UV set.",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_specularOcclusionMapUvIndex"
+ }
+ },
+ {
+ "name": "specularFactor",
+ "displayName": " Factor",
+ "description": "Strength factor for scaling the values of Specular Cavity",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "softMax": 2.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_specularOcclusionFactor"
+ }
+ }
+ ]
+ },
+ {
+ "name": "emissive",
+ "displayName": "Emissive",
+ "description": "Properties to add light emission, independent of other lights in the scene.",
+ "properties": [
+ {
+ "name": "enable",
+ "displayName": "Enable",
+ "description": "Enable the emissive group",
+ "type": "Bool",
+ "defaultValue": false
+ },
+ {
+ "name": "unit",
+ "displayName": "Units",
+ "description": "The photometric units of the Intensity property.",
+ "type": "Enum",
+ "enumValues": ["Ev100"],
+ "defaultValue": "Ev100"
+ },
+ {
+ "name": "color",
+ "displayName": "Color",
+ "description": "Color is displayed as sRGB but the values are stored as linear color.",
+ "type": "Color",
+ "defaultValue": [ 1.0, 1.0, 1.0 ],
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_emissiveColor"
+ }
+ },
+ {
+ "name": "intensity",
+ "displayName": "Intensity",
+ "description": "The amount of energy emitted.",
+ "type": "Float",
+ "defaultValue": 4,
+ "min": -10,
+ "max": 20,
+ "softMin": -6,
+ "softMax": 16
+ },
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "Texture for defining emissive area.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_emissiveMap"
+ }
+ },
+ {
+ "name": "useTexture",
+ "displayName": "Use Texture",
+ "description": "Whether to use the texture.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Emissive map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_emissiveMapUvIndex"
+ }
+ }
+ ]
+ },
+ {
+ "name": "parallax",
+ "displayName": "Displacement",
+ "description": "Properties for parallax effect produced by a height map.",
+ "properties": [
+ {
+ "name": "textureMap",
+ "displayName": "Height Map",
+ "description": "Displacement height map to create parallax effect.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_heightmap"
+ }
+ },
+ {
+ "name": "useTexture",
+ "displayName": "Use Texture",
+ "description": "Whether to use the height map.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Height map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_parallaxUvIndex"
+ }
+ },
+ {
+ "name": "factor",
+ "displayName": "Height Map Scale",
+ "description": "The total height of the height map in local model units.",
+ "type": "Float",
+ "defaultValue": 0.05,
+ "min": 0.0,
+ "softMax": 0.1,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_heightmapScale"
+ }
+ },
+ {
+ "name": "offset",
+ "displayName": "Offset",
+ "description": "Adjusts the overall displacement amount in local model units.",
+ "type": "Float",
+ "defaultValue": 0.0,
+ "softMin": -0.1,
+ "softMax": 0.1,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_heightmapOffset"
+ }
+ },
+ {
+ "name": "algorithm",
+ "displayName": "Algorithm",
+ "description": "Select the algorithm to use for parallax mapping.",
+ "type": "Enum",
+ "enumValues": [ "Basic", "Steep", "POM", "Relief", "ContactRefinement" ],
+ "defaultValue": "POM",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_parallax_algorithm"
+ }
+ },
+ {
+ "name": "quality",
+ "displayName": "Quality",
+ "description": "Quality of parallax mapping.",
+ "type": "Enum",
+ "enumValues": [ "Low", "Medium", "High", "Ultra" ],
+ "defaultValue": "Low",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_parallax_quality"
+ }
+ },
+ {
+ "name": "pdo",
+ "displayName": "Pixel Depth Offset",
+ "description": "Enable PDO to offset the original pixel depths. This will affect any shaders using depth, for example, when receiving shadows.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_parallax_enablePixelDepthOffset"
+ }
+ },
+ {
+ "name": "showClipping",
+ "displayName": "Show Clipping",
+ "description": "Highlight areas where the height map is clipped by the mesh surface.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_parallax_highlightClipping"
+ }
+ }
+ ]
},
{
// Note: this property group is used in the DiffuseGlobalIllumination pass, it is not read by the StandardPBR shader
"name": "irradiance",
"displayName": "Irradiance",
- "description": "Properties for configuring the irradiance used in global illumination."
- },
- {
- "name": "general",
- "displayName": "General Settings",
- "description": "General settings."
+ "description": "Properties for configuring the irradiance used in global illumination.",
+ "properties": [
+ {
+ "name": "color",
+ "displayName": "Color",
+ "description": "Color is displayed as sRGB but the values are stored as linear color.",
+ "type": "Color",
+ "defaultValue": [ 1.0, 1.0, 1.0 ]
+ },
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Strength factor for scaling the irradiance color values. Zero (0.0) is black, white (1.0) is full color.",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 1.0
+ }
+ ]
}
- ],
- "properties": {
- "general": [
- {
- "name": "doubleSided",
- "displayName": "Double-sided",
- "description": "Whether to render back-faces or just front-faces.",
- "type": "Bool"
- },
- {
- "name": "applySpecularAA",
- "displayName": "Apply Specular AA",
- "description": "Whether to apply specular anti-aliasing in the shader.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderOption",
- "name": "o_applySpecularAA"
- }
- },
- {
- "name": "enableShadows",
- "displayName": "Enable Shadows",
- "description": "Whether to use the shadow maps.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableShadows"
- }
- },
- {
- "name": "enableDirectionalLights",
- "displayName": "Enable Directional Lights",
- "description": "Whether to use directional lights.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableDirectionalLights"
- }
- },
- {
- "name": "enablePunctualLights",
- "displayName": "Enable Punctual Lights",
- "description": "Whether to use punctual lights.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enablePunctualLights"
- }
- },
- {
- "name": "enableAreaLights",
- "displayName": "Enable Area Lights",
- "description": "Whether to use area lights.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableAreaLights"
- }
- },
- {
- "name": "enableIBL",
- "displayName": "Enable IBL",
- "description": "Whether to use Image Based Lighting (IBL).",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableIBL"
- }
- },
- {
- "name": "forwardPassIBLSpecular",
- "displayName": "Forward Pass IBL Specular",
- "description": "Whether to apply IBL specular in the forward pass.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderOption",
- "name": "o_materialUseForwardPassIBLSpecular"
- }
- }
- ],
- "baseColor": [
- {
- "name": "color",
- "displayName": "Color",
- "description": "Color is displayed as sRGB but the values are stored as linear color.",
- "type": "Color",
- "defaultValue": [ 1.0, 1.0, 1.0 ],
- "connection": {
- "type": "ShaderInput",
- "name": "m_baseColor"
- }
- },
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "Strength factor for scaling the base color values. Zero (0.0) is black, white (1.0) is full color.",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_baseColorFactor"
- }
- },
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "Base color texture map",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_baseColorMap"
- }
- },
- {
- "name": "useTexture",
- "displayName": "Use Texture",
- "description": "Whether to use the texture.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Base color map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_baseColorMapUvIndex"
- }
- },
- {
- "name": "textureBlendMode",
- "displayName": "Texture Blend Mode",
- "description": "Selects the equation to use when combining Color, Factor, and Texture.",
- "type": "Enum",
- "enumValues": [ "Multiply", "LinearLight", "Lerp", "Overlay" ],
- "defaultValue": "Multiply",
- "connection": {
- "type": "ShaderOption",
- "name": "o_baseColorTextureBlendMode"
- }
- }
- ],
- "metallic": [
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "This value is linear, black is non-metal and white means raw metal.",
- "type": "Float",
- "defaultValue": 0.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_metallicFactor"
- }
- },
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_metallicMap"
- }
- },
- {
- "name": "useTexture",
- "displayName": "Use Texture",
- "description": "Whether to use the texture, or just default to the Factor value.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Metallic map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_metallicMapUvIndex"
- }
- }
- ],
- "roughness": [
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "Texture for defining surface roughness.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_roughnessMap"
- }
- },
- {
- "name": "useTexture",
- "displayName": "Use Texture",
- "description": "Whether to use the texture, or just default to the Factor value.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Roughness map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_roughnessMapUvIndex"
- }
- },
- {
- // Note that "factor" is mutually exclusive with "lowerBound"/"upperBound". These are swapped by a lua functor.
- "name": "lowerBound",
- "displayName": "Lower Bound",
- "description": "The roughness value that corresponds to black in the texture.",
- "type": "Float",
- "defaultValue": 0.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_roughnessLowerBound"
- }
- },
- {
- // Note that "factor" is mutually exclusive with "lowerBound"/"upperBound". These are swapped by a lua functor.
- "name": "upperBound",
- "displayName": "Upper Bound",
- "description": "The roughness value that corresponds to white in the texture.",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_roughnessUpperBound"
- }
- },
- {
- // Note that "factor" is mutually exclusive with "lowerBound"/"upperBound". These are swapped by a lua functor.
- "name": "factor",
- "displayName": "Factor",
- "description": "Controls the roughness value",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_roughnessFactor"
- }
- }
- ],
- "specularF0": [
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "The default IOR is 1.5, which gives you 0.04 (4% of light reflected at 0 degree angle for dielectric materials). F0 values lie in the range 0-0.08, so that is why the default F0 slider is set on 0.5.",
- "type": "Float",
- "defaultValue": 0.5,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_specularF0Factor"
- }
- },
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "Texture for defining surface reflectance.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_specularF0Map"
- }
- },
- {
- "name": "useTexture",
- "displayName": "Use Texture",
- "description": "Whether to use the texture, or just default to the Factor value.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Specular reflection map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_specularF0MapUvIndex"
- }
- },
- // Consider moving this to the "general" group to be consistent with StandardMultilayerPBR
- {
- "name": "enableMultiScatterCompensation",
- "displayName": "Multiscattering Compensation",
- "description": "Whether to enable multiple scattering compensation.",
- "type": "Bool",
- "connection": {
- "type": "ShaderOption",
- "name": "o_specularF0_enableMultiScatterCompensation"
- }
- }
- ],
- "clearCoat": [
- {
- "name": "enable",
- "displayName": "Enable",
- "description": "Enable clear coat",
- "type": "Bool",
- "defaultValue": false
- },
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "Strength factor for scaling the percentage of effect applied",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatFactor"
- }
- },
- {
- "name": "influenceMap",
- "displayName": " Influence Map",
- "description": "Strength factor texture",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatInfluenceMap"
- }
- },
- {
- "name": "useInfluenceMap",
- "displayName": " Use Texture",
- "description": "Whether to use the texture, or just default to the Factor value.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "influenceMapUv",
- "displayName": " UV",
- "description": "Strength factor map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatInfluenceMapUvIndex"
- }
- },
- {
- "name": "roughness",
- "displayName": "Roughness",
- "description": "Clear coat layer roughness",
- "type": "Float",
- "defaultValue": 0.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatRoughness"
- }
- },
- {
- "name": "roughnessMap",
- "displayName": " Roughness Map",
- "description": "Texture for defining surface roughness",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatRoughnessMap"
- }
- },
- {
- "name": "useRoughnessMap",
- "displayName": " Use Texture",
- "description": "Whether to use the texture, or just default to the roughness value.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "roughnessMapUv",
- "displayName": " UV",
- "description": "Roughness map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatRoughnessMapUvIndex"
- }
- },
- {
- "name": "normalStrength",
- "displayName": "Normal Strength",
- "description": "Scales the impact of the clear coat normal map",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 2.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatNormalStrength"
- }
- },
- {
- "name": "normalMap",
- "displayName": "Normal Map",
- "description": "Normal map for clear coat layer, as top layer material clear coat doesn't affect by base layer normal map",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatNormalMap"
- }
- },
- {
- "name": "useNormalMap",
- "displayName": " Use Texture",
- "description": "Whether to use the normal map",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "normalMapUv",
- "displayName": " UV",
- "description": "Normal map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatNormalMapUvIndex"
- }
- }
- ],
- "normal": [
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "Texture for defining surface normal direction.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_normalMap"
- }
- },
- {
- "name": "useTexture",
- "displayName": "Use Texture",
- "description": "Whether to use the texture, or just rely on vertex normals.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Normal map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_normalMapUvIndex"
- }
- },
- {
- "name": "flipX",
- "displayName": "Flip X Channel",
- "description": "Flip tangent direction for this normal map.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderInput",
- "name": "m_flipNormalX"
- }
- },
- {
- "name": "flipY",
- "displayName": "Flip Y Channel",
- "description": "Flip bitangent direction for this normal map.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderInput",
- "name": "m_flipNormalY"
- }
- },
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "Strength factor for scaling the values",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "softMax": 2.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_normalFactor"
- }
- }
- ],
- "opacity": [
- {
- "name": "mode",
- "displayName": "Opacity Mode",
- "description": "Indicates the general approach how transparency is to be applied.",
- "type": "Enum",
- "enumValues": [ "Opaque", "Cutout", "Blended", "TintedTransparent" ],
- "defaultValue": "Opaque",
- "connection": {
- "type": "ShaderOption",
- "name": "o_opacity_mode"
- }
- },
- {
- "name": "alphaSource",
- "displayName": "Alpha Source",
- "description": "Indicates whether to get the opacity texture from the Base Color map (Packed) or from a separate greyscale texture (Split).",
- "type": "Enum",
- "enumValues": [ "Packed", "Split", "None" ],
- "defaultValue": "Packed",
- "connection": {
- "type": "ShaderOption",
- "name": "o_opacity_source"
- }
- },
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "Texture for defining surface opacity.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityMap"
- }
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Opacity map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityMapUvIndex"
- }
- },
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "Factor for cutout threshold and blending",
- "type": "Float",
- "min": 0.0,
- "max": 1.0,
- "defaultValue": 0.5,
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityFactor"
- }
- },
- {
- "name": "alphaAffectsSpecular",
- "displayName": "Alpha affects specular",
- "description": "How much the alpha value should also affect specular reflection. This should be 0.0 for materials where light can transmit through their physical surface (like glass), but 1.0 when alpha determines the very presence of a surface (like hair or grass)",
- "type": "float",
- "min": 0.0,
- "max": 1.0,
- "defaultValue": 0.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityAffectsSpecularFactor"
- }
- }
- ],
- "uv": [
- {
- "name": "center",
- "displayName": "Center",
- "description": "Center point for scaling and rotation transformations.",
- "type": "vector2",
- "vectorLabels": [ "U", "V" ],
- "defaultValue": [ 0.5, 0.5 ]
- },
- {
- "name": "tileU",
- "displayName": "Tile U",
- "description": "Scales texture coordinates in U.",
- "type": "float",
- "defaultValue": 1.0,
- "step": 0.1
- },
- {
- "name": "tileV",
- "displayName": "Tile V",
- "description": "Scales texture coordinates in V.",
- "type": "float",
- "defaultValue": 1.0,
- "step": 0.1
- },
- {
- "name": "offsetU",
- "displayName": "Offset U",
- "description": "Offsets texture coordinates in the U direction.",
- "type": "float",
- "defaultValue": 0.0,
- "min": -1.0,
- "max": 1.0
- },
- {
- "name": "offsetV",
- "displayName": "Offset V",
- "description": "Offsets texture coordinates in the V direction.",
- "type": "float",
- "defaultValue": 0.0,
- "min": -1.0,
- "max": 1.0
- },
- {
- "name": "rotateDegrees",
- "displayName": "Rotate",
- "description": "Rotates the texture coordinates (degrees).",
- "type": "float",
- "defaultValue": 0.0,
- "min": -180.0,
- "max": 180.0,
- "step": 1.0
- },
- {
- "name": "scale",
- "displayName": "Scale",
- "description": "Scales texture coordinates in both U and V.",
- "type": "float",
- "defaultValue": 1.0,
- "step": 0.1
- }
- ],
- "occlusion": [
- {
- "name": "diffuseTextureMap",
- "displayName": "Diffuse AO",
- "description": "Texture for defining occlusion area for diffuse ambient lighting.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_diffuseOcclusionMap"
- }
- },
- {
- "name": "diffuseUseTexture",
- "displayName": " Use Texture",
- "description": "Whether to use the Diffuse AO map.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "diffuseTextureMapUv",
- "displayName": " UV",
- "description": "Diffuse AO map UV set.",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_diffuseOcclusionMapUvIndex"
- }
- },
- {
- "name": "diffuseFactor",
- "displayName": " Factor",
- "description": "Strength factor for scaling the values of Diffuse AO",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "softMax": 2.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_diffuseOcclusionFactor"
- }
- },
- {
- "name": "specularTextureMap",
- "displayName": "Specular Cavity",
- "description": "Texture for defining occlusion area for specular lighting.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_specularOcclusionMap"
- }
- },
- {
- "name": "specularUseTexture",
- "displayName": " Use Texture",
- "description": "Whether to use the Specular Cavity map.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "specularTextureMapUv",
- "displayName": " UV",
- "description": "Specular Cavity map UV set.",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_specularOcclusionMapUvIndex"
- }
- },
- {
- "name": "specularFactor",
- "displayName": " Factor",
- "description": "Strength factor for scaling the values of Specular Cavity",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "softMax": 2.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_specularOcclusionFactor"
- }
- }
- ],
- "emissive": [
- {
- "name": "enable",
- "displayName": "Enable",
- "description": "Enable the emissive group",
- "type": "Bool",
- "defaultValue": false
- },
- {
- "name": "unit",
- "displayName": "Units",
- "description": "The photometric units of the Intensity property.",
- "type": "Enum",
- "enumValues": ["Ev100"],
- "defaultValue": "Ev100"
- },
- {
- "name": "color",
- "displayName": "Color",
- "description": "Color is displayed as sRGB but the values are stored as linear color.",
- "type": "Color",
- "defaultValue": [ 1.0, 1.0, 1.0 ],
- "connection": {
- "type": "ShaderInput",
- "name": "m_emissiveColor"
- }
- },
- {
- "name": "intensity",
- "displayName": "Intensity",
- "description": "The amount of energy emitted.",
- "type": "Float",
- "defaultValue": 4,
- "min": -10,
- "max": 20,
- "softMin": -6,
- "softMax": 16
- },
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "Texture for defining emissive area.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_emissiveMap"
- }
- },
- {
- "name": "useTexture",
- "displayName": "Use Texture",
- "description": "Whether to use the texture.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Emissive map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_emissiveMapUvIndex"
- }
- }
- ],
- "parallax": [
- {
- "name": "textureMap",
- "displayName": "Height Map",
- "description": "Displacement height map to create parallax effect.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_heightmap"
- }
- },
- {
- "name": "useTexture",
- "displayName": "Use Texture",
- "description": "Whether to use the height map.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Height map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_parallaxUvIndex"
- }
- },
- {
- "name": "factor",
- "displayName": "Height Map Scale",
- "description": "The total height of the height map in local model units.",
- "type": "Float",
- "defaultValue": 0.05,
- "min": 0.0,
- "softMax": 0.1,
- "connection": {
- "type": "ShaderInput",
- "name": "m_heightmapScale"
- }
- },
- {
- "name": "offset",
- "displayName": "Offset",
- "description": "Adjusts the overall displacement amount in local model units.",
- "type": "Float",
- "defaultValue": 0.0,
- "softMin": -0.1,
- "softMax": 0.1,
- "connection": {
- "type": "ShaderInput",
- "name": "m_heightmapOffset"
- }
- },
- {
- "name": "algorithm",
- "displayName": "Algorithm",
- "description": "Select the algorithm to use for parallax mapping.",
- "type": "Enum",
- "enumValues": [ "Basic", "Steep", "POM", "Relief", "ContactRefinement" ],
- "defaultValue": "POM",
- "connection": {
- "type": "ShaderOption",
- "name": "o_parallax_algorithm"
- }
- },
- {
- "name": "quality",
- "displayName": "Quality",
- "description": "Quality of parallax mapping.",
- "type": "Enum",
- "enumValues": [ "Low", "Medium", "High", "Ultra" ],
- "defaultValue": "Low",
- "connection": {
- "type": "ShaderOption",
- "name": "o_parallax_quality"
- }
- },
- {
- "name": "pdo",
- "displayName": "Pixel Depth Offset",
- "description": "Enable PDO to offset the original pixel depths. This will affect any shaders using depth, for example, when receiving shadows.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderOption",
- "name": "o_parallax_enablePixelDepthOffset"
- }
- },
- {
- "name": "showClipping",
- "displayName": "Show Clipping",
- "description": "Highlight areas where the height map is clipped by the mesh surface.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderOption",
- "name": "o_parallax_highlightClipping"
- }
- }
- ],
- "irradiance": [
- // Note: this property group is used in the DiffuseGlobalIllumination pass and not by the main forward shader
- {
- "name": "color",
- "displayName": "Color",
- "description": "Color is displayed as sRGB but the values are stored as linear color.",
- "type": "Color",
- "defaultValue": [ 1.0, 1.0, 1.0 ]
- },
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "Strength factor for scaling the irradiance color values. Zero (0.0) is black, white (1.0) is full color.",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 1.0
- }
- ]
- }
+ ]
},
"shaders": [
{
@@ -1199,4 +1196,4 @@
"UV0": "Tiled",
"UV1": "Unwrapped"
}
-}
+}
\ No newline at end of file
From e173840bab5216460ee59d2be185b9f387632ef4 Mon Sep 17 00:00:00 2001
From: santorac <55155825+santorac@users.noreply.github.com>
Date: Fri, 28 Jan 2022 09:40:33 -0800
Subject: [PATCH 03/26] Moved the StandardPbr property groups around to be in
their original order.
Signed-off-by: santorac <55155825+santorac@users.noreply.github.com>
---
.../Materials/Types/StandardPBR.materialtype | 752 +++++++++---------
1 file changed, 376 insertions(+), 376 deletions(-)
diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
index 571b3301b7..a08fe60fd5 100644
--- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
+++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
@@ -11,96 +11,6 @@
],
"propertyLayout": {
"propertyGroups": [
- {
- "name": "general",
- "displayName": "General Settings",
- "description": "General settings.",
- "properties": [
- {
- "name": "doubleSided",
- "displayName": "Double-sided",
- "description": "Whether to render back-faces or just front-faces.",
- "type": "Bool"
- },
- {
- "name": "applySpecularAA",
- "displayName": "Apply Specular AA",
- "description": "Whether to apply specular anti-aliasing in the shader.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderOption",
- "name": "o_applySpecularAA"
- }
- },
- {
- "name": "enableShadows",
- "displayName": "Enable Shadows",
- "description": "Whether to use the shadow maps.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableShadows"
- }
- },
- {
- "name": "enableDirectionalLights",
- "displayName": "Enable Directional Lights",
- "description": "Whether to use directional lights.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableDirectionalLights"
- }
- },
- {
- "name": "enablePunctualLights",
- "displayName": "Enable Punctual Lights",
- "description": "Whether to use punctual lights.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enablePunctualLights"
- }
- },
- {
- "name": "enableAreaLights",
- "displayName": "Enable Area Lights",
- "description": "Whether to use area lights.",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableAreaLights"
- }
- },
- {
- "name": "enableIBL",
- "displayName": "Enable IBL",
- "description": "Whether to use Image Based Lighting (IBL).",
- "type": "Bool",
- "defaultValue": true,
- "connection": {
- "type": "ShaderOption",
- "name": "o_enableIBL"
- }
- },
- {
- "name": "forwardPassIBLSpecular",
- "displayName": "Forward Pass IBL Specular",
- "description": "Whether to apply IBL specular in the forward pass.",
- "type": "Bool",
- "defaultValue": false,
- "connection": {
- "type": "ShaderOption",
- "name": "o_materialUseForwardPassIBLSpecular"
- }
- }
- ]
- },
{
"name": "baseColor",
"displayName": "Base Color",
@@ -360,146 +270,6 @@
}
]
},
- {
- "name": "clearCoat",
- "displayName": "Clear Coat",
- "description": "Properties for configuring gloss clear coat",
- "properties": [
- {
- "name": "enable",
- "displayName": "Enable",
- "description": "Enable clear coat",
- "type": "Bool",
- "defaultValue": false
- },
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "Strength factor for scaling the percentage of effect applied",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatFactor"
- }
- },
- {
- "name": "influenceMap",
- "displayName": " Influence Map",
- "description": "Strength factor texture",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatInfluenceMap"
- }
- },
- {
- "name": "useInfluenceMap",
- "displayName": " Use Texture",
- "description": "Whether to use the texture, or just default to the Factor value.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "influenceMapUv",
- "displayName": " UV",
- "description": "Strength factor map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatInfluenceMapUvIndex"
- }
- },
- {
- "name": "roughness",
- "displayName": "Roughness",
- "description": "Clear coat layer roughness",
- "type": "Float",
- "defaultValue": 0.0,
- "min": 0.0,
- "max": 1.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatRoughness"
- }
- },
- {
- "name": "roughnessMap",
- "displayName": " Roughness Map",
- "description": "Texture for defining surface roughness",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatRoughnessMap"
- }
- },
- {
- "name": "useRoughnessMap",
- "displayName": " Use Texture",
- "description": "Whether to use the texture, or just default to the roughness value.",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "roughnessMapUv",
- "displayName": " UV",
- "description": "Roughness map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatRoughnessMapUvIndex"
- }
- },
- {
- "name": "normalStrength",
- "displayName": "Normal Strength",
- "description": "Scales the impact of the clear coat normal map",
- "type": "Float",
- "defaultValue": 1.0,
- "min": 0.0,
- "max": 2.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatNormalStrength"
- }
- },
- {
- "name": "normalMap",
- "displayName": "Normal Map",
- "description": "Normal map for clear coat layer, as top layer material clear coat doesn't affect by base layer normal map",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatNormalMap"
- }
- },
- {
- "name": "useNormalMap",
- "displayName": " Use Texture",
- "description": "Whether to use the normal map",
- "type": "Bool",
- "defaultValue": true
- },
- {
- "name": "normalMapUv",
- "displayName": " UV",
- "description": "Normal map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_clearCoatNormalMapUvIndex"
- }
- }
- ]
- },
{
"name": "normal",
"displayName": "Normal",
@@ -571,152 +341,6 @@
}
]
},
- {
- "name": "opacity",
- "displayName": "Opacity",
- "description": "Properties for configuring the materials transparency.",
- "properties": [
- {
- "name": "mode",
- "displayName": "Opacity Mode",
- "description": "Indicates the general approach how transparency is to be applied.",
- "type": "Enum",
- "enumValues": [ "Opaque", "Cutout", "Blended", "TintedTransparent" ],
- "defaultValue": "Opaque",
- "connection": {
- "type": "ShaderOption",
- "name": "o_opacity_mode"
- }
- },
- {
- "name": "alphaSource",
- "displayName": "Alpha Source",
- "description": "Indicates whether to get the opacity texture from the Base Color map (Packed) or from a separate greyscale texture (Split).",
- "type": "Enum",
- "enumValues": [ "Packed", "Split", "None" ],
- "defaultValue": "Packed",
- "connection": {
- "type": "ShaderOption",
- "name": "o_opacity_source"
- }
- },
- {
- "name": "textureMap",
- "displayName": "Texture",
- "description": "Texture for defining surface opacity.",
- "type": "Image",
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityMap"
- }
- },
- {
- "name": "textureMapUv",
- "displayName": "UV",
- "description": "Opacity map UV set",
- "type": "Enum",
- "enumIsUv": true,
- "defaultValue": "Tiled",
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityMapUvIndex"
- }
- },
- {
- "name": "factor",
- "displayName": "Factor",
- "description": "Factor for cutout threshold and blending",
- "type": "Float",
- "min": 0.0,
- "max": 1.0,
- "defaultValue": 0.5,
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityFactor"
- }
- },
- {
- "name": "alphaAffectsSpecular",
- "displayName": "Alpha affects specular",
- "description": "How much the alpha value should also affect specular reflection. This should be 0.0 for materials where light can transmit through their physical surface (like glass), but 1.0 when alpha determines the very presence of a surface (like hair or grass)",
- "type": "float",
- "min": 0.0,
- "max": 1.0,
- "defaultValue": 0.0,
- "connection": {
- "type": "ShaderInput",
- "name": "m_opacityAffectsSpecularFactor"
- }
- }
- ]
- },
- {
- "name": "uv",
- "displayName": "UVs",
- "description": "Properties for configuring UV transforms.",
- "properties": [
- {
- "name": "center",
- "displayName": "Center",
- "description": "Center point for scaling and rotation transformations.",
- "type": "vector2",
- "vectorLabels": [ "U", "V" ],
- "defaultValue": [ 0.5, 0.5 ]
- },
- {
- "name": "tileU",
- "displayName": "Tile U",
- "description": "Scales texture coordinates in U.",
- "type": "float",
- "defaultValue": 1.0,
- "step": 0.1
- },
- {
- "name": "tileV",
- "displayName": "Tile V",
- "description": "Scales texture coordinates in V.",
- "type": "float",
- "defaultValue": 1.0,
- "step": 0.1
- },
- {
- "name": "offsetU",
- "displayName": "Offset U",
- "description": "Offsets texture coordinates in the U direction.",
- "type": "float",
- "defaultValue": 0.0,
- "min": -1.0,
- "max": 1.0
- },
- {
- "name": "offsetV",
- "displayName": "Offset V",
- "description": "Offsets texture coordinates in the V direction.",
- "type": "float",
- "defaultValue": 0.0,
- "min": -1.0,
- "max": 1.0
- },
- {
- "name": "rotateDegrees",
- "displayName": "Rotate",
- "description": "Rotates the texture coordinates (degrees).",
- "type": "float",
- "defaultValue": 0.0,
- "min": -180.0,
- "max": 180.0,
- "step": 1.0
- },
- {
- "name": "scale",
- "displayName": "Scale",
- "description": "Scales texture coordinates in both U and V.",
- "type": "float",
- "defaultValue": 1.0,
- "step": 0.1
- }
- ]
- },
{
"name": "occlusion",
"displayName": "Occlusion",
@@ -881,6 +505,146 @@
}
]
},
+ {
+ "name": "clearCoat",
+ "displayName": "Clear Coat",
+ "description": "Properties for configuring gloss clear coat",
+ "properties": [
+ {
+ "name": "enable",
+ "displayName": "Enable",
+ "description": "Enable clear coat",
+ "type": "Bool",
+ "defaultValue": false
+ },
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Strength factor for scaling the percentage of effect applied",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatFactor"
+ }
+ },
+ {
+ "name": "influenceMap",
+ "displayName": " Influence Map",
+ "description": "Strength factor texture",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatInfluenceMap"
+ }
+ },
+ {
+ "name": "useInfluenceMap",
+ "displayName": " Use Texture",
+ "description": "Whether to use the texture, or just default to the Factor value.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "influenceMapUv",
+ "displayName": " UV",
+ "description": "Strength factor map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatInfluenceMapUvIndex"
+ }
+ },
+ {
+ "name": "roughness",
+ "displayName": "Roughness",
+ "description": "Clear coat layer roughness",
+ "type": "Float",
+ "defaultValue": 0.0,
+ "min": 0.0,
+ "max": 1.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatRoughness"
+ }
+ },
+ {
+ "name": "roughnessMap",
+ "displayName": " Roughness Map",
+ "description": "Texture for defining surface roughness",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatRoughnessMap"
+ }
+ },
+ {
+ "name": "useRoughnessMap",
+ "displayName": " Use Texture",
+ "description": "Whether to use the texture, or just default to the roughness value.",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "roughnessMapUv",
+ "displayName": " UV",
+ "description": "Roughness map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatRoughnessMapUvIndex"
+ }
+ },
+ {
+ "name": "normalStrength",
+ "displayName": "Normal Strength",
+ "description": "Scales the impact of the clear coat normal map",
+ "type": "Float",
+ "defaultValue": 1.0,
+ "min": 0.0,
+ "max": 2.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatNormalStrength"
+ }
+ },
+ {
+ "name": "normalMap",
+ "displayName": "Normal Map",
+ "description": "Normal map for clear coat layer, as top layer material clear coat doesn't affect by base layer normal map",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatNormalMap"
+ }
+ },
+ {
+ "name": "useNormalMap",
+ "displayName": " Use Texture",
+ "description": "Whether to use the normal map",
+ "type": "Bool",
+ "defaultValue": true
+ },
+ {
+ "name": "normalMapUv",
+ "displayName": " UV",
+ "description": "Normal map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_clearCoatNormalMapUvIndex"
+ }
+ }
+ ]
+ },
{
"name": "parallax",
"displayName": "Displacement",
@@ -989,6 +753,152 @@
}
]
},
+ {
+ "name": "opacity",
+ "displayName": "Opacity",
+ "description": "Properties for configuring the materials transparency.",
+ "properties": [
+ {
+ "name": "mode",
+ "displayName": "Opacity Mode",
+ "description": "Indicates the general approach how transparency is to be applied.",
+ "type": "Enum",
+ "enumValues": [ "Opaque", "Cutout", "Blended", "TintedTransparent" ],
+ "defaultValue": "Opaque",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_opacity_mode"
+ }
+ },
+ {
+ "name": "alphaSource",
+ "displayName": "Alpha Source",
+ "description": "Indicates whether to get the opacity texture from the Base Color map (Packed) or from a separate greyscale texture (Split).",
+ "type": "Enum",
+ "enumValues": [ "Packed", "Split", "None" ],
+ "defaultValue": "Packed",
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_opacity_source"
+ }
+ },
+ {
+ "name": "textureMap",
+ "displayName": "Texture",
+ "description": "Texture for defining surface opacity.",
+ "type": "Image",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityMap"
+ }
+ },
+ {
+ "name": "textureMapUv",
+ "displayName": "UV",
+ "description": "Opacity map UV set",
+ "type": "Enum",
+ "enumIsUv": true,
+ "defaultValue": "Tiled",
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityMapUvIndex"
+ }
+ },
+ {
+ "name": "factor",
+ "displayName": "Factor",
+ "description": "Factor for cutout threshold and blending",
+ "type": "Float",
+ "min": 0.0,
+ "max": 1.0,
+ "defaultValue": 0.5,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityFactor"
+ }
+ },
+ {
+ "name": "alphaAffectsSpecular",
+ "displayName": "Alpha affects specular",
+ "description": "How much the alpha value should also affect specular reflection. This should be 0.0 for materials where light can transmit through their physical surface (like glass), but 1.0 when alpha determines the very presence of a surface (like hair or grass)",
+ "type": "float",
+ "min": 0.0,
+ "max": 1.0,
+ "defaultValue": 0.0,
+ "connection": {
+ "type": "ShaderInput",
+ "name": "m_opacityAffectsSpecularFactor"
+ }
+ }
+ ]
+ },
+ {
+ "name": "uv",
+ "displayName": "UVs",
+ "description": "Properties for configuring UV transforms.",
+ "properties": [
+ {
+ "name": "center",
+ "displayName": "Center",
+ "description": "Center point for scaling and rotation transformations.",
+ "type": "vector2",
+ "vectorLabels": [ "U", "V" ],
+ "defaultValue": [ 0.5, 0.5 ]
+ },
+ {
+ "name": "tileU",
+ "displayName": "Tile U",
+ "description": "Scales texture coordinates in U.",
+ "type": "float",
+ "defaultValue": 1.0,
+ "step": 0.1
+ },
+ {
+ "name": "tileV",
+ "displayName": "Tile V",
+ "description": "Scales texture coordinates in V.",
+ "type": "float",
+ "defaultValue": 1.0,
+ "step": 0.1
+ },
+ {
+ "name": "offsetU",
+ "displayName": "Offset U",
+ "description": "Offsets texture coordinates in the U direction.",
+ "type": "float",
+ "defaultValue": 0.0,
+ "min": -1.0,
+ "max": 1.0
+ },
+ {
+ "name": "offsetV",
+ "displayName": "Offset V",
+ "description": "Offsets texture coordinates in the V direction.",
+ "type": "float",
+ "defaultValue": 0.0,
+ "min": -1.0,
+ "max": 1.0
+ },
+ {
+ "name": "rotateDegrees",
+ "displayName": "Rotate",
+ "description": "Rotates the texture coordinates (degrees).",
+ "type": "float",
+ "defaultValue": 0.0,
+ "min": -180.0,
+ "max": 180.0,
+ "step": 1.0
+ },
+ {
+ "name": "scale",
+ "displayName": "Scale",
+ "description": "Scales texture coordinates in both U and V.",
+ "type": "float",
+ "defaultValue": 1.0,
+ "step": 0.1
+ }
+ ]
+ },
{
// Note: this property group is used in the DiffuseGlobalIllumination pass, it is not read by the StandardPBR shader
"name": "irradiance",
@@ -1012,6 +922,96 @@
"max": 1.0
}
]
+ },
+ {
+ "name": "general",
+ "displayName": "General Settings",
+ "description": "General settings.",
+ "properties": [
+ {
+ "name": "doubleSided",
+ "displayName": "Double-sided",
+ "description": "Whether to render back-faces or just front-faces.",
+ "type": "Bool"
+ },
+ {
+ "name": "applySpecularAA",
+ "displayName": "Apply Specular AA",
+ "description": "Whether to apply specular anti-aliasing in the shader.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_applySpecularAA"
+ }
+ },
+ {
+ "name": "enableShadows",
+ "displayName": "Enable Shadows",
+ "description": "Whether to use the shadow maps.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableShadows"
+ }
+ },
+ {
+ "name": "enableDirectionalLights",
+ "displayName": "Enable Directional Lights",
+ "description": "Whether to use directional lights.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableDirectionalLights"
+ }
+ },
+ {
+ "name": "enablePunctualLights",
+ "displayName": "Enable Punctual Lights",
+ "description": "Whether to use punctual lights.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enablePunctualLights"
+ }
+ },
+ {
+ "name": "enableAreaLights",
+ "displayName": "Enable Area Lights",
+ "description": "Whether to use area lights.",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableAreaLights"
+ }
+ },
+ {
+ "name": "enableIBL",
+ "displayName": "Enable IBL",
+ "description": "Whether to use Image Based Lighting (IBL).",
+ "type": "Bool",
+ "defaultValue": true,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_enableIBL"
+ }
+ },
+ {
+ "name": "forwardPassIBLSpecular",
+ "displayName": "Forward Pass IBL Specular",
+ "description": "Whether to apply IBL specular in the forward pass.",
+ "type": "Bool",
+ "defaultValue": false,
+ "connection": {
+ "type": "ShaderOption",
+ "name": "o_materialUseForwardPassIBLSpecular"
+ }
+ }
+ ]
}
]
},
From 991f97a6662ff5870f8342847654497f07144eff Mon Sep 17 00:00:00 2001
From: brianherrera
Date: Fri, 28 Jan 2022 13:38:38 -0800
Subject: [PATCH 04/26] Add overall timeout for the AR pipeline
Signed-off-by: brianherrera
---
scripts/build/Jenkins/Jenkinsfile | 231 +++++++++++++++---------------
1 file changed, 118 insertions(+), 113 deletions(-)
diff --git a/scripts/build/Jenkins/Jenkinsfile b/scripts/build/Jenkins/Jenkinsfile
index b21d9d832d..3bef8601bc 100644
--- a/scripts/build/Jenkins/Jenkinsfile
+++ b/scripts/build/Jenkins/Jenkinsfile
@@ -12,6 +12,9 @@ INCREMENTAL_BUILD_SCRIPT_PATH = 'scripts/build/bootstrap/incremental_build_util.
EBS_SNAPSHOT_SCRIPT_PATH = 'scripts/build/tools/ebs_snapshot.py'
PIPELINE_RETRY_ATTEMPTS = 3
+// Number of minutes of inactivity in all stages of the pipeline to reach the timeout
+PIPELINE_TIMEOUT = 60
+
EMPTY_JSON = readJSON text: '{}'
ENGINE_REPOSITORY_NAME = 'o3de'
@@ -753,143 +756,145 @@ def pipelineConfig = {}
// Start Pipeline
try {
- stage('Setup Pipeline') {
- node('controller') {
- def envVarList = []
- if(isUnix()) {
- envVarList.add('IS_UNIX=1')
- }
- withEnv(envVarList) {
- timestamps {
- repositoryUrl = scm.getUserRemoteConfigs()[0].getUrl()
- // repositoryName is the full repository name
- repositoryName = (repositoryUrl =~ /https:\/\/github.com\/(.*)\.git/)[0][1]
- env.REPOSITORY_NAME = repositoryName
- (projectName, pipelineName) = GetRunningPipelineName(env.JOB_NAME) // env.JOB_NAME is the name of the job given by Jenkins
- env.PIPELINE_NAME = pipelineName
- if(env.BRANCH_NAME) {
- branchName = env.BRANCH_NAME
- } else {
- branchName = scm.branches[0].name // for non-multibranch pipelines
- env.BRANCH_NAME = branchName // so scripts that read this environment have it (e.g. incremental_build_util.py)
- }
- if(env.CHANGE_TARGET) {
- // PR builds
- if(BUILD_SNAPSHOTS.contains(env.CHANGE_TARGET)) {
- snapshot = env.CHANGE_TARGET
- echo "Snapshot for destination branch \"${env.CHANGE_TARGET}\" found."
- } else {
- snapshot = DEFAULT_BUILD_SNAPSHOT
- echo "Snapshot for destination branch \"${env.CHANGE_TARGET}\" does not exist, defaulting to snapshot \"${snapshot}\""
+ timeout(time: PIPELINE_TIMEOUT, unit: 'MINUTES', activity: true) {
+ stage('Setup Pipeline') {
+ node('controller') {
+ def envVarList = []
+ if(isUnix()) {
+ envVarList.add('IS_UNIX=1')
+ }
+ withEnv(envVarList) {
+ timestamps {
+ repositoryUrl = scm.getUserRemoteConfigs()[0].getUrl()
+ // repositoryName is the full repository name
+ repositoryName = (repositoryUrl =~ /https:\/\/github.com\/(.*)\.git/)[0][1]
+ env.REPOSITORY_NAME = repositoryName
+ (projectName, pipelineName) = GetRunningPipelineName(env.JOB_NAME) // env.JOB_NAME is the name of the job given by Jenkins
+ env.PIPELINE_NAME = pipelineName
+ if(env.BRANCH_NAME) {
+ branchName = env.BRANCH_NAME
+ } else {
+ branchName = scm.branches[0].name // for non-multibranch pipelines
+ env.BRANCH_NAME = branchName // so scripts that read this environment have it (e.g. incremental_build_util.py)
}
- } else {
- // Non-PR builds
- pipelineParameters.add(choice(defaultValue: DEFAULT_BUILD_SNAPSHOT, name: 'SNAPSHOT', choices: BUILD_SNAPSHOTS_WITH_EMPTY, description: 'Selects the build snapshot to use. A more diverted snapshot will cause longer build times, but will not cause build failures.'))
- snapshot = env.SNAPSHOT
- echo "Snapshot \"${snapshot}\" selected."
- }
- pipelineProperties.add(disableConcurrentBuilds())
+ if(env.CHANGE_TARGET) {
+ // PR builds
+ if(BUILD_SNAPSHOTS.contains(env.CHANGE_TARGET)) {
+ snapshot = env.CHANGE_TARGET
+ echo "Snapshot for destination branch \"${env.CHANGE_TARGET}\" found."
+ } else {
+ snapshot = DEFAULT_BUILD_SNAPSHOT
+ echo "Snapshot for destination branch \"${env.CHANGE_TARGET}\" does not exist, defaulting to snapshot \"${snapshot}\""
+ }
+ } else {
+ // Non-PR builds
+ pipelineParameters.add(choice(defaultValue: DEFAULT_BUILD_SNAPSHOT, name: 'SNAPSHOT', choices: BUILD_SNAPSHOTS_WITH_EMPTY, description: 'Selects the build snapshot to use. A more diverted snapshot will cause longer build times, but will not cause build failures.'))
+ snapshot = env.SNAPSHOT
+ echo "Snapshot \"${snapshot}\" selected."
+ }
+ pipelineProperties.add(disableConcurrentBuilds())
- echo "Running repository: \"${repositoryName}\", pipeline: \"${pipelineName}\", branch: \"${branchName}\", CHANGE_ID: \"${env.CHANGE_ID}\", GIT_COMMMIT: \"${scm.GIT_COMMIT}\"..."
+ echo "Running repository: \"${repositoryName}\", pipeline: \"${pipelineName}\", branch: \"${branchName}\", CHANGE_ID: \"${env.CHANGE_ID}\", GIT_COMMMIT: \"${scm.GIT_COMMIT}\"..."
- CheckoutBootstrapScripts(branchName)
+ CheckoutBootstrapScripts(branchName)
- // Load configs
- pipelineConfig = LoadPipelineConfig(pipelineName, branchName)
+ // Load configs
+ pipelineConfig = LoadPipelineConfig(pipelineName, branchName)
- // Add each platform as a parameter that the user can disable if needed
- if (!IsPullRequest(branchName)) {
- pipelineParameters.add(stringParam(defaultValue: '', description: 'Filters and overrides the list of jobs to run for each of the below platforms (comma-separated). Can\'t be used during a pull request.', name: 'JOB_LIST_OVERRIDE'))
+ // Add each platform as a parameter that the user can disable if needed
+ if (!IsPullRequest(branchName)) {
+ pipelineParameters.add(stringParam(defaultValue: '', description: 'Filters and overrides the list of jobs to run for each of the below platforms (comma-separated). Can\'t be used during a pull request.', name: 'JOB_LIST_OVERRIDE'))
+ pipelineConfig.platforms.each { platform ->
+ pipelineParameters.add(booleanParam(defaultValue: true, description: '', name: platform.key))
+ }
+ }
+ // Add additional Jenkins parameters
pipelineConfig.platforms.each { platform ->
- pipelineParameters.add(booleanParam(defaultValue: true, description: '', name: platform.key))
- }
- }
- // Add additional Jenkins parameters
- pipelineConfig.platforms.each { platform ->
- platformEnv = platform.value.PIPELINE_ENV
- pipelineJenkinsParameters = platformEnv['PIPELINE_JENKINS_PARAMETERS'] ?: [:]
- jenkinsParametersToAdd = pipelineJenkinsParameters[pipelineName] ?: [:]
- jenkinsParametersToAdd.each{ jenkinsParameter ->
- defaultValue = jenkinsParameter['default_value']
- // Use last run's value as default value so we can save values in different Jenkins environment
- if (jenkinsParameter['use_last_run_value']?.toBoolean()) {
- defaultValue = params."${jenkinsParameter['parameter_name']}" ?: jenkinsParameter['default_value']
- }
- switch (jenkinsParameter['parameter_type']) {
- case 'string':
- pipelineParameters.add(stringParam(defaultValue: defaultValue,
- description: jenkinsParameter['description'],
- name: jenkinsParameter['parameter_name']
- ))
- break
- case 'boolean':
- pipelineParameters.add(booleanParam(defaultValue: defaultValue,
- description: jenkinsParameter['description'],
- name: jenkinsParameter['parameter_name']
- ))
- break
- case 'password':
- pipelineParameters.add(password(defaultValue: defaultValue,
- description: jenkinsParameter['description'],
- name: jenkinsParameter['parameter_name']
- ))
- break
+ platformEnv = platform.value.PIPELINE_ENV
+ pipelineJenkinsParameters = platformEnv['PIPELINE_JENKINS_PARAMETERS'] ?: [:]
+ jenkinsParametersToAdd = pipelineJenkinsParameters[pipelineName] ?: [:]
+ jenkinsParametersToAdd.each{ jenkinsParameter ->
+ defaultValue = jenkinsParameter['default_value']
+ // Use last run's value as default value so we can save values in different Jenkins environment
+ if (jenkinsParameter['use_last_run_value']?.toBoolean()) {
+ defaultValue = params."${jenkinsParameter['parameter_name']}" ?: jenkinsParameter['default_value']
+ }
+ switch (jenkinsParameter['parameter_type']) {
+ case 'string':
+ pipelineParameters.add(stringParam(defaultValue: defaultValue,
+ description: jenkinsParameter['description'],
+ name: jenkinsParameter['parameter_name']
+ ))
+ break
+ case 'boolean':
+ pipelineParameters.add(booleanParam(defaultValue: defaultValue,
+ description: jenkinsParameter['description'],
+ name: jenkinsParameter['parameter_name']
+ ))
+ break
+ case 'password':
+ pipelineParameters.add(password(defaultValue: defaultValue,
+ description: jenkinsParameter['description'],
+ name: jenkinsParameter['parameter_name']
+ ))
+ break
+ }
}
}
- }
- pipelineProperties.add(parameters(pipelineParameters.unique()))
- properties(pipelineProperties)
+ pipelineProperties.add(parameters(pipelineParameters.unique()))
+ properties(pipelineProperties)
- // Stash the INCREMENTAL_BUILD_SCRIPT_PATH and EBS_SNAPSHOT_SCRIPT_PATH since all nodes will use it
- stash name: 'incremental_build_script',
- includes: INCREMENTAL_BUILD_SCRIPT_PATH
- if (fileExists(EBS_SNAPSHOT_SCRIPT_PATH)) {
- stash name: 'ebs_snapshot_script',
- includes: EBS_SNAPSHOT_SCRIPT_PATH
+ // Stash the INCREMENTAL_BUILD_SCRIPT_PATH and EBS_SNAPSHOT_SCRIPT_PATH since all nodes will use it
+ stash name: 'incremental_build_script',
+ includes: INCREMENTAL_BUILD_SCRIPT_PATH
+ if (fileExists(EBS_SNAPSHOT_SCRIPT_PATH)) {
+ stash name: 'ebs_snapshot_script',
+ includes: EBS_SNAPSHOT_SCRIPT_PATH
+ }
}
- }
+ }
}
}
- }
- if(env.BUILD_NUMBER == '1' && !IsPullRequest(branchName)) {
- // Exit pipeline early on the intial build. This allows Jenkins to load the pipeline for the branch and enables users
- // to select build parameters on their first actual build. See https://issues.jenkins.io/browse/JENKINS-41929
- currentBuild.result = 'SUCCESS'
- return
- }
+ if(env.BUILD_NUMBER == '1' && !IsPullRequest(branchName)) {
+ // Exit pipeline early on the intial build. This allows Jenkins to load the pipeline for the branch and enables users
+ // to select build parameters on their first actual build. See https://issues.jenkins.io/browse/JENKINS-41929
+ currentBuild.result = 'SUCCESS'
+ return
+ }
- def someBuildHappened = false
+ def someBuildHappened = false
- // Build and Post-Build Testing Stage
- def buildConfigs = [:]
+ // Build and Post-Build Testing Stage
+ def buildConfigs = [:]
- // Platform Builds run on EC2
- pipelineConfig.platforms.each { platform ->
- platform.value.build_types.each { build_job ->
- if (IsJobEnabled(branchName, build_job, pipelineName, platform.key)) { // User can filter jobs, jobs are tagged by pipeline
- def envVars = GetBuildEnvVars(platform.value.PIPELINE_ENV ?: EMPTY_JSON, build_job.value.PIPELINE_ENV ?: EMPTY_JSON, pipelineName)
- envVars['JENKINS_JOB_NAME'] = env.JOB_NAME // Save original Jenkins job name to JENKINS_JOB_NAME
- envVars['JOB_NAME'] = "${branchName}_${platform.key}_${build_job.key}" // backwards compatibility, some scripts rely on this
- someBuildHappened = true
+ // Platform Builds run on EC2
+ pipelineConfig.platforms.each { platform ->
+ platform.value.build_types.each { build_job ->
+ if (IsJobEnabled(branchName, build_job, pipelineName, platform.key)) { // User can filter jobs, jobs are tagged by pipeline
+ def envVars = GetBuildEnvVars(platform.value.PIPELINE_ENV ?: EMPTY_JSON, build_job.value.PIPELINE_ENV ?: EMPTY_JSON, pipelineName)
+ envVars['JENKINS_JOB_NAME'] = env.JOB_NAME // Save original Jenkins job name to JENKINS_JOB_NAME
+ envVars['JOB_NAME'] = "${branchName}_${platform.key}_${build_job.key}" // backwards compatibility, some scripts rely on this
+ someBuildHappened = true
- buildConfigs["${platform.key} [${build_job.key}]"] = CreateBuildJobs(pipelineConfig, platform, build_job, envVars, branchName, pipelineName, repositoryName, projectName)
+ buildConfigs["${platform.key} [${build_job.key}]"] = CreateBuildJobs(pipelineConfig, platform, build_job, envVars, branchName, pipelineName, repositoryName, projectName)
+ }
}
}
- }
- timestamps {
+ timestamps {
- stage('Build') {
- parallel buildConfigs // Run parallel builds
+ stage('Build') {
+ parallel buildConfigs // Run parallel builds
+ }
+
+ echo 'All builds successful'
+ }
+ if (!someBuildHappened) {
+ currentBuild.result = 'NOT_BUILT'
}
-
- echo 'All builds successful'
- }
- if (!someBuildHappened) {
- currentBuild.result = 'NOT_BUILT'
}
}
catch(Exception e) {
From 5f7a30f8dafac41bc02af4d315661be183e86132 Mon Sep 17 00:00:00 2001
From: dmcdiarmid-ly <63674186+dmcdiarmid-ly@users.noreply.github.com>
Date: Sat, 29 Jan 2022 19:37:46 -0700
Subject: [PATCH 05/26] Added DiffuseProbeGrid Visualization passes, shaders,
and editor controls. Changed the DiffuseGI passes to override IsEnabled()
instead of exiting early from FrameBeginInternal.
Signed-off-by: dmcdiarmid-ly <63674186+dmcdiarmid-ly@users.noreply.github.com>
---
.../Assets/Models/DiffuseProbeSphere.fbx | 3 +
.../Passes/DiffuseGlobalIllumination.pass | 37 ++-
...ridVisualizationAccelerationStructure.pass | 13 +
...iffuseProbeGridVisualizationComposite.pass | 40 +++
.../DiffuseProbeGridVisualizationPrepare.pass | 13 +
...ffuseProbeGridVisualizationRayTracing.pass | 54 ++++
.../Common/Assets/Passes/MainPipeline.pass | 31 +-
.../Common/Assets/Passes/OpaqueParent.pass | 11 +
.../Assets/Passes/PassTemplates.azasset | 16 +
...iffuseProbeGridVisualizationComposite.azsl | 67 ++++
...fuseProbeGridVisualizationComposite.shader | 42 +++
...GridVisualizationPrepare.precompiledshader | 34 ++
...dVisualizationRayTracing.precompiledshader | 34 ++
...tionRayTracingClosestHit.precompiledshader | 35 ++
...ualizationRayTracingMiss.precompiledshader | 35 ++
.../diffuseprobegridrelocation.azshader | Bin 79904 -> 79904 bytes
...probegridrelocation_dx12_0.azshadervariant | Bin 7994 -> 7974 bytes
...probegridrelocation_null_0.azshadervariant | Bin 486 -> 486 bytes
...obegridrelocation_vulkan_0.azshadervariant | Bin 11362 -> 11306 bytes
...fuseprobegridvisualizationprepare.azshader | Bin 0 -> 78689 bytes
...isualizationprepare_dx12_0.azshadervariant | Bin 0 -> 7346 bytes
...isualizationprepare_null_0.azshadervariant | Bin 0 -> 486 bytes
...ualizationprepare_vulkan_0.azshadervariant | Bin 0 -> 6554 bytes
...eprobegridvisualizationraytracing.azshader | Bin 0 -> 205596 bytes
...alizationraytracing_dx12_0.azshadervariant | Bin 0 -> 18458 bytes
...alizationraytracing_null_0.azshadervariant | Bin 0 -> 486 bytes
...izationraytracing_vulkan_0.azshadervariant | Bin 0 -> 12596 bytes
...visualizationraytracingclosesthit.azshader | Bin 0 -> 205606 bytes
...aytracingclosesthit_dx12_0.azshadervariant | Bin 0 -> 11774 bytes
...aytracingclosesthit_null_0.azshadervariant | Bin 0 -> 486 bytes
...tracingclosesthit_vulkan_0.azshadervariant | Bin 0 -> 1372 bytes
...begridvisualizationraytracingmiss.azshader | Bin 0 -> 205600 bytes
...ationraytracingmiss_dx12_0.azshadervariant | Bin 0 -> 10726 bytes
...ationraytracingmiss_null_0.azshadervariant | Bin 0 -> 486 bytes
...ionraytracingmiss_vulkan_0.azshadervariant | Bin 0 -> 1108 bytes
...iffuseProbeGridFeatureProcessorInterface.h | 3 +
.../Code/Source/CommonSystemComponent.cpp | 8 +
.../DiffuseProbeGrid.cpp | 97 +++++-
.../DiffuseProbeGrid.h | 44 ++-
.../DiffuseProbeGridBlendDistancePass.cpp | 31 +-
.../DiffuseProbeGridBlendDistancePass.h | 3 +-
.../DiffuseProbeGridBlendIrradiancePass.cpp | 31 +-
.../DiffuseProbeGridBlendIrradiancePass.h | 3 +-
.../DiffuseProbeGridBorderUpdatePass.cpp | 31 +-
.../DiffuseProbeGridBorderUpdatePass.h | 3 +-
.../DiffuseProbeGridClassificationPass.cpp | 39 +--
.../DiffuseProbeGridClassificationPass.h | 3 +-
.../DiffuseProbeGridFeatureProcessor.cpp | 150 ++++++++-
.../DiffuseProbeGridFeatureProcessor.h | 32 +-
.../DiffuseProbeGridRayTracingPass.cpp | 77 ++++-
.../DiffuseProbeGridRayTracingPass.h | 1 +
.../DiffuseProbeGridRelocationPass.cpp | 105 +++---
.../DiffuseProbeGridRelocationPass.h | 3 +-
.../DiffuseProbeGridRenderPass.cpp | 29 +-
.../DiffuseProbeGridRenderPass.h | 3 +-
...VisualizationAccelerationStructurePass.cpp | 192 +++++++++++
...idVisualizationAccelerationStructurePass.h | 53 ++++
...useProbeGridVisualizationCompositePass.cpp | 62 ++++
...ffuseProbeGridVisualizationCompositePass.h | 39 +++
...ffuseProbeGridVisualizationPreparePass.cpp | 270 ++++++++++++++++
...DiffuseProbeGridVisualizationPreparePass.h | 52 +++
...seProbeGridVisualizationRayTracingPass.cpp | 300 ++++++++++++++++++
...fuseProbeGridVisualizationRayTracingPass.h | 67 ++++
.../RayTracing/RayTracingFeatureProcessor.h | 2 +
.../Code/atom_feature_common_files.cmake | 8 +
.../RHI/RayTracingAccelerationStructure.h | 1 +
.../Include/Atom/RHI/RayTracingBufferPools.h | 2 +-
.../Code/Source/RHI/RayTracingBufferPools.cpp | 2 +-
.../DX12/Code/Source/RHI/RayTracingTlas.cpp | 2 +-
.../RHI/DX12/Code/Source/RHI/RayTracingTlas.h | 3 +-
.../RHI/Null/Code/Source/RHI/RayTracingTlas.h | 3 +-
.../Vulkan/Code/Source/RHI/CommandList.cpp | 20 ++
.../Code/Source/RHI/RayTracingBufferPools.h | 4 +-
.../Vulkan/Code/Source/RHI/RayTracingTlas.cpp | 2 +-
.../Vulkan/Code/Source/RHI/RayTracingTlas.h | 3 +-
.../DiffuseProbeGridComponentConstants.h | 1 +
.../DiffuseProbeGridComponentController.cpp | 41 ++-
.../DiffuseProbeGridComponentController.h | 7 +
.../EditorDiffuseProbeGridComponent.cpp | 37 ++-
.../EditorDiffuseProbeGridComponent.h | 6 +
80 files changed, 2185 insertions(+), 155 deletions(-)
create mode 100644 Gems/Atom/Feature/Common/Assets/Models/DiffuseProbeSphere.fbx
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationAccelerationStructure.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationComposite.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationPrepare.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationRayTracing.pass
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.azsl
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.shader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationPrepare.precompiledshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracing.precompiledshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingClosestHit.precompiledshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingMiss.precompiledshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare.azshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare_dx12_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare_null_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare_vulkan_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing.azshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing_dx12_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing_null_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing_vulkan_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingclosesthit.azshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingclosesthit_dx12_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingclosesthit_null_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingclosesthit_vulkan_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingmiss.azshader
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingmiss_dx12_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingmiss_null_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracingmiss_vulkan_0.azshadervariant
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationAccelerationStructurePass.cpp
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationAccelerationStructurePass.h
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationCompositePass.cpp
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationCompositePass.h
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationPreparePass.cpp
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationPreparePass.h
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingPass.cpp
create mode 100644 Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingPass.h
diff --git a/Gems/Atom/Feature/Common/Assets/Models/DiffuseProbeSphere.fbx b/Gems/Atom/Feature/Common/Assets/Models/DiffuseProbeSphere.fbx
new file mode 100644
index 0000000000..0fdf350c1f
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Models/DiffuseProbeSphere.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:18a2bfdeeabfbbf6397daab7c89f9f7321e4863b54a4669fa87e457cb113322c
+size 78256
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalIllumination.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalIllumination.pass
index 45278cd511..a70f4446a4 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalIllumination.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalIllumination.pass
@@ -42,6 +42,22 @@
},
"LoadAction": "Clear"
}
+ },
+ {
+ "Name": "VisualizationOutput",
+ "SlotType": "Output",
+ "ScopeAttachmentUsage": "RenderTarget",
+ "LoadStoreAction": {
+ "ClearValue": {
+ "Value": [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ "LoadAction": "Clear"
+ }
}
],
"ImageAttachments": [
@@ -73,7 +89,14 @@
"AttachmentRef": {
"Pass": "This",
"Attachment": "IrradianceImage"
- }
+ }
+ },
+ {
+ "LocalSlot": "VisualizationOutput",
+ "AttachmentRef": {
+ "Pass": "DiffuseProbeGridVisualizationRayTracingPass",
+ "Attachment": "Output"
+ }
}
],
"PassRequests": [
@@ -193,6 +216,18 @@
}
}
]
+ },
+ {
+ "Name": "DiffuseProbeGridVisualizationPreparePass",
+ "TemplateName": "DiffuseProbeGridVisualizationPreparePassTemplate"
+ },
+ {
+ "Name": "DiffuseProbeGridVisualizationAccelerationStructurePass",
+ "TemplateName": "DiffuseProbeGridVisualizationAccelerationStructurePassTemplate"
+ },
+ {
+ "Name": "DiffuseProbeGridVisualizationRayTracingPass",
+ "TemplateName": "DiffuseProbeGridVisualizationRayTracingPassTemplate"
}
]
}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationAccelerationStructure.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationAccelerationStructure.pass
new file mode 100644
index 0000000000..78d4c82dcf
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationAccelerationStructure.pass
@@ -0,0 +1,13 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData":
+ {
+ "PassTemplate":
+ {
+ "Name": "DiffuseProbeGridVisualizationAccelerationStructurePassTemplate",
+ "PassClass": "DiffuseProbeGridVisualizationAccelerationStructurePass"
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationComposite.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationComposite.pass
new file mode 100644
index 0000000000..9f19fde4af
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationComposite.pass
@@ -0,0 +1,40 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData": {
+ "PassTemplate": {
+ "Name": "DiffuseProbeGridVisualizationCompositePassTemplate",
+ "PassClass": "DiffuseProbeGridVisualizationCompositePass",
+ "Slots": [
+ {
+ "Name": "VisualizationInput",
+ "SlotType": "Input",
+ "ScopeAttachmentUsage": "Shader"
+ },
+ {
+ "Name": "Depth",
+ "SlotType": "Input",
+ "ScopeAttachmentUsage": "Shader",
+ "ImageViewDesc": {
+ "AspectFlags": [
+ "Depth"
+ ]
+ }
+ },
+ {
+ "Name": "ColorInputOutput",
+ "SlotType": "InputOutput",
+ "ScopeAttachmentUsage": "RenderTarget"
+ }
+ ],
+ "PassData": {
+ "$type": "FullscreenTrianglePassData",
+ "ShaderAsset": {
+ "FilePath": "Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.shader"
+ },
+ "PipelineViewTag": "MainCamera"
+ }
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationPrepare.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationPrepare.pass
new file mode 100644
index 0000000000..aa95128a2e
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationPrepare.pass
@@ -0,0 +1,13 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData":
+ {
+ "PassTemplate":
+ {
+ "Name": "DiffuseProbeGridVisualizationPreparePassTemplate",
+ "PassClass": "DiffuseProbeGridVisualizationPreparePass"
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationRayTracing.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationRayTracing.pass
new file mode 100644
index 0000000000..bdfba0d478
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridVisualizationRayTracing.pass
@@ -0,0 +1,54 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PassAsset",
+ "ClassData": {
+ "PassTemplate": {
+ "Name": "DiffuseProbeGridVisualizationRayTracingPassTemplate",
+ "PassClass": "DiffuseProbeGridVisualizationRayTracingPass",
+ "Slots": [
+ {
+ "Name": "Output",
+ "SlotType": "Output",
+ "ShaderInputName": "m_output",
+ "ScopeAttachmentUsage": "Shader",
+ "LoadStoreAction": {
+ "ClearValue": {
+ "Value": [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ "LoadAction": "Clear"
+ }
+ }
+ ],
+ "ImageAttachments": [
+ {
+ "Name": "VisualizationImage",
+ "SizeSource": {
+ "Source": {
+ "Pass": "Parent",
+ "Attachment": "NormalInput"
+ }
+ },
+ "ImageDescriptor": {
+ "Format": "R32G32B32A32_FLOAT",
+ "SharedQueueMask": "Graphics"
+ }
+ }
+ ],
+ "Connections": [
+ {
+ "LocalSlot": "Output",
+ "AttachmentRef": {
+ "Pass": "This",
+ "Attachment": "VisualizationImage"
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass b/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass
index 314d999e4d..f0c1c212c0 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass
@@ -357,6 +357,33 @@
}
]
},
+ {
+ "Name": "DiffuseProbeGridVisualizationCompositePass",
+ "TemplateName": "DiffuseProbeGridVisualizationCompositePassTemplate",
+ "Connections": [
+ {
+ "LocalSlot": "VisualizationInput",
+ "AttachmentRef": {
+ "Pass": "OpaquePass",
+ "Attachment": "DiffuseProbeGridVisualization"
+ }
+ },
+ {
+ "LocalSlot": "Depth",
+ "AttachmentRef": {
+ "Pass": "DepthPrePass",
+ "Attachment": "Depth"
+ }
+ },
+ {
+ "LocalSlot": "ColorInputOutput",
+ "AttachmentRef": {
+ "Pass": "PostProcessPass",
+ "Attachment": "Output"
+ }
+ }
+ ]
+ },
{
"Name": "AuxGeomPass",
"TemplateName": "AuxGeomPassTemplate",
@@ -365,8 +392,8 @@
{
"LocalSlot": "ColorInputOutput",
"AttachmentRef": {
- "Pass": "PostProcessPass",
- "Attachment": "Output"
+ "Pass": "DiffuseProbeGridVisualizationCompositePass",
+ "Attachment": "ColorInputOutput"
}
},
{
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
index 752d565234..dcf5ef3550 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
+++ b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass
@@ -46,6 +46,10 @@
"Name": "Output",
"SlotType": "Output"
},
+ {
+ "Name": "DiffuseProbeGridVisualization",
+ "SlotType": "Output"
+ },
// SwapChain here is only used to reference the frame height and format
{
"Name": "SwapChainOutput",
@@ -59,6 +63,13 @@
"Pass": "DiffuseSpecularMergePass",
"Attachment": "Output"
}
+ },
+ {
+ "LocalSlot": "DiffuseProbeGridVisualization",
+ "AttachmentRef": {
+ "Pass": "DiffuseGlobalIlluminationPass",
+ "Attachment": "VisualizationOutput"
+ }
}
],
"PassRequests": [
diff --git a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
index 96cf769690..16e6a7ee72 100644
--- a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
+++ b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset
@@ -476,6 +476,22 @@
"Name": "DiffuseCompositePassTemplate",
"Path": "Passes/DiffuseComposite.pass"
},
+ {
+ "Name": "DiffuseProbeGridVisualizationPreparePassTemplate",
+ "Path": "Passes/DiffuseProbeGridVisualizationPrepare.pass"
+ },
+ {
+ "Name": "DiffuseProbeGridVisualizationAccelerationStructurePassTemplate",
+ "Path": "Passes/DiffuseProbeGridVisualizationAccelerationStructure.pass"
+ },
+ {
+ "Name": "DiffuseProbeGridVisualizationRayTracingPassTemplate",
+ "Path": "Passes/DiffuseProbeGridVisualizationRayTracing.pass"
+ },
+ {
+ "Name": "DiffuseProbeGridVisualizationCompositePassTemplate",
+ "Path": "Passes/DiffuseProbeGridVisualizationComposite.pass"
+ },
{
"Name": "DiffuseGlobalFullscreenPassTemplate",
"Path": "Passes/DiffuseGlobalFullscreen.pass"
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.azsl
new file mode 100644
index 0000000000..2151541c06
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.azsl
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+ShaderResourceGroup PassSrg : SRG_PerPass
+{
+ Texture2D m_visualization;
+ Texture2D m_depth;
+
+ Sampler LinearSampler
+ {
+ MinFilter = Linear;
+ MagFilter = Linear;
+ MipFilter = Linear;
+ AddressU = Clamp;
+ AddressV = Clamp;
+ AddressW = Clamp;
+ };
+}
+
+#include
+
+// Vertex Shader
+VSOutput MainVS(VSInput input)
+{
+ VSOutput OUT;
+
+ float4 posTex = GetVertexPositionAndTexCoords(input.m_vertexID);
+ OUT.m_position = float4(posTex.x, posTex.y, 0.0, 1.0);
+
+ return OUT;
+}
+
+// Pixel Shader
+PSOutput MainPS(VSOutput IN)
+{
+ uint2 screenCoords = IN.m_position.xy;
+ float depth = PassSrg::m_depth.Load(uint3(screenCoords, 0)).r;
+ float4 visualization = PassSrg::m_visualization.Load(uint3(screenCoords, 0));
+
+ if (!any(visualization))
+ {
+ discard;
+ }
+
+ if (depth > visualization.a)
+ {
+ discard;
+ }
+
+ PSOutput OUT;
+ OUT.m_color = float4(visualization.rgb, 1.0f);
+ return OUT;
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.shader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.shader
new file mode 100644
index 0000000000..8d758b9b6d
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationComposite.shader
@@ -0,0 +1,42 @@
+{
+ "Source" : "DiffuseProbeGridVisualizationComposite.azsl",
+
+ "RasterState" :
+ {
+ "CullMode" : "Back"
+ },
+
+ "DepthStencilState" :
+ {
+ "Depth" :
+ {
+ "Enable" : false
+ }
+ },
+
+ "DrawList" : "forward",
+
+ "ProgramSettings":
+ {
+ "EntryPoints":
+ [
+ {
+ "name": "MainVS",
+ "type": "Vertex"
+ },
+ {
+ "name": "MainPS",
+ "type": "Fragment"
+ }
+ ]
+ },
+
+ "Supervariants":
+ [
+ {
+ "Name": "NoMSAA",
+ "PlusArguments": "--no-ms",
+ "MinusArguments": ""
+ }
+ ]
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationPrepare.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationPrepare.precompiledshader
new file mode 100644
index 0000000000..d77b7fcb0e
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationPrepare.precompiledshader
@@ -0,0 +1,34 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PrecompiledShaderAssetSourceData",
+ "ClassData":
+ {
+ "ShaderAssetFileName": "diffuseprobegridvisualizationprepare.azshader",
+ "PlatformIdentifiers": [
+ "pc",
+ "linux"
+ ],
+ "Supervariants":
+ [
+ {
+ "Name": "",
+ "RootShaderVariantAssets":
+ [
+ {
+ "APIName": "dx12",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationprepare_dx12_0.azshadervariant"
+ },
+ {
+ "APIName": "vulkan",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationprepare_vulkan_0.azshadervariant"
+ },
+ {
+ "APIName": "null",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationprepare_null_0.azshadervariant"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracing.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracing.precompiledshader
new file mode 100644
index 0000000000..ff38bfd843
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracing.precompiledshader
@@ -0,0 +1,34 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PrecompiledShaderAssetSourceData",
+ "ClassData":
+ {
+ "ShaderAssetFileName": "diffuseprobegridvisualizationraytracing.azshader",
+ "PlatformIdentifiers": [
+ "pc",
+ "linux"
+ ],
+ "Supervariants":
+ [
+ {
+ "Name": "",
+ "RootShaderVariantAssets":
+ [
+ {
+ "APIName": "dx12",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracing_dx12_0.azshadervariant"
+ },
+ {
+ "APIName": "vulkan",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracing_vulkan_0.azshadervariant"
+ },
+ {
+ "APIName": "null",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracing_null_0.azshadervariant"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingClosestHit.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingClosestHit.precompiledshader
new file mode 100644
index 0000000000..1f0d0f7e11
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingClosestHit.precompiledshader
@@ -0,0 +1,35 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PrecompiledShaderAssetSourceData",
+ "ClassData":
+ {
+ "ShaderAssetFileName": "diffuseprobegridvisualizationraytracingclosesthit.azshader",
+ "PlatformIdentifiers":
+ [
+ "pc",
+ "linux"
+ ],
+ "Supervariants":
+ [
+ {
+ "Name": "",
+ "RootShaderVariantAssets":
+ [
+ {
+ "APIName": "dx12",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracingclosesthit_dx12_0.azshadervariant"
+ },
+ {
+ "APIName": "vulkan",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracingclosesthit_vulkan_0.azshadervariant"
+ },
+ {
+ "APIName": "null",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracingclosesthit_null_0.azshadervariant"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingMiss.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingMiss.precompiledshader
new file mode 100644
index 0000000000..905006d92a
--- /dev/null
+++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridVisualizationRayTracingMiss.precompiledshader
@@ -0,0 +1,35 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "PrecompiledShaderAssetSourceData",
+ "ClassData":
+ {
+ "ShaderAssetFileName": "diffuseprobegridvisualizationraytracingmiss.azshader",
+ "PlatformIdentifiers":
+ [
+ "pc",
+ "linux"
+ ],
+ "Supervariants":
+ [
+ {
+ "Name": "",
+ "RootShaderVariantAssets":
+ [
+ {
+ "APIName": "dx12",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracingmiss_dx12_0.azshadervariant"
+ },
+ {
+ "APIName": "vulkan",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracingmiss_vulkan_0.azshadervariant"
+ },
+ {
+ "APIName": "null",
+ "RootShaderVariantAssetFileName": "diffuseprobegridvisualizationraytracingmiss_null_0.azshadervariant"
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation.azshader
index 4186489303247e4a509e74262c354526a7d79b23..69507ebd96867eda93f0b06b368b928d6e0735e3 100644
GIT binary patch
delta 170
zcmZ4Rfn~u5mJM<&Ec45!hHqA431Vb*E04%7-R!8hU465GE)RnLRf}Vdws!ZU=%3Fw
z+eHQlLljPS)Kl7AJ9Vo1WCLC4$*EI5q6lBs;`lVLTrlgOz=h2(BW(mXPq~;0H4&`w
n#_#FslXw66hNS7n@2grIEZcjhsUKLzzWG(8wczv*=8OgapVCJE
delta 170
zcmZ4Rfn~u5mJM<&ELojz?rv6M31VaoFH4GY+3cvdU465GE)RnLRg2?5=!#>aZ986W
zwu=l9hA5ousHe2KcIs61$p*U8lT)XBL=nEM#i2Uce8c5=#|k&UjI^oO$*a`G~yY0STNSJGrAPhfPDk@@2i;pBY#+2#)~W!YC3>-}doAfscainSG3CUZFns@du?3#Tf{YV0%g8+gb
z9Bhgb5RGl|CsYj*5%k8Q1W5t)by6d=*C9gMNab4F0FQE
z9bC0;JYozi2Neou)=0J_2sAzHSPEQnSsG2!qbNds7wH;@(57e$@#!NMIHu*
zcbj$jm$NZCZ@wz}g1x@uAY+4qM9%9?+Lb|ii#Zt+8vPHXTO6`ydN@0kgV~Tn$M=$p
z-88jKC3#_{A2VjH=&bSKcwn5Az@Wgv#=Eb@J3%!`?4zWi1%m)fb838+s(?=DBNe-4
zT7^RL(Nirt&vzVT0-CR)uvxEJfXB%IqVeqhIo=6wit^kn^*<$&P8?@)vRfweY2$$j
z{h~EY^2$G0?94uJ)}(PBNm#%-QQV8)ZpWt{g9dE_i44alt(Thp*V!oZJmKPDixQ|@
z_~pT3?eiSWyO@}zy;|+erf}8fXo&vmk(P=V#JAma{!`z6dpS_eVI
zArR5byVglwO*#swX$x1an{ZaDgkb^58>iBqw8j)X4fAP}Xik*KGxNZbupzFkM^kX5*%f-{Nu;1II7He6LDK9b?r|*(?=i(Oi*&d9)&7mBM
zTg>N$fR6`r_*{Nr8wTvt{4+=Wx)_+}gI<*lB^D#`7AJkFnd0s}&l*tfWzy
delta 660
zcmX|f6dIkBMw+Q&jS%{I^6+Z_3OwGv6+5
zU%at_FtDVJ0M?-m_-1UvYON8!0Ta(sqkNP2)A0vbA8`mQmaFEgZNF|lu}
ziQ}A`wGE@sj|VndUHpMuv^>}z?jZ46Kc=!A7Ba4re3y6uuMXvVO2Kj370ooe2iqU9WQ83gI9umD%
zb%&`!9Rcf(;*ZF6>j4;mx#rCh-dglpi7+s
zBvkFv-RcY`O@nm@eLRVe$oX6Rf4oet+IiRly*~b&Ty=BAdZsNM^9oFwdTQZGi)M%Y
RbhWe+Ef3$M77MRWXn!~TSd#z%
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare.azshader
new file mode 100644
index 0000000000000000000000000000000000000000..3d9904c607985ec54782fd08e575f79ecb494b62
GIT binary patch
literal 78689
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
literal 0
HcmV?d00001
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare_null_0.azshadervariant
new file mode 100644
index 0000000000000000000000000000000000000000..84b6226022cf56a8f1fde48be591ed8d5a4fdb36
GIT binary patch
literal 486
zcmZQzU|?YGU<}-ML)7esBj1D%@+<$B#qTaHI<}jSt
z*Hfs^cq=A3WL0B;cgOy|uZ>c>5@XJ^+(>o4H6gq9z0Zp26IvbFF8^!>nhOLTzV_dv
z)HnV+)YIjDeSt|D=Pyoelgh3Mt5<5Cnj|UyB>wzNlXqugJGplXKr|qcmG$|D4G1e^
zh>Uw|{AR(a4xaT-oKH{6iCp91nJ5Ib`sF2O@h8UTj~Q}CKiYPB@%%sjt~DNx4sn*N
zE-imFsXyL*_Ue+={uP>`3>1r=02#};E4Flc&VN_MEf)LMCilhvfCS?88w?k{M11U*
zKiQNLX#VS1rN4N@%xjUA#_nhRPwW&-{`_deOe+qkzZn@~G|g{*#uAv!AQjjh%21ha
S`cngok&Jco%bzO%^#K4Nn#NfG
literal 0
HcmV?d00001
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationprepare_vulkan_0.azshadervariant
new file mode 100644
index 0000000000000000000000000000000000000000..9ad3c0deb1fcfbb8e36eef4d5d19d6cf71f47757
GIT binary patch
literal 6554
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
literal 0
HcmV?d00001
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing.azshader
new file mode 100644
index 0000000000000000000000000000000000000000..0b8181e53f31fae3874a0a65b2c19f3dea59ce84
GIT binary patch
literal 205596
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%0A{0#B9tkdjRf@wzpb
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
b`s_VZqs^Jn%30Uyt$8pkai=sQ{@4ElE~XAa
literal 0
HcmV?d00001
diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridvisualizationraytracing_dx12_0.azshadervariant
new file mode 100644
index 0000000000000000000000000000000000000000..99c5a3791b8e291d4b3874e0e239db55cbd8eed6
GIT binary patch
literal 18458
zcmeHvd0bQ1_V39+639T12!Q}5U=al|3^E8}5-_5If>K09Ntgr;7zR<0Y6c*vpkY!F
zTfw<4T2QLu)FdDxqD7?^1uamd)Qc9;dYx|XTPJ|p`|Iz%d++D{{&?^8d^|bl?7h$0
zdky=$*4}3!f*=Sk9}{}1bD~ElpQaw3^!eX2qRzE+6fc{J`D)H5t`j{3)3!aUwwbhY
z#Xh9vQbEcL%)Q8%urK5x3-iC(`K#RWoH(*Ar!&s~o_gIUzXToIqt4|MZog6jT{r@R
z=lpfWl)B$^1>5I+U*#Te_}b9XJ#)MI%g?8_7F(G2M}1r2{-kZyHgW@f^o0+8Gq%WO+^CeDMV6`sZ8z=KXHpHoF+E>^pt!;QqIZ=Vk};
zd8@s@xOKFzcvsZC$}iKuT)b)O$H@OsX$#sJhIQhh$L`hze>s=--S^HvuADn6+V4A&
zn+q60bB^|(j1BdC-JH4DJfh;x@=UjR*B7@mn8ZBmtF4$tdbVV6OP((96cRbr^X{`h
z5HTM3v}|mlY40;t$-`m1-ONnxmW(s=ve2%N|84oYl#L%->{)VwzpH<0%-rFC2!X%P
z(zo}$FLH!8t=bHc&wTD-<6cwE)NlcCtr!EyINhSXct)!@Qi8$>KyGe?Yrml~Uo1dC0j!hIN
z$He`!RsrI4@qbglenYx+Lpp+)1H8QC{CT{dHFks2qm37SaOHn+|6eB$f~@(V9_?eCK6*t@#Xr=eZO{Yl4?T~e
z4{)Gu$LsV3V?QlpSJV#N;Y8bk$siBm{1s00_&Xe^9Nrycb|iy>7?2Q3mksB5oAJKT
z{!zLHa1!8L8paPBnu@+dKsFm8NI=B=ARIJC`R;&nfxqSfhk_ufP)Am<^>j_4jwrV)
z;qq#h4t*M+PJd8~l!FnblmZpqMP^r@Jz|NX&&suBrKfY6jb1n12|ta250i
z($qzEO(FbHc|ou8;dZ>YkPr&Sz8q+>GQWJ1lBvrad<-t@*
zMZ}D9qQ*)mw;rgrLKN1mVw-_#Y7gJ0Rcv)jY|~mzZNu2y<5;y|xX@UY=|Gf8RT~p<
zX=;@;0VTC*lPX&dm5{rYAVnf#8@L~BVZ-lFnD0+Fw^%-`T{D>Aw29*>R|&OrdV
z5oA8d8nppag-E~-BIOxkFvvDGg7|>JxZ1WDvSV}cC3c5$;OEDjYBgg*(9QyKPJa-+
zw$Td1+-DKEG{CUr8*C>7gT2Mv%che}Fs6O(LyS;ez+Ai$!YIcuh3veFdm<2n)qvQh
zTV~dZnKW2!(+`Zw7%w%bt_FLp`{l-C!NW)Ch+q}m8V7U8&6xH$-J4i6)z
zd(KC>{1)4Gif-bAF_mMHsl_ts?pma{-%Z2d?1^%sabKO?bx`I~z@;>jbkhCqb4$6e
zW(XoAv2U%P1`$_elj