Skip to content

Commit

Permalink
filter out VSM variant for unlit materials DEPTH shaders
Browse files Browse the repository at this point in the history
The VSM variant is never needed for unlit materials, it was filtered
out correctly for color shaders but not for the depth shaders.
This removes 4 variants from all unlit materials.

Also improve matinfo variants output.
  • Loading branch information
pixelflinger committed Apr 4, 2023
1 parent 185c68c commit c264d26
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 4 deletions.
3 changes: 2 additions & 1 deletion NEW_RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ appropriate header in [RELEASE_NOTES.md](./RELEASE_NOTES.md).
- fog: fog color now takes exposure and IBL intensity into account [⚠️ **Recompile Materials**].
- materials: implement cascades debugging as a post-process [⚠️ **Recompile Materials**].
- materials: use 9 digits or less for floats [⚠️ **Recompile Materials**].
- gltfio: fix skinning when objects are far from the origin
- gltfio: fix skinning when objects are far from the origin
- materials: remove 4 unneeded variants from `unlit` materials [⚠️ **Recompile Materials**].
6 changes: 4 additions & 2 deletions filament/src/details/Material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,12 +282,14 @@ FMaterial::FMaterial(FEngine& engine, const Material::Builder& builder)
mIsDefaultMaterial = builder->mDefaultMaterial;

// pre-cache the shared variants -- these variants are shared with the default material.
// (note: the default material is unlit, so only unlit variants can be shared)
if (UTILS_UNLIKELY(!mIsDefaultMaterial && !mHasCustomDepthShader)) {
FMaterial const* const pMaterial = engine.getDefaultMaterial();
auto& cachedPrograms = mCachedPrograms;
for (Variant::type_t k = 0, n = VARIANT_COUNT; k < n; ++k) {
const Variant variant(k);
if (Variant::isValidDepthVariant(variant)) {
FMaterial const* const pMaterial = engine.getDefaultMaterial();
if (Variant::isValidDepthVariant(variant) &&
(Variant::filterVariant(variant, false) == variant)) {
pMaterial->prepareProgram(variant);
cachedPrograms[k] = pMaterial->getProgram(variant);
}
Expand Down
4 changes: 4 additions & 0 deletions libs/filabridge/include/private/filament/Variant.h
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,10 @@ struct Variant {
static constexpr Variant filterVariant(Variant variant, bool isLit) noexcept {
// special case for depth variant
if (isValidDepthVariant(variant)) {
if (!isLit) {
// if we're unlit, we never need the VSM variant
return variant & ~VSM;
}
return variant;
}
if (isSSRVariant(variant)) {
Expand Down
6 changes: 5 additions & 1 deletion libs/matdbg/src/CommonWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ std::string formatVariantString(Variant variant, MaterialDomain domain) noexcept
if (variant.key & Variant::SRE) variantString += "SRE|";
if (variant.key & Variant::SKN) variantString += "SKN|";
if (variant.key & Variant::DEP) variantString += "DEP|";
if (variant.key & Variant::FOG) variantString += "FOG|";
if (variant.key & Variant::DEP) {
if (variant.key & Variant::PCK) variantString += "PCK|";
} else {
if (variant.key & Variant::FOG) variantString += "FOG|";
}
if (variant.key & Variant::VSM) variantString += "VSM|";
variantString = variantString.substr(0, variantString.length() - 1);
}
Expand Down

0 comments on commit c264d26

Please sign in to comment.