40 lines
1.7 KiB
HLSL
40 lines
1.7 KiB
HLSL
// SPDX-License-Identifier: (Not available for this version, you are only allowed to use this software if you have express permission from the copyright holder and agreed to the latest NiloToonURP EULA)
|
|
// Copyright (c) 2021 Kuroneko ShaderLab Limited
|
|
|
|
// For more information, visit -> https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample
|
|
|
|
// #pragma once is a safe guard best practice in almost every .hlsl,
|
|
// doing this can make sure your .hlsl's user can include this .hlsl anywhere anytime without producing any multi include conflict
|
|
#pragma once
|
|
|
|
// for example, for 0~1 value 'x', you can input:
|
|
// - value = x
|
|
// - rangeMin = 0.33333
|
|
// - rangeMax = 0.66666
|
|
float applyAA(float value, float rangeMin, float rangeMax, float smoothScale = 1.0, float maxDerivative = 1.0)
|
|
{
|
|
// Calculate the derivatives of the value along the x and y axes
|
|
float dx = ddx(value);
|
|
float dy = ddy(value);
|
|
float derivative = abs(dx) + abs(dy);
|
|
|
|
// Scale and clamp the derivative to control the smoothing effect
|
|
derivative *= smoothScale;
|
|
derivative = clamp(derivative, 0.0, maxDerivative);
|
|
|
|
// Calculate a smooth transition between rangeMin and rangeMax, adjusted by the derivative
|
|
float smoothedValue = smoothstep(rangeMin - derivative, rangeMax + derivative, value);
|
|
|
|
return smoothedValue;
|
|
}
|
|
|
|
float screenSpaceGradientSmooth(float value, float edgeWidth, float2 uv) {
|
|
float3 gradSample = float3(value, uv.x, uv.y);
|
|
float3 ddxVal = ddx(gradSample);
|
|
float3 ddyVal = ddy(gradSample);
|
|
float gradMagnitude = sqrt(ddxVal.x * ddxVal.x + ddyVal.x * ddyVal.x);
|
|
|
|
return smoothstep(0.5 - edgeWidth, 0.5 + edgeWidth, value + 0.5 * gradMagnitude);
|
|
}
|
|
|