Graphics/PhongMaterial: Add option to disable shadow mapping (and disable it by default on web)

This commit is contained in:
SirLynix 2023-04-10 17:25:18 +02:00
parent 44c42a85c2
commit 2c6191987f
2 changed files with 45 additions and 31 deletions

View File

@ -46,10 +46,17 @@ namespace Nz
settings.AddValueProperty<Color>("AmbientColor", Color::White());
settings.AddValueProperty<Color>("SpecularColor", Color::White());
settings.AddValueProperty<float>("Shininess", 2.f);
#ifndef NAZARA_PLATFORM_WEB
settings.AddValueProperty<bool>("ShadowMapping", true);
#else
// FIXME: Shadowmapping is currently broken on web because WebGL doesn't support non-constant array indexing
settings.AddValueProperty<bool>("ShadowMapping", false);
#endif
settings.AddTextureProperty("EmissiveMap", ImageType::E2D);
settings.AddTextureProperty("HeightMap", ImageType::E2D);
settings.AddTextureProperty("NormalMap", ImageType::E2D);
settings.AddTextureProperty("SpecularMap", ImageType::E2D);
settings.AddPropertyHandler(std::make_unique<OptionValuePropertyHandler>("ShadowMapping", "EnableShadowMapping"));
settings.AddPropertyHandler(std::make_unique<TexturePropertyHandler>("EmissiveMap", "HasEmissiveTexture"));
settings.AddPropertyHandler(std::make_unique<TexturePropertyHandler>("HeightMap", "HasHeightMap"));
settings.AddPropertyHandler(std::make_unique<TexturePropertyHandler>("NormalMap", "HasNormalMap"));

View File

@ -17,6 +17,7 @@ option HasAlphaTexture: bool = false;
option AlphaTest: bool = false;
// Phong material options
option EnableShadowMapping: bool = true;
option HasEmissiveTexture: bool = false;
option HasHeightTexture: bool = false;
option HasNormalTexture: bool = false;
@ -209,6 +210,8 @@ fn main(input: VertToFrag) -> FragOut
specFactor = pow(specFactor, settings.Shininess);
let shadowFactor = 1.0;
const if (EnableShadowMapping)
{
if (light.invShadowMapSize.x > 0.0)
{
shadowFactor = 0.0;
@ -243,6 +246,7 @@ fn main(input: VertToFrag) -> FragOut
}
}
}
}
lightAmbient += attenuationFactor * light.color.rgb * lightAmbientFactor * settings.AmbientColor.rgb;
lightDiffuse += shadowFactor * attenuationFactor * lambert * light.color.rgb * lightDiffuseFactor;
@ -273,6 +277,8 @@ fn main(input: VertToFrag) -> FragOut
specFactor = pow(specFactor, settings.Shininess);
let shadowFactor = 1.0;
const if (EnableShadowMapping)
{
if (light.invShadowMapSize.x > 0.0)
{
let shadowCoords = input.lightProjPos[i].xyz / input.lightProjPos[i].w;
@ -289,6 +295,7 @@ fn main(input: VertToFrag) -> FragOut
}
shadowFactor /= 9.0;
}
}
lightAmbient += attenuationFactor * light.color.rgb * lightAmbientFactor * settings.AmbientColor.rgb;
lightDiffuse += shadowFactor * attenuationFactor * lambert * light.color.rgb * lightDiffuseFactor;