67 lines
2.1 KiB
HLSL
67 lines
2.1 KiB
HLSL
|
|
|
|
float3 GetDisplacementObjectScaleLayers()
|
|
{
|
|
|
|
float3 objectScale = float3(1.0, 1.0, 1.0);
|
|
float4x4 worldTransform = GetWorldToObjectMatrix();
|
|
|
|
objectScale.x = length(float3(worldTransform._m00, worldTransform._m01, worldTransform._m02));
|
|
objectScale.z = length(float3(worldTransform._m20, worldTransform._m21, worldTransform._m22));
|
|
|
|
return objectScale;
|
|
}
|
|
|
|
|
|
float4 BlendLightenLayers(float4 Base, float4 Blend, float Opacity)
|
|
{
|
|
|
|
float4 Out = max(Blend, Base);
|
|
Out = lerp(Base, Out, Opacity);
|
|
|
|
return Out;
|
|
}
|
|
|
|
|
|
void ParallaxLayers(float Steps, float2 uv, float StartOffset, float OffsetScale, float3 viewTangent, float3 viewWorld, float blend, bool isPlanar, out float4 Out)
|
|
{
|
|
|
|
|
|
//float3 viewTG = isPlanar ? float3(float2(viewTangent.x, viewTangent.z), abs(viewTangent.y)) : viewTangent;
|
|
float3 viewTG = isPlanar ? float3(float2(viewWorld.x, viewWorld.z), abs(viewWorld.y)) : viewTangent;
|
|
|
|
viewTG = normalize(float3(viewTG.xy, viewTG.z)); // * amplitude * 0.01
|
|
|
|
|
|
float4 parallax = 0;
|
|
for (int j = 0; j < Steps; j++)
|
|
{
|
|
if (j == 0)
|
|
parallax = float4(0, 0, 0, 0);
|
|
else
|
|
{
|
|
|
|
|
|
float ratio = (float) j / Steps;
|
|
//float4 newParalax = (SAMPLE_TEXTURE2D(_ParalaxMap, sampler_ParalaxMap, uv + lerp(0, OffsetScale * 0.01, ratio) * viewTangent.xy) * lerp(1, 0, ratio));
|
|
|
|
float4 newParalax = SAMPLE_TEXTURE2D(_ParalaxMap, sampler_ParalaxMap, uv + j * OffsetScale * 0.01 * viewTG.xy + viewTG.xy * 0.01 * StartOffset);
|
|
|
|
newParalax = lerp(newParalax, float4(0, 0, 0, 0), ratio);
|
|
|
|
|
|
parallax = BlendLightenLayers(parallax, newParalax, blend);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
Out = parallax;
|
|
}
|
|
|
|
|
|
void ParallaxLayers_float(float Steps, float2 uv, float StartOffset, float OffsetScale, float3 viewTangent, float3 viewWorld, float blend, bool isPlanar, out
|
|
float4 Out)
|
|
{
|
|
ParallaxLayers(Steps, uv, StartOffset, OffsetScale, viewTangent, viewWorld, blend, isPlanar, Out);
|
|
} |