#version 450 core in float vSide; in float vDist; in float vTrackTimeMs; out vec4 FragColor; uniform vec3 uColor; uniform vec3 uBehindColor; uniform bool uIsAvatar; uniform bool uClipTrack; uniform float uCurrentTimeMs; uniform float uDrawBehindMs; uniform float uDrawAheadMs; uniform float uAlpha; void main() { float dist = abs(vSide); // Мягкий туман: трасса видна очень далеко float fog = exp(-vDist * 0.001); if (uClipTrack && (vTrackTimeMs < uCurrentTimeMs - uDrawBehindMs || vTrackTimeMs > uCurrentTimeMs + uDrawAheadMs)) { discard; } if (uIsAvatar) { FragColor = vec4(1.0, 1.0, 1.0, 1.0); } else { float intensity = pow(1.0 - dist, 4.0); float core = pow(1.0 - dist, 20.0); vec3 railColor = (uClipTrack && vTrackTimeMs < uCurrentTimeMs) ? uBehindColor : uColor; vec3 finalColor = mix(railColor, vec3(1.0), core); // Цвет затухает в темноту, а не просто обрезается FragColor = vec4(finalColor * fog, intensity * fog * uAlpha); } }