space-game001/shaders/defaultAtmosphere.fragment
Vladislav Khorev af550f56a7 Cool working
2025-12-13 23:17:03 +03:00

41 lines
2.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}