varying vec3 color; varying vec3 vViewPosition; // Получаем позицию фрагмента в пространстве вида uniform vec3 uCenterPos; // Центр планеты/атмосферы (в пространстве вида) uniform float uCenterRadius; // Радиус атмосферы (точка, где прозрачность = 0.5) // Определение зоны плавного спада alpha const float FADE_WIDTH = 0.05; // Например, 5% от радиуса для плавного перехода void main() { // 1. Расчет расстояния от фрагмента до центра float distanceToCenter = length(vViewPosition - uCenterPos); // 2. Расчет границ для плавного перехода // Начало спада (R) float startRadius = uCenterRadius; // Конец спада (R + dR) float endRadius = uCenterRadius + FADE_WIDTH * uCenterRadius; // 3. Расчет коэффициента прозрачности с помощью smoothstep // smoothstep(edge0, edge1, x) возвращает 0.0, если x < edge0, // 1.0, если x > edge1, и плавно меняется между ними. // Нам нужно, чтобы alpha была 0.5 при startRadius и 0.0 при endRadius. // Если мы используем smoothstep(start, end, distance), то получим: // - 0.0, когда distance < start // - 1.0, когда distance > end // Нам нужен обратный результат (1.0 - smoothstep), чтобы 0.5 было внутри, а 0.0 - снаружи. // Вычисляем множитель прозрачности (от 1.0 до 0.0) float fadeFactor = 1.0 - smoothstep(startRadius, endRadius, distanceToCenter); // 4. Применение нового alpha // Если fadeFactor = 1.0 (внутри R), alpha = 0.5 * 1.0 = 0.5 // Если fadeFactor = 0.0 (вне R+dR), alpha = 0.5 * 0.0 = 0.0 // Если между ними - плавная интерполяция. float finalAlpha = 0.5 * fadeFactor; gl_FragColor = vec4(color, 0.5); }