commit diff:
diff --git a/Engine/Shaders/Private/MobileBasePassPixelShader.usf b/Engine/Shaders/Private/MobileBasePassPixelShader.usf
index a21272538bf..6707d775620 100644
--- a/Engine/Shaders/Private/MobileBasePassPixelShader.usf
+++ b/Engine/Shaders/Private/MobileBasePassPixelShader.usf
@@ -64,10 +64,22 @@ float4 SpotLightDirectionAndSpecularScale[MAX_DYNAMIC_POINT_LIGHTS];
#define MOBILE_CSM_QUALITY 2
#endif
+#ifndef MOBILE_MATERIAL_FORCE_USE_VERTEX_NORMAL
+#define MOBILE_MATERIAL_FORCE_USE_VERTEX_NORMAL 0
+#endif
+
+#ifndef MOBILE_MATERIAL_USE_LQ_SH_LIGHT
+#define MOBILE_MATERIAL_USE_LQ_SH_LIGHT 0
+#endif
+
+#ifndef MOBILE_QL_DISABLE_IMAGE_BASE_LIGHTING
+#define MOBILE_QL_DISABLE_IMAGE_BASE_LIGHTING 0
+#endif
+
#define FULLY_ROUGH (MATERIAL_FULLY_ROUGH || MOBILE_QL_FORCE_FULLY_ROUGH)
#define NONMETAL (MATERIAL_NONMETAL || MOBILE_QL_FORCE_NONMETAL)
#define HQ_REFLECTIONS (MATERIAL_HQ_FORWARD_REFLECTIONS && !MOBILE_QL_FORCE_LQ_REFLECTIONS)
-#define FORCE_VERTEX_NORMAL (MOBILE_QL_DISABLE_MATERIAL_NORMAL)
+#define FORCE_VERTEX_NORMAL (MOBILE_QL_DISABLE_MATERIAL_NORMAL || MOBILE_MATERIAL_FORCE_USE_VERTEX_NORMAL)
#define ALLOW_CUBE_REFLECTIONS 0
@@ -303,6 +315,10 @@ half MobileComputeMixingWeight(half IndirectIrradiance, half AverageBrightness,
half3 GetImageBasedReflectionLighting(FMaterialPixelParameters MaterialParameters, half Roughness, half IndirectIrradiance)
{
+#if MOBILE_QL_DISABLE_IMAGE_BASE_LIGHTING
+ return 0;
+#endif
+
#if HQ_REFLECTIONS
half3 SpecularIBL = BlendReflectionCaptures(MaterialParameters, Roughness, IndirectIrradiance);
#else
@@ -504,7 +520,7 @@ void Main(
Color += LightmapColor.rgb * ShadingModelContext.DiffuseColor * View.IndirectLightingColorScale;
IndirectIrradiance = LightmapColor.a;
#elif CACHED_POINT_INDIRECT_LIGHTING
- #if MATERIALBLENDING_MASKED || MATERIALBLENDING_SOLID
+ #if (MATERIALBLENDING_MASKED || MATERIALBLENDING_SOLID) && !MOBILE_MATERIAL_USE_LQ_SH_LIGHT
// Take the normal into account for opaque
FThreeBandSHVectorRGB PointIndirectLighting;
PointIndirectLighting.R.V0 = IndirectLightingCache.IndirectLightingSHCoefficients0[0];
diff --git a/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.cpp b/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.cpp
index 816e40c2027..b4c23796f95 100644
--- a/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.cpp
+++ b/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.cpp
@@ -728,6 +728,7 @@ TSharedRef<class IDetailCustomization> FMaterialDetailCustomization::MakeInstanc
return MakeShareable( new FMaterialDetailCustomization );
}
+
void FMaterialDetailCustomization::CustomizeDetails( IDetailLayoutBuilder& DetailLayout )
{
TArray<TWeakObjectPtr<UObject> > Objects;
@@ -784,6 +785,8 @@ void FMaterialDetailCustomization::CustomizeDetails( IDetailLayoutBuilder& Detai
#endif
}
}
+ DetailLayout.HideProperty("MobileExtraQualityFeaturesSettings");
+ //CreateExtraQualityFeaturesSettingsWidgets(DetailLayout);
if( bUIMaterial )
{
@@ -818,6 +821,32 @@ void FMaterialDetailCustomization::CustomizeDetails( IDetailLayoutBuilder& Detai
}
}
+/*
+void FMaterialDetailCustomization::CreateExtraQualityFeaturesSettingsWidgets(IDetailLayoutBuilder& DetailLayout)
+{
+ IDetailCategoryBuilder& DetailCategory = DetailLayout.EditCategory(TEXT("Mobile"));
+
+ static FName GroupName(TEXT("ExtraQualityFeaturesSettings"));
+ IDetailGroup& MobileExtraQualityFeaturesSettings = DetailCategory.AddGroup(GroupName, LOCTEXT("ExtraQualityFeaturesSettings", "Extra Mobile Quality Settings"), false, false);
+
+ TSharedRef<IPropertyHandle> MobileQualitySettingLow = DetailLayout.GetProperty("ExtraQualityFeaturesSettings[0]");
+ IDetailPropertyRow& MobileQualitySettingLowPropertyRow = MobileExtraQualityFeaturesSettings.AddPropertyRow(MobileQualitySettingLow);
+ static const FName Low("Low");
+ MobileQualitySettingLowPropertyRow.DisplayName(FText::FromName(Low));
+
+ TSharedRef<IPropertyHandle> MobileQualitySettingMedium = DetailLayout.GetProperty("ExtraQualityFeaturesSettings[2]");
+ IDetailPropertyRow& MobileQualitySettingMediumPropertyRow = MobileExtraQualityFeaturesSettings.AddPropertyRow(MobileQualitySettingMedium);
+ static const FName Medium("Medium");
+ MobileQualitySettingMediumPropertyRow.DisplayName(FText::FromName(Medium));
+
+ TSharedRef<IPropertyHandle> MobileQualitySettingHigh = DetailLayout.GetProperty("ExtraQualityFeaturesSettings[1]");
+ IDetailPropertyRow& MobileQualitySettingHighPropertyRow = MobileExtraQualityFeaturesSettings.AddPropertyRow(MobileQualitySettingHigh);
+ static const FName High("High");
+ MobileQualitySettingHighPropertyRow.DisplayName(FText::FromName(High));
+
+}
+*/
+
TSharedRef<class IDetailCustomization> FMaterialExpressionLayersParameterDetails::MakeInstance(FOnCollectParameterGroups InCollectGroupsDelegate)
{
return MakeShareable(new FMaterialExpressionLayersParameterDetails(InCollectGroupsDelegate));
diff --git a/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.h b/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.h
index 22835d5d7a3..583486feae3 100644
--- a/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.h
+++ b/Engine/Source/Editor/MaterialEditor/Private/MaterialEditorDetailCustomization.h
@@ -130,4 +130,6 @@ public:
/** IDetailCustomization interface */
virtual void CustomizeDetails( IDetailLayoutBuilder& DetailLayout ) override;
+ //void CreateExtraQualityFeaturesSettingsWidgets(IDetailLayoutBuilder& DetailLayout);
+
};
diff --git a/Engine/Source/Runtime/Engine/Classes/Materials/Material.h b/Engine/Source/Runtime/Engine/Classes/Materials/Material.h
index 1ddd0652e04..b9c04d2749b 100644
--- a/Engine/Source/Runtime/Engine/Classes/Materials/Material.h
+++ b/Engine/Source/Runtime/Engine/Classes/Materials/Material.h
@@ -287,6 +287,29 @@ struct FParameterGroupData
}
};
+USTRUCT()
+struct FExtraQualityFeatureSetting
+{
+ GENERATED_USTRUCT_BODY()
+
+ // vertex normal
+ UPROPERTY(EditAnywhere, Category = Material)
+ uint8 bForceVertexNormal : 1;
+
+ // Spherical harmonic
+ UPROPERTY(EditAnywhere, Category = Material)
+ uint8 bUseLowQualitySHLight : 1;
+
+ UPROPERTY(EditAnywhere, Category = Material)
+ uint8 bDisableImageBaseLighting : 1;
+
+ FExtraQualityFeatureSetting()
+ : bForceVertexNormal(false)
+ , bUseLowQualitySHLight(false)
+ , bDisableImageBaseLighting(false)
+ {}
+};
+
/**
* A Material is an asset which can be applied to a mesh to control the visual look of the scene.
* When light from the scene hits the surface, the shading model of the material is used to calculate how that light interacts with the surface.
@@ -811,6 +834,9 @@ public:
/** Controls where this parameter group is displayed in a material instance parameter list. The lower the number the higher up in the parameter list. */
UPROPERTY(EditAnywhere, EditFixedSize, Category = "Group Sorting")
TArray<FParameterGroupData> ParameterGroupData;
+
+ UPROPERTY(EditAnywhere, Category = Mobile)
+ struct FExtraQualityFeatureSetting ExtraQualityFeaturesSettings[EMaterialQualityLevel::Num];
#endif // WITH_EDITORONLY_DATA
/** true if this Material can be assumed Opaque when set to masked. */
diff --git a/Engine/Source/Runtime/Engine/Private/Materials/MaterialShared.cpp b/Engine/Source/Runtime/Engine/Private/Materials/MaterialShared.cpp
index 146df740630..d5d1dc5c9c2 100644
--- a/Engine/Source/Runtime/Engine/Private/Materials/MaterialShared.cpp
+++ b/Engine/Source/Runtime/Engine/Private/Materials/MaterialShared.cpp
@@ -1226,6 +1226,24 @@ bool FMaterialResource::IsNonmetal() const
!(Material->MaterialAttributes.IsConnected(MP_Specular) || Material->MaterialAttributes.IsConnected(MP_Metallic));
}
+
+bool FMaterialResource::GetForceVertexNormal() const
+{
+ return Material->ExtraQualityFeaturesSettings[GetQualityLevel()].bForceVertexNormal;
+}
+
+
+bool FMaterialResource::GetUseLowQualitySHLight() const
+{
+ return Material->ExtraQualityFeaturesSettings[GetQualityLevel()].bUseLowQualitySHLight;
+}
+
+bool FMaterialResource::GetDisableImageBaseLighting() const
+{
+ return Material->ExtraQualityFeaturesSettings[GetQualityLevel()].bDisableImageBaseLighting;
+}
+
+
bool FMaterialResource::UseLmDirectionality() const
{
return Material->bUseLightmapDirectionality;
@@ -1621,6 +1639,9 @@ void FMaterial::SetupMaterialEnvironment(
OutEnvironment.SetDefine(TEXT("MATERIAL_ALLOW_NEGATIVE_EMISSIVECOLOR"), AllowNegativeEmissiveColor());
OutEnvironment.SetDefine(TEXT("MATERIAL_OUTPUT_OPACITY_AS_ALPHA"), GetBlendableOutputAlpha());
OutEnvironment.SetDefine(TEXT("TRANSLUCENT_SHADOW_WITH_MASKED_OPACITY"), GetCastDynamicShadowAsMasked());
+ OutEnvironment.SetDefine(TEXT("MOBILE_MATERIAL_FORCE_USE_VERTEX_NORMAL"), GetForceVertexNormal());
+ OutEnvironment.SetDefine(TEXT("MOBILE_MATERIAL_USE_LQ_SH_LIGHT"), GetUseLowQualitySHLight());
+ OutEnvironment.SetDefine(TEXT("MOBILE_QL_DISABLE_IMAGE_BASE_LIGHTING"), GetDisableImageBaseLighting());
if (IsUsingFullPrecision())
{
diff --git a/Engine/Source/Runtime/Engine/Public/MaterialShared.h b/Engine/Source/Runtime/Engine/Public/MaterialShared.h
index 9e47fd9464d..b770dce2970 100644
--- a/Engine/Source/Runtime/Engine/Public/MaterialShared.h
+++ b/Engine/Source/Runtime/Engine/Public/MaterialShared.h
@@ -1616,6 +1616,10 @@ public:
virtual uint32 GetStencilCompare() const { return 0; }
virtual bool HasRuntimeVirtualTextureOutput() const { return false; }
virtual bool CastsRayTracedShadows() const { return true; }
+ ENGINE_API virtual bool GetForceVertexNormal() const { return false; }
+ ENGINE_API virtual bool GetUseLowQualitySHLight() const { return false; }
+ ENGINE_API virtual bool GetDisableImageBaseLighting() const { return false; }
+
/**
* Should shaders compiled for this material be saved to disk?
@@ -2402,6 +2406,10 @@ public:
ENGINE_API virtual bool HasRuntimeVirtualTextureOutput() const override;
ENGINE_API virtual bool CastsRayTracedShadows() const override;
ENGINE_API virtual UMaterialInterface* GetMaterialInterface() const override;
+
+ ENGINE_API virtual bool GetForceVertexNormal() const override;
+ ENGINE_API virtual bool GetUseLowQualitySHLight() const override;
+ ENGINE_API virtual bool GetDisableImageBaseLighting() const override;
/**
* Should shaders compiled for this material be saved to disk?
*/
diff --git a/Engine/Source/Runtime/MaterialShaderQualitySettings/Classes/ShaderPlatformQualitySettings.h b/Engine/Source/Runtime/MaterialShaderQualitySettings/Classes/ShaderPlatformQualitySettings.h
index 08ff14de707..5cceb70bcc3 100644
--- a/Engine/Source/Runtime/MaterialShaderQualitySettings/Classes/ShaderPlatformQualitySettings.h
+++ b/Engine/Source/Runtime/MaterialShaderQualitySettings/Classes/ShaderPlatformQualitySettings.h
@@ -42,6 +42,9 @@ public:
, bForceDisablePreintegratedGF(false)
, bDisableMaterialNormalCalculation(false)
, MobileCSMQuality(EMobileCSMQuality::PCF_2x2)
+ , bForceLowQualitySHLight(false)
+ , bForceVertexNormal(false)
+ , bDisableImageBaseLighting(false)
{
}
@@ -72,6 +75,15 @@ public:
UPROPERTY(EditAnywhere, Config, Meta = (DisplayName = "Cascade shadow mapping quality"), Category = "Quality")
EMobileCSMQuality MobileCSMQuality;
+ UPROPERTY(EditAnywhere, Config, Meta = (DisplayName = "Force low quality sh light"), Category = "Quality")
+ bool bForceLowQualitySHLight;
+
+ UPROPERTY(EditAnywhere, Config, Meta = (DisplayName = "Force vertex normal "), Category = "Quality")
+ bool bForceVertexNormal;
+
+ UPROPERTY(EditAnywhere, Config, Meta = (DisplayName = "Force disable image base lighting"), Category = "Quality")
+ bool bDisableImageBaseLighting;
+
MATERIALSHADERQUALITYSETTINGS_API bool CanOverride(EShaderPlatform ShaderPlatform) const;
bool HasAnyOverridesSet() const;
};
diff --git a/Engine/Source/Runtime/MaterialShaderQualitySettings/Private/MaterialShaderQualitySettings.cpp b/Engine/Source/Runtime/MaterialShaderQualitySettings/Private/MaterialShaderQualitySettings.cpp
index f2809840c4a..902ae6d7aeb 100644
--- a/Engine/Source/Runtime/MaterialShaderQualitySettings/Private/MaterialShaderQualitySettings.cpp
+++ b/Engine/Source/Runtime/MaterialShaderQualitySettings/Private/MaterialShaderQualitySettings.cpp
@@ -156,5 +156,8 @@ bool FMaterialQualityOverrides::HasAnyOverridesSet() const
|| bForceLQReflections != DefaultOverrides.bForceLQReflections
|| bForceDisablePreintegratedGF != DefaultOverrides.bForceDisablePreintegratedGF
|| bDisableMaterialNormalCalculation != DefaultOverrides.bDisableMaterialNormalCalculation
- || bDiscardQualityDuringCook != DefaultOverrides.bDiscardQualityDuringCook;
+ || bDiscardQualityDuringCook != DefaultOverrides.bDiscardQualityDuringCook
+ || bForceLowQualitySHLight != DefaultOverrides.bForceLowQualitySHLight
+ || bForceVertexNormal != DefaultOverrides.bForceVertexNormal
+ || bDisableImageBaseLighting != DefaultOverrides.bDisableImageBaseLighting;
}
diff --git a/Engine/Source/Runtime/Renderer/Private/MobileBasePassRendering.cpp b/Engine/Source/Runtime/Renderer/Private/MobileBasePassRendering.cpp
index a99cfde344c..c9a88caee59 100644
--- a/Engine/Source/Runtime/Renderer/Private/MobileBasePassRendering.cpp
+++ b/Engine/Source/Runtime/Renderer/Private/MobileBasePassRendering.cpp
@@ -104,6 +104,9 @@ bool TMobileBasePassPSPolicyParamType<LightMapPolicyType>::ModifyCompilationEnvi
OutEnvironment.SetDefine(TEXT("MOBILE_QL_FORCE_DISABLE_PREINTEGRATEDGF"), QualityOverrides.bEnableOverride && QualityOverrides.bForceDisablePreintegratedGF != 0 ? 1u : 0u);
OutEnvironment.SetDefine(TEXT("MOBILE_CSM_QUALITY"), (uint32)QualityOverrides.MobileCSMQuality);
OutEnvironment.SetDefine(TEXT("MOBILE_QL_DISABLE_MATERIAL_NORMAL"), QualityOverrides.bEnableOverride && QualityOverrides.bDisableMaterialNormalCalculation);
+ OutEnvironment.SetDefine(TEXT("MOBILE_QL_FORCE_LQ_SH_LIGHT"), QualityOverrides.bEnableOverride && QualityOverrides.bForceLowQualitySHLight != 0 ? 1u : 0u);
+ OutEnvironment.SetDefine(TEXT("MOBILE_MATERIAL_FORCE_USE_VERTEX_NORMAL"), QualityOverrides.bEnableOverride && QualityOverrides.bForceVertexNormal != 0 ? 1u : 0u);
+ OutEnvironment.SetDefine(TEXT("MOBILE_QL_DISABLE_IMAGE_BASE_LIGHTING"), QualityOverrides.bEnableOverride && QualityOverrides.bDisableImageBaseLighting != 0 ? 1u : 0u);
return true;
}