Updated Material Property Layouts Per Design
- Renamed "Details" group to "Overview".
- Renamed "UV Names" group to "UV Sets".
- Renamed "General" group to "General Settings".
- Renamed "Parallax" group to "Displacement".
- Renamed "Texture Map" properties to just "Texture". In cases where a specific type of texture is mentioned like "roughness texture map" I called this "roughness map" (which is more common according to google).
- Renamed "Heightmap" to "Height map" (which is more common according to google).
- Reordered material property groups according to design review.
- Base Color
- Metallic
- Roughness
- Specular Reflectance F0
- Normal
- Occlusion
- Emissive
- Subsurface
- Clear Coat
- Displacement
- Opacity
- UVs
- Irradiance
- General Settings
ATOM-14002 [Material Editor] Revisit user facing organization and layout of material types
- Renamed "Details" group to "Overview".
- Renamed "UV Names" group to "UV Sets".
- Renamed "General" group to "General Settings".
- Renamed "Parallax" group to "Displacement".
- Renamed "Texture Map" properties to just "Texture". In cases where a specific type of texture is mentioned like "roughness texture map" I called this "roughness map" (which is more common according to google).
- Renamed "Heightmap" to "Height map" (which is more common according to google).
ATOM-14002 [Material Editor] Revisit user facing organization and layout of material types
ATOM-15653 Remove Unnecessary Parallax Map Invert Flag
Removed the parallax invert flags and instead all the materials assume displacement is always specified as heightmaps.
Updated property naming, tooltips, and shader variable names to reflect this.
Updated ParallaxMapping.azsli to treat depthOffset as an offset in depth value rather than an offset in height value, so it matches the fact that ParallaxMapping.azsli always operates in depth values rather than height values.
Corresponding ASV changes: aws-lumberyard/o3de-atom-sampleviewer#83
Removed the parallax invert flags and instead all the materials assume displacement is always specified as heightmaps.
Updated property naming, tooltips, and shader variable names to reflect this.
Updated ParallaxMapping.azsli to treat depthOffset as an offset in depth value rather than an offset in height value, so it matches the fact that ParallaxMapping.azsli always operates in depth values rather than height values.
The only remaining unnecessary enable flag I found was for the parallax property group. It is removed, and now we just use the texture map and useTexture flag to gate whether the feature is enabled.
* provide the ability for component adapters to support multiple components per entity
* add missing explicit keywords
* updates following review feedback - update how template logic works
* small updats (fix typo, remove redundant includes)
* add missing this->
* naming change, common -> controller
* add [[maybe_unused]]
Copied tinted transparency opacity mode from EnhancedPBR to StandardPBR.
Fixed a bug in EnhancedPBR where Blended opacity didn't work right because the second DrawListOverride functor was stomping on the results of the first DrawListOverride. I removed these functors and made StandardPBR_HandleOpacityMode.lua set the draw list override instead.
Updated material type files for StandardPBR, EnhancedPBR, and Skin to align with each other as much as possible.
There were minor cases like some property settings were different, properties in different order, comments, and formatting.
There were major cases as well, like EnhancedPBR using clunky built in functors where lua functors would be better, property visibility state wasn't right, properties were missing, etc.
I also added a new HasShaderWithTag function for lua functors. This is used in StandardPBR_ShaderEnable.lua to allow this script to be used for both StandardPBR and EnhancedPBR (EnhancedPBR doesn't have the low end pipeline shaders).
ATOM-14676 Depth Based Layer Blending
- Added new blend source options that blends between layers based on which displaced height is higher. These options include Displacement, Displacement_With_BlendMaskTexture, and Displacement_With_BlendMaskVertexColors.
- Significantly refactored and updated the blend and displacement code in StandardMultilayerPBR_Common to support displacement-based blending.
- Added a new blend factor specifically for displacement-based blending that adjusts the transition between the layers independent of the displacement transition.
- Rearranged the per-layer parallax property groups because these are more general than just parallax. They can be used for displacement-based blending regardless of whether a parallax effect is being used.
- Renamed "Parallax Mapping" to "Displacement" because these properties can be used for other things besides parallax, in particular the new displacement-based blend modes.
- Removed the unnecessary per-layer "enable parallax" flags.
- Made the "offset" property always available, so this can be used to adjust displacement for blending purposes even when there is no heightmap or parallax. (The "factor" property still only shows up with a heightmap because its only purpose is to scale the heightmap).
- Solidified a naming convention for how to talk about layer blending:
- "Blend mask" means the R and G channels that mask layers 2-3. These can come from multipls source, including a "blend mask texture" or "blend mask vertex colors".
- "Blend weights" are the final RGB channels that are multiplied and added with layer properties to do the final blend.
- "Blend source" is the combination of data that is used to produce the blend weights, which could be a combination of displacement maps, blend mask texture, vertex colors, or others in the future.
- Updated the list of available debug view modes, and moved them to the "blend" group because the only modes we have right now are related to layer blending.
- Fixed a pre-existing bug where normals could be length 0.
- Added new cc0 textures from https://cc0textures.com/
- Added new materials for testing
New ASV test cases are here: https://github.com/aws-lumberyard/o3de-atom-sampleviewer/pull/67
Updated material types to have default parallax settings of POM, Low quality, 0.05 scale. That way the parallax effect will show up as soon as a user adds a heightmap.
Updated StandardMultilayerPBR_Displacement.lua to control the o_parallax_feature_enabled, so we can have the material's parallax.enable=true by default. Again this is to allow parallax behavior to show up as soon as the user adds a heightmap or adjusts the displacement offset. Note that even though we have a functor to drive the feature based on displacement settings, we still need the parallax.enable flag that that the user can set to false when they want to use displacement blending but not parallax.
Updated test materials to maintain their prior implied settings.
which are to be seen as sub gem roots as a workaround for detecting the
location of the "gem" root for the Atom/AtomLyIntegration GEM_MODULE targets
Removed the logic in the SettingsRegistry.cmake for reading a
"gem_module_roots" key from the gem.json file in order to determine the
root of the Atom and Atom LyIntegration sub gem modules
Updated StandardMultilayerPBR To Use New Layering Model
ATOM-15518 "Change Multilayer PBR To Use Lerp Base Blending"
ATOM-14688 "Disable Individual Layers"
ATOM-14793 "Fix Inconsistent Casing For LuaMaterialFunctorRuntimeContext"
ATOM-4120 "Stabilize Standard PBR Regarding Subsurface and Translucency" (partial)
Changed to lerp-based blending, with an implicit base layer.
Refactored the shader code to collate all the code for each layer into a couple structs and utility functions. This makes the code easier to maintain, and in particular will make it easy for me to add Enable flags for the layers in a subsequent commit.
Added support for disabling individual layers, so you can easily make a 2-layer material instead of a 3-layer material.
Added support to the material system and MaterialEditor for hiding entire property groups. This is used to hide the disabled layers.
Added and updated test data to reflect the new blend model.
Removed subsurface scattering and translucency from StandardMultilayerPBR.
Note to reviewers: There are a lot of changes here, but they are broken down into separate commits. I recommend going through each commit individually rather than doing one comprehensive review.
ASV changes are here: aws-lumberyard/o3de-atom-sampleviewer#55
Added a loop to the skin shader that will sample from wrinkle masks, multiply them by a weight, combine them, and use them instead of vertex colors for wrinkle map blending
Added an array of masks, an array of weights, and a wrinkle mask count to the DefaultObjectSrg. -Will create a follow up task to handle this a better way.
Removed motion vector (for now) from skin.materialtype since we're not using them, and removed depthtransparent since skin doesn't support transparency
Added an interface to the MeshFeatureProcessor to get the object srg
Wrapped srg->Compile in if(srg->IsQueuedForCompile()) to prevent compiling twice --This doesn't stop a race condition if both happen at the same time, but that is at least far less likely. It will need a better solution later.
Added a function to the MorphTargetExporter that will check to see if a texture that matches the blend shape name exists in a particular folder, and adds a reference to that image to the MorphTargetMetaAsset --Only supports .tif, and doesn't automatically re-process the .fbx if the folder is updated. These can be improved in later iterations
Added a null check in MaterialTypeSourceData.cpp to fix a crash I ran into
Added a for loop in two places to look for the first submesh that has a morph target, instead of just using the first to check if a lod has morph targets or not. --I have a better fix for this, but it involves more areas of the code, so I'm saving that for another change.
Modified AtomActorInstance to look for any morph targets that have a wrinkle mask reference
Then each frame, for any morph targets with non-zero weights that also have wrinkle masks, it updates the mask array, weights, and count on the object srg.
Previously, the SkinnedMeshFeatureProcessor assumed there would only be one skinning pass. However, that's not always the case. When rendering with track view, the feature processor was getting a pass that only updated once every three frames, which could lead to a condition where a skinned mesh was released, but the pass never submitted and cleared the previously added dispatch items, and one or two frames later it would go to submit after the skinned mesh and all of its resources had already been released.
-Modified the skinning and morph target compute passes to pull dispatch items from the feature processor instead of the feature processor pushing them to the passes.
-If more than one skinning (or morph target) pass is active in the frame, whichever one is first will submit all the dispatch items, and clear the feature processor's dispatch items before the next one tries to submit anything
-Moved the logic for caching shader options from the SkinnedMeshComputePass to the SkinnedMeshFeatureProcessor, since there may be more than one pass but only one feature processor per scene
It wasn't just a matter of using smoothstep, I had to refactor the code to take a different approach to generating blend weights. We really have to avoid any kind of division for normalization of weights because that causes all the blend functions to become non-linear. So with these changes, the blend weights are calculated based on linear interpretation for displacement-based blending too (before only the non-displacement blending used linear interpolation). With that in place, smoothstep can now be used to give a smooth transition.
I'm not sure which of these edge cases may have existed before updating the property handling, and which were caused by it.
- Rearranged the per-layer parallax property groups because these are more general than just parallax. They can be used for displacement-based blending regardless of whether a parallax effect is being used.
-- Renamed "Parallax Mapping" to "Displacement" because these properties can be used for other things besides parallax, in particular the new displacement-based blend modes.
-- Removed the unnecessary per-layer "enable parallax" flags. This also allowed me to remove the StandardMultilayerPBR_ParallaxPerLayer.lua script and replace this with simply a UseTexture functor for each layer.
-- Made the "offset" property always available, so this can be used to adjust displacement for blending purposes even when there is no heightmap or parallax. The "factor" property still only shows up with a heightmap because its only purpose is to scale the heightmap.
-- In order to get the offset to work when there is no texture map, I had to fix the logic a bit in GetLayerDepthValues where it was ignoring the offset.
-- Had to rearrange the logic in StandardMultilayerPBR_Displacement.lua a bit to get this all working, particularly because the per-layer displacement properties are no longer hidden behind an enable flag.
- Change the displacementBlendFactor to displacementBlendDistance because it felt weird when sliding per-layer displacment offset values and seeing this impact the surface property transition. Using an absolute distance value feels more natural.
- Made the displacement blend mask push the displacement down *past* the min displacement value to address edge cases where blend mask 0 didn't actually make a layer disappear. (See GetSubMinDisplacement()).
- Inlined the GetBlendWeightsFromLayerDepthValues code into GetBlendWeights because I realized it was only being used there, and the code is easier to read this way IMO.
- Displacement-based blend weights weren't being normalized in cases where layerDepthBlendDistance is 0, which caused incorrect depth values where two layers meet.
* ATOM-4661 Improvement with pass templates registration from data
- Update PassLibrary so it can load pass templates from more than one files and report duplicate pass templates.
- Added load templates events to pass system so the handlers from any gems can load their own pass templates.
- Added PassSystemInterface::OnReadyLoadTemplatesEvent::Handler in FeatureCommon gem's CommonSystemeComponet to load the PassTemplates.azasset in featureCommon gem.
- Misc: moved BindlessPrototypeSrg.asli from RPI to ASV project; fixed an assert issue when exit ASV
Renamed StandardMultilayerPBR_Parallax.lua to StandardMultilayerPBR_Displacement.lua because it is used for more than just strictly parallax, it generally deals with displcament which can be used for blending even when parallax is disabled.
Updated the terminology (yet again) to hopefully be a bit more clear and consistent.
"Blend mask" means the R and G channels that mask layers 2-3. These can come from multipls source, including a "blend mask texture" or "blend mask vertex colors".
"Blend weights" are the final RGB channels that are multiplied and added with layer properties to do the final blend.
"Blend source" is the combination of data that is used to produce the blend weights, which could be a combination of displacement maps, blend mask texture, vertex colors, or others in the future.
Added another debug render mode, so now we can show either the blend mask and the final blend weights.
ATOM-14688 Disable Individual Layers
- Added new SetMaterialPropertyGroupVisibility functions to the material functors.
- Updated the MaterialFunctor::EditorContext to include parameters for handling material property group metadata.
- Updated the material inspector(s) to apply the property group visiblity changes from the material functor, to hide or show the property groups.
- Moved some code from MaterialPropertyDescriptor.h/cpp to a new MaterialDynamicMetadata.h/cpp, since these aren't really related to the MaterialPropertyDescriptor code. It's more for material functors to use.
- Also fixed the casing for the "GetMaterialPropertyValue_Image" lua function, since I was already in this code (ATOM-14793 "Fix Inconsistent Casing For LuaMaterialFunctorRuntimeContext")
Tested in MaterialEditor and in in the main Editor's MaterialComponent property override inspector.
The bug was reported that copy and paste did not work with the material component.
Copy and paste to take the worked fine.
All of the material assignments/overrides get mapped using the LOD and asset ID of materials provided with the model.
The asset IDs of materials exported by atom builders, using the scene API, are the combination of the same UUID as the model asset ID and the unique sub ID that is now hashed from the material name provided by the DCC tool.
If we map material assignments using the entire asset ID that was generated in the model builder then the mapping will only work with that specific model.
This change updates the material assignment ID equality operators and hash function to only use the sub ID portion of the asset ID.
As long as the sub IDs are generated consistently the material assignment mappings will be portable to models with the same material names.
Also moved material assignment structures to atom common features static library so this was to be moved to cpp files
Added flags for enabling StandardMultilayerPBR layers 2 and 3. This makes it easy to create a two-layer material, or to flip layers off and on for debugging.
Refactored StandardMultilayerPBR to collate all the code for each layer into a couple structs and utility functions. This makes the code easier to maintain, and in particular will make it easy for me to add Enable flags for the layers in a subsequent commit.
Also removed subsurface scattering and translucency from StandardMultilayerPBR, according to ATOM-4120 "Stabilize Standard PBR Regarding Subsurface and Translucency".
Squashed commit of the following:
commit a6052d6ad4f70183d0ce72e84c7dc5512dc24d5e
Author: Chris Santora <santorac@amazon.com>
Date: Tue May 11 16:32:15 2021 -0700
Got the refactor finally working. I had change it to blend the baseColor, spec factor, and metalness before converting to albedo and spec, in order to get exactly the same results as before.
commit 42d6da7f405097dea07b6ed0426d6a662b61440d
Author: Chris Santora <santorac@amazon.com>
Date: Tue May 11 15:58:38 2021 -0700
Fixed clear coat issue due to LightingData initialized too late.
commit 358194a5caf6f9eb99b0e5345ad5f7768b244a93
Author: Chris Santora <santorac@amazon.com>
Date: Tue May 11 15:18:30 2021 -0700
Fixed a couple issues.
commit adb431f8113b945057959db288a7ee2dd825dd69
Author: Chris Santora <santorac@amazon.com>
Date: Tue May 11 12:42:12 2021 -0700
WIP refactor of StandardMultilayerPBR to collate the code for each layer. Also removed subsurface scattering from multilayer.
Changed to lerp-based blending, with an implicit base layer.
Renamed some variables to be more clear (blendWeight instead of blendMask, since the weights could come from vertex colors instead of a texture).
Updated DefaultBlendMask_layers.png to better suit the new layering model. It has a black background and overlapping R, G, and B areas.
Updated some of the test materials UV transforms to better fit the new DefaultBlendMask_layers image.
Added a new test object, which is a plane that has painted vertices.
Note that I updated test criteria in AtomSampleViewer to account for these changes as well.
Added new "Displacment" blend source option that blends between layers based on which displaced height is higher. For now it simply picks the higher of the three. In subsequent commits I'll improve on the blending to allow for some transition.
Recactored GetLayerDepthValues(), GetBlendWeights(), and GetBlendWeightsFromLayerDepthValues() to optimize parallax searches so that the displacment maps are sampled once and used for both parallax and the calculating the blend weights.
Renamed several layer blending types and variables to be more clear.
Added Height Offset support to StandardMultilayerPBR.materialtype.
In order to make this work, I updated the GetDepth callback function to support the option of returning absolute depth values rather than relative depth values. Although I could have done transformations inside the GetDepth function, having this as absolute cleans things up a lot. StandardMultilayerPBR_Parallax.lua functor code now populates the MaterialSRG with displacement min/max values, instead of having to normalize the depth factors for each layer. I think this is easier to understand and work with.
Added Height Offset to each layer of StandardMultilayerPBR.
Updated the naming and description for the parallax factor in each layer, to match the other material types.
I removed the global "factor" material property because it doesn't seem applicable anymore since we have per-layer height offset. We can always add some form of this later if customers ask for it.
Squashed commit of the following:
commit 8df460800ff7058f9fbb01f995efdd5ab53d3d2c
Author: Chris Santora <santorac@amazon.com>
Date: Tue May 4 13:35:27 2021 -0700
Found a workaround for the DXC compiler bug
commit 5d81617285eb42bb7b48eb060234d2cb89249e34
Author: Chris Santora <santorac@amazon.com>
Date: Tue May 4 12:27:22 2021 -0700
Local WIP changes to get a DepthResult struct set up for the GetDepth functions.
Made sure the depth and shadow shaders enable parallax calculations when alpha clipping is enabled (instead of only when parallax POM is enabled).
Moved the alpha calculations to be *after* the parallax calculations.
Factored out ShouldHandleParallax() and ShouldHandleParallaxInDepthShaders() utility functions, which help us ensure consistent application of parallax calculations across the various shaders in each material type.
Removed some dead code in a couple shaders where dirToCamera was calculated but not used.
Also did ATOM-15034 "Remove Opacity From Multi-Layer Material Types For Now" rather than addressing whatever additional alpha cutout issues might be present on multilayer materials.
Testing:
AtomSampleViewer full test suite.
Added a new AtomSampleViewer screenshot test for alpha clipping with parallax (separate repo).
Addional testing of relevant properties in Matirial Editor.
Tested updated StandardMultilayerPBR in Editor.exe where I had shadows and clipping against other geometry.
Added parallax "Height Offset" properties to StandardPBR and EnhancedPBR.
- Refactored depth pass and shadow pass shaders to use the GetParallaxInput utility.
- Updated EnhancedPBR.materialtype to match the parallax controls and functors of StandardPBR.materialtype.
- Updated EnhancedPBR's shadow pass shader to apply a ShadowMapDepthBias because I noticed StandardPBR is doing this, so I made them match.
- Updated StandardPBR and EnhancedPBR to both use the depth offset property, as well as heightmap clipping debug view.
- Note that depth offset is not supported in StandardMultilayerPBR yet, it's hard-coded to 0 for now.
- Note that I plan to rename a lot of the "depth" terms to "heightmap" or "displacement" in an upcoming commit.
-Fix vulkan graphics pipeline creation failure having depth clamp off with devices not supporting depth clip.
-Added reason for the mobile version of screen space reflection
- Fixing cloth working with Actors by reading directly from ModelAsset instead from EMFX Mesh.
- Actor caches map from joint indices in skin metadata to skeleton indices so they can be query later.
- Actor cloth skinning reads indices and weights from Model Asset instead from EMFX Mesh.
- Actor cloth skinning with unlimited skinning bones.
- Sort out cloth unit tests by disabling them until there is a way to create an Atom mesh
- Addressing feedback.
* Added clone methods for the buffer, model lod and model assets.
* Cloning works via the creators.
* Mesh handle/instance now knows about the model asset it originated from as well as the cloned model asset that we need for instancing until instancing works without the dependencies to the asset ids.
* MeshComponentRequestBus returns the original asset id and the model asset. If you need access to the clone, go by the model.
* Cloth component mesh now gettings its model asset from the model as it needs to work on the clone.
* Moved the requires cloning function from the mesh loader in the mesh feature processor to the mesh component controller.
* As we need the model asset to be loaded before we can check if it requires cloning or not, we couldn't pass in a bool from the controller but had to use a callback.
* Using asset hint instead of asset id for the model lod asset creator error.
* Storing a map of source buffer asset ids and the actual cloned buffer assets rather than just their ids.
* Using the buffer assets from the new map directly and removed the search process in the mesh loop where the asset views are created.
* Fixed the vegetation mocks.
* Using the actor's mesh asset when emitting the on model ready event for the mesh component notification bus.
* Mesh components notifications connection policy changed to adapt to cloned model asset.
* Handling empty meshes in model lod asset creator.
* Removed the requires cloning callback from the mesh feature processor and made it a parameter to the acquire mesh function
* Fixing mocks and unit tests
ATOM-14040 Add Support for Cavity Maps
Replace the "Ambient Occlusion" property groups with "Occlusion" property groups that contain settings for "Diffuse AO" and "Specular Cavity" maps.
Pre-multiplied diffuseAmbientOcclusion into the m_albedo.rgb gbuffer, making room for specularOcclusion to be stored in m_albedo.a
Added new render pipeline connections to connect the albedo gbuffer to the fullscreen reflection passes.
Also fixed ATOM-15297 "StandardPBR_ForwardPass.shadervariantlist Job Fails With Obscure Error"
* renaming and organizing files
* removed unused files
* Removing unnecessary file
* moved file
* reverting movement of 3rdparty associations from gems to global
* removing unnecessary calls to ly_add_external_target_path
* fixing install prefix of ci_build
* Fixes to get 3rdparties declared in gems to be installed
* Allowing to install just one configuration
* Adding empty line at the end
* removing commented code
* setting IMPORETD_LOCATION_<CONFIG> and defaulting IMPORTED_LOCATION to the profile config in case other configs are not installed
Note there were significant conflicts in LightingModel.azsli and StandardPBR_ForwardPass.azsl. I only did basic resolves of these conflicts, mostly preserving the changes from main and distarding the changes in the local branch. The shaders are not compiling at this point, and of course the tests are not passing. I will fix up the code to make corrections in a separate commit, to make it easier to review those changes separate from this merge.
Added new input attachment to the fullscreen reflection pass to receive the "ambient" gbuffer.
Added diffuse and specular occlusion to the Skin material type; it was missing before.
ATOM-14040 Add Support for Cavity Maps
Testing:
AtomSampleViewer automation, with updates that will be submitted in that repo.
Manual testing in Material Editor.
Built all AtomTest assets and opened a few test levels, with updates that will be submitted in that repo.
Made local copies of the occlusion test materials and changed replaced the material types with EnhancedPBR and Skin, and got identical results (with clear coat disabled since it works different in EnhancedPBR and is absent in Skin).
Remove option from presets
Updated code to select current default options
Will data drive default options with editor settings or settings registry in upcoming tasks
https://jira.agscollab.com/browse/ATOM-13950
The crash was because the "BlendColorGradingLutImageAttachmentId" attachment got imported to attachment database twice.
This fix avoids import this attachment twice. It also avoid crash but only report a warning if an imported attachment wasn't used in any scope.
Enable both RHI and RPI validation (no visiable performance impact observed.
- Added pause/resume button to ImGui Profiler to pause/resume profiling
- Added showing pass execution timeline
- Change TimestampResult to include both begin tick and duration tick. Update some function names of TimestampResult.
- Update some functions names in Pass.
- Stop showing accumulated time for ParentPass.
- Fixed a crash issue with ImGuiManager which doesn't have default font.