Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ struct DisplacementParams
float DisplacementScale;
float DisplacementOffset;
float HeightScale;
float FlattenAmount;
};

namespace ExtendedMaterials
Expand Down Expand Up @@ -181,7 +182,11 @@ namespace ExtendedMaterials
#endif
{
float3 viewDirTS = normalize(mul(tbn, viewDir));
viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3; // Fix for objects at extreme viewing angles
#if defined(LANDSCAPE)
viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3 + params[0].FlattenAmount; // Fix for objects at extreme viewing angles
#else
viewDirTS.xy /= viewDirTS.z * 0.7 + 0.3 + params.FlattenAmount; // Fix for objects at extreme viewing angles
#endif

float nearBlendToFar = saturate(distance / 2048.0);
#if defined(LANDSCAPE)
Expand Down
3 changes: 2 additions & 1 deletion package/Shaders/Common/SharedData.hlsli
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ namespace SharedData
bool EnableHeightBlending;
bool EnableShadows;
bool ExtendShadows;
float2 pad0;
bool EnableParallaxWarpingFix;
float1 pad0;
};

struct CubemapCreatorSettings
Expand Down
73 changes: 52 additions & 21 deletions package/Shaders/Lighting.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -1074,14 +1074,49 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace
DisplacementParams displacementParams[6];
displacementParams[0].DisplacementScale = 1.f;
displacementParams[0].DisplacementOffset = 0.f;
displacementParams[0].HeightScale = 1.f;
displacementParams[0].HeightScale = 1;
displacementParams[0].FlattenAmount = 0;
# else
DisplacementParams displacementParams;
displacementParams.DisplacementScale = 1.f;
displacementParams.DisplacementOffset = 0.f;
displacementParams.HeightScale = 1.f;
displacementParams.HeightScale = 1;
displacementParams.FlattenAmount = 0;
# endif

# endif

float curvature = 0;
float normalSmoothness = 0;

# if !defined(MODELSPACENORMALS)
float3 vertexNormal = tbnTr[2];
float3 worldSpaceVertexNormal = vertexNormal;

# if !defined(DRAW_IN_WORLDSPACE)
[flatten] if (!input.WorldSpace)
worldSpaceVertexNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceVertexNormal, 0)));
# endif
# if defined(EMAT)

if (SharedData::extendedMaterialSettings.EnableParallaxWarpingFix) {
float3 ndx = ddx(worldSpaceVertexNormal);
float3 ndy = ddy(worldSpaceVertexNormal);
float3 fdx = ddx(input.WorldPosition.xyz);
float3 fdy = ddy(input.WorldPosition.xyz);
float fragSize = rcp(length(max(abs(fdx), abs(fdy))));
curvature = pow(length(max(abs(ndx), abs(ndy))) * fragSize, 0.5);
float3 flatWorldNormal = normalize(-cross(ddx(input.WorldPosition.xyz), ddy(input.WorldPosition.xyz)));
normalSmoothness = (1 - dot(worldSpaceVertexNormal, flatWorldNormal));
# if defined(LANDSCAPE)
displacementParams[0].HeightScale = saturate(1 - curvature);
displacementParams[0].FlattenAmount = (normalSmoothness + curvature);
# else
displacementParams.HeightScale = saturate(1 - curvature);
displacementParams.FlattenAmount = (normalSmoothness + curvature);
# endif
}
# endif
# endif

float3 entryNormal = 0;
Expand Down Expand Up @@ -1129,9 +1164,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace
[branch] if (SharedData::extendedMaterialSettings.EnableParallax && (PBRFlags & PBR::Flags::HasDisplacement) != 0)
{
PBRParallax = true;
displacementParams.HeightScale = PBRParams1.y;
[branch] if ((PBRFlags & PBR::Flags::InterlayerParallax) != 0)
{
displacementParams.HeightScale = PBRParams1.y;
displacementParams.DisplacementScale = 0.5;
displacementParams.DisplacementOffset = -0.25;
eta = (1 - sqrt(MultiLayerParallaxData.y)) / (1 + sqrt(MultiLayerParallaxData.y));
Expand All @@ -1147,6 +1182,10 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace
refractedViewDirection = -refract(-viewDirection, entryNormal, eta);
refractedViewDirectionWS = normalize(mul(input.World[eyeIndex], float4(refractedViewDirection, 0)));
}
else
{
displacementParams.HeightScale *= PBRParams1.y;
}
mipLevel = ExtendedMaterials::GetMipLevel(uv, TexParallaxSampler);
uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, refractedViewDirection, tbnTr, screenNoise, TexParallaxSampler, SampParallaxSampler, 0, displacementParams, pixelOffset);
if (SharedData::extendedMaterialSettings.EnableShadows && (parallaxShadowQuality > 0.0f || SharedData::extendedMaterialSettings.ExtendShadows))
Expand Down Expand Up @@ -1203,12 +1242,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace
displacementParams[4] = displacementParams[0];
displacementParams[5] = displacementParams[0];
# if defined(TRUE_PBR)
displacementParams[0].HeightScale = PBRParams1.y;
displacementParams[1].HeightScale = LandscapeTexture2PBRParams.y;
displacementParams[2].HeightScale = LandscapeTexture3PBRParams.y;
displacementParams[3].HeightScale = LandscapeTexture4PBRParams.y;
displacementParams[4].HeightScale = LandscapeTexture5PBRParams.y;
displacementParams[5].HeightScale = LandscapeTexture6PBRParams.y;
displacementParams[0].HeightScale *= PBRParams1.y;
displacementParams[1].HeightScale *= LandscapeTexture2PBRParams.y;
displacementParams[2].HeightScale *= LandscapeTexture3PBRParams.y;
displacementParams[3].HeightScale *= LandscapeTexture4PBRParams.y;
displacementParams[4].HeightScale *= LandscapeTexture5PBRParams.y;
displacementParams[5].HeightScale *= LandscapeTexture6PBRParams.y;
# endif

float weights[6];
Expand Down Expand Up @@ -1628,6 +1667,10 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace
worldSpaceNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceNormal, 0)));
# endif

# if defined(MODELSPACENORMALS)
float3 worldSpaceVertexNormal = worldSpaceNormal;
# endif

float3 screenSpaceNormal = normalize(FrameBuffer::WorldToView(worldSpaceNormal, false, eyeIndex));

# if defined(TRUE_PBR)
Expand Down Expand Up @@ -1726,18 +1769,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace
float pbrGlossiness = 1 - pbrSurfaceProperties.Roughness;
# endif // TRUE_PBR

# if !defined(MODELSPACENORMALS)
float3 vertexNormal = tbnTr[2];
float3 worldSpaceVertexNormal = vertexNormal;

# if !defined(DRAW_IN_WORLDSPACE)
[flatten] if (!input.WorldSpace)
worldSpaceVertexNormal = normalize(mul(input.World[eyeIndex], float4(worldSpaceVertexNormal, 0)));
# endif
# else
float3 worldSpaceVertexNormal = worldSpaceNormal;
# endif

float porosity = 1.0;

# if defined(SKYLIGHTING)
Expand Down
7 changes: 6 additions & 1 deletion src/Features/ExtendedMaterials.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(
EnableTerrain,
EnableHeightBlending,
EnableShadows,
ExtendShadows)
ExtendShadows,
EnableParallaxWarpingFix)

void ExtendedMaterials::DataLoaded()
{
Expand Down Expand Up @@ -59,6 +60,10 @@ void ExtendedMaterials::DrawSettings()
if (auto _tt = Util::HoverTooltipWrapper()) {
ImGui::Text("Enables landscape texture blending based on parallax. ");
}
ImGui::Checkbox("Enable Parallax Warping Fix", (bool*)&settings.EnableParallaxWarpingFix);
if (auto _tt = Util::HoverTooltipWrapper()) {
ImGui::Text("Enables a fix reducing parallax scale on curved and smooth normal triangles.");
}

ImGui::Spacing();
ImGui::Spacing();
Expand Down
3 changes: 2 additions & 1 deletion src/Features/ExtendedMaterials.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ struct ExtendedMaterials : Feature

uint EnableShadows = 1;
uint ExtendShadows = 0;
uint EnableParallaxWarpingFix = 1;

float pad[2];
float pad[1];
};

Settings settings;
Expand Down