90 lines
3.5 KiB
HLSL
90 lines
3.5 KiB
HLSL
#ifndef REPAIR_SURFACE_INCLUDED
|
||
#define REPAIR_SURFACE_INCLUDED
|
||
|
||
// Исправленная послойная модель реставрации кузова без артефактов на границах
|
||
void RepairSurface_float(
|
||
float N,
|
||
float3 BaseColor,
|
||
float3 RustColor,
|
||
float RustInitial,
|
||
float RustAmount,
|
||
float PuttyProgress,
|
||
float SandProgress,
|
||
float PaintProgress,
|
||
float PaintSmoothness,
|
||
out float3 Albedo,
|
||
out float Metallic,
|
||
out float Smoothness)
|
||
{
|
||
const float e = 0.04; // мягкость перехода
|
||
const float3 bareMetal = float3(0.55, 0.56, 0.58);
|
||
const float3 puttyRaw = float3(0.62, 0.58, 0.50);
|
||
const float3 puttySanded = float3(0.72, 0.70, 0.66);
|
||
|
||
float sand = saturate(SandProgress);
|
||
|
||
// 1. Исходная зона повреждения детали (0..1)
|
||
float zone = smoothstep(1.0 - RustInitial, 1.0 - RustInitial + e, N) * step(0.001, RustInitial);
|
||
|
||
// 2. Маска шпаклёвки (наносится поверх голого металла)
|
||
float fillEdge = 1.0 - PuttyProgress * (RustInitial + e);
|
||
float puttyMask = smoothstep(fillEdge + e, fillEdge, N) * step(0.001, PuttyProgress);
|
||
if (PuttyProgress >= 0.99) puttyMask = 1.0;
|
||
|
||
// Свойства подложки (голый металл или шпаклёвка)
|
||
float3 underColor = lerp(bareMetal, lerp(puttyRaw, puttySanded, sand), puttyMask);
|
||
float underSmooth = lerp(0.45, lerp(0.05, 0.35, sand), puttyMask);
|
||
float underMetal = lerp(0.8, 0.0, puttyMask);
|
||
|
||
// 3. Маска нанесения новой краски (растёт от краёв зоны внутрь)
|
||
float paintEdge = (1.0 - RustInitial) + PaintProgress * (RustInitial + e);
|
||
float paintMask = (1.0 - smoothstep(paintEdge, paintEdge + e, N)) * step(0.001, PaintProgress);
|
||
if (PaintProgress >= 0.99) paintMask = 1.0;
|
||
|
||
// ВАЖНО: Доля повреждения, которая ЕЩЁ видна (не перекрыта краской).
|
||
// При завершении покраски (paintMask = 1) это значение строго равно 0 даже на полутонах!
|
||
float damageVisible = zone * (1.0 - paintMask);
|
||
|
||
// 4. Очаги ржавчины (лежат поверх всего, пока не счищены)
|
||
float rust = smoothstep(1.0 - RustAmount, 1.0 - RustAmount + e, N) * step(0.001, RustAmount);
|
||
|
||
// Смешиваем заводскую краску с повреждением
|
||
float3 col = lerp(BaseColor, underColor, damageVisible);
|
||
float sm = lerp(PaintSmoothness, underSmooth, damageVisible);
|
||
float met = lerp(0.0, underMetal, damageVisible);
|
||
|
||
// Поверх накладываем оставшуюся ржавчину
|
||
col = lerp(col, RustColor, rust);
|
||
sm = lerp(sm, 0.1, rust);
|
||
met = lerp(met, 0.0, rust);
|
||
|
||
Albedo = col;
|
||
Metallic = met;
|
||
Smoothness = sm;
|
||
}
|
||
|
||
void RepairSurface_half(
|
||
half N,
|
||
half3 BaseColor,
|
||
half3 RustColor,
|
||
half RustInitial,
|
||
half RustAmount,
|
||
half PuttyProgress,
|
||
half SandProgress,
|
||
half PaintProgress,
|
||
half PaintSmoothness,
|
||
out half3 Albedo,
|
||
out half Metallic,
|
||
out half Smoothness)
|
||
{
|
||
float3 a;
|
||
float m;
|
||
float s;
|
||
RepairSurface_float(N, BaseColor, RustColor, RustInitial, RustAmount,
|
||
PuttyProgress, SandProgress, PaintProgress, PaintSmoothness, a, m, s);
|
||
Albedo = a;
|
||
Metallic = m;
|
||
Smoothness = s;
|
||
}
|
||
|
||
#endif |