106 lines
4.5 KiB
Plaintext
106 lines
4.5 KiB
Plaintext
// ---Фрагментный шейдер (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;
|
|
uniform vec3 uColor;
|
|
|
|
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 <DIST_FOG_MAX) {
|
|
// Нормализация: 0.0f при DIST_FOG_MAX, 1.0f при DIST_FOG_MIN
|
|
float distRange = DIST_FOG_MAX - DIST_FOG_MIN;
|
|
float distNormalized = clamp((uDistanceToPlanetSurface - DIST_FOG_MIN) / distRange, 0.0, 1.0);
|
|
|
|
// alpha = 0.0 (Далеко) ... 1.0 (Близко к 1000.f)
|
|
fogFactor = 1.0 - distNormalized;
|
|
}
|
|
if (uDistanceToPlanetSurface < DIST_FOG_MIN)
|
|
{
|
|
fogFactor = 1.0;
|
|
}
|
|
// Если uDistanceToPlanetSurface < 1000.0f, то fogFactor = 0.0f (пока не пересчитан ниже),
|
|
// что позволяет Z-Far Fog взять контроль.
|
|
|
|
|
|
// --- 3.2. Расчет коэффициента тумана на основе Z-глубины (Z-Far Fog) ---
|
|
// Этот туман работает всегда, но его эффект усиливается при уменьшении uCurrentZFar,
|
|
// гарантируя, что все, что подходит к границе uCurrentZFar, будет скрыто.
|
|
|
|
// Точка начала тумана: 90% от uCurrentZFar
|
|
float farFogStart = 2000.f;//uCurrentZFar * 0.7;
|
|
// Длина перехода тумана: 10% от uCurrentZFar
|
|
float depthRange = 2000.f;//uCurrentZFar * 0.25;
|
|
|
|
if (abs(uDistanceToPlanetSurface) < 410.f)
|
|
{
|
|
farFogStart = 1800.f * abs(uDistanceToPlanetSurface-10.f) * 0.0025 + 200.f;
|
|
depthRange = farFogStart;
|
|
}
|
|
if (abs(uDistanceToPlanetSurface) < 10.f)
|
|
{
|
|
farFogStart = 200.f;
|
|
depthRange = 200.f;
|
|
}
|
|
|
|
float farFogFactor = 0.0;
|
|
|
|
if (depthRange > 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);
|
|
gl_FragColor = vec4(uColor*textureColor.rgb, 1.0);
|
|
} |