// ---Фрагментный шейдер (Fragment Shader) varying vec3 color; varying vec3 normal; varying vec2 TexCoord; varying float viewZ; varying vec3 pos; uniform sampler2D Texture; uniform vec3 uLightDirection; uniform float uDistanceToPlanetSurface; uniform float uCurrentZFar; // Константы для тумана: const vec4 FOG_COLOR = vec4(0.0, 0.5, 1.0, 1.0); // Синий туман // Параметры "Distance Fog" const float DIST_FOG_MAX = 2000.0; const float DIST_FOG_MIN = 1000.0; // Параметры "Z-Far Fog" // Насколько близко к Zfar должен начинаться туман (например, 10% от Zfar) const float Z_FOG_START_RATIO = 0.9; // Какую долю от Zfar должен покрывать туман (например, 10% от Zfar) const float Z_FOG_RANGE_RATIO = 0.1; void main() { // ... (1. Получаем цвет и 2. Расчет освещения) vec4 textureColor = texture2D(Texture, TexCoord); vec3 finalColor = textureColor.rgb * color; float diffuse = max(0.0, dot(normal, uLightDirection)); float ambient = 0.2; float lightingFactor = min(1.0, ambient + diffuse); vec3 litColor = finalColor * lightingFactor; // 3. Расчет коэффициента тумана (fogFactor) float fogFactor = 0.0; // --- 3.1. Расчет коэффициента тумана на основе расстояния до поверхности (Distance Fog) --- // Этот туман работает на больших расстояниях и постепенно исчезает, // уступая место Z-Far Fog при приближении к планете. if (uDistanceToPlanetSurface >= DIST_FOG_MIN && uDistanceToPlanetSurface 0.0) { // Нормализация Z-глубины: 0.0f при farFogStart, 1.0f при farFogStart + depthRange farFogFactor = clamp((abs(viewZ) - farFogStart) / depthRange, 0.0, 1.0); } // --- 3.3. Объединение --- // Когда мы далеко (fogFactor > 0.0), Distance Fog доминирует. // Когда мы близко (fogFactor = 0.0), Z-Far Fog берет управление. // Если оба активны, берем максимум (например, когда фрагмент далек от игрока, но игрок все еще в зоне Distance Fog). //fogFactor = max(fogFactor, farFogFactor); fogFactor = fogFactor * farFogFactor; // 4. Смешивание цвета с туманом //vec3 mountainColor = vec3((length(pos+vec3(0.0,0.0,45000.0))-20000.0)/100.0, 0.5,0.0); gl_FragColor = mix(vec4(finalColor.rgb, 0.5), FOG_COLOR, fogFactor); //gl_FragColor = vec4((length(pos+vec3(0.0,0.0,45000.0))-20000.0)/100.0, 0.0,0.0, 1.0); //gl_FragColor = vec4(fogFactor, 0.5,0.5, 1.0); }