space-game001/shaders/planet_land_desktop.fragment
2025-12-31 23:02:13 +03:00

78 lines
2.5 KiB
Plaintext

varying vec2 TexCoord;
varying vec3 vViewDirTangent;
uniform sampler2D Texture;
uniform sampler2D BakedTexture;
uniform float uHeightScale;
uniform float uDistanceToPlanetSurface;
uniform float uCurrentZFar;
varying vec3 worldPosition;
uniform vec3 uViewPos;
const vec4 FOG_COLOR = vec4(0.0, 0.5, 1.0, 1.0); // Синий туман
void main() {
vec3 viewDir = normalize(vViewDirTangent);
// Получаем высоту из альфа-канала запеченной текстуры
float height = texture2D(Texture, TexCoord).a;
// Смещение. Знак минус используется, если мы хотим "вдавить" камни
// Деление на viewDir.z помогает избежать сильных искажений под углом
//vec2 p = viewDir.xy * (height * uHeightScale) / viewDir.z;
vec2 p = vec2(viewDir.x, -viewDir.y) * (height * uHeightScale);
//vec2 p = vec2(0,0);
vec2 finalTexCoord = TexCoord + p;
float realDist = distance(worldPosition, uViewPos);
float textureMixFactor = clamp((2000 - realDist) / 500.0, 0.0, 1.0);
vec4 bakedTextureColor = texture2D(BakedTexture, finalTexCoord);
vec4 textureColor = texture2D(Texture, TexCoord);
if (bakedTextureColor.x < 0.01 && bakedTextureColor.y < 0.01 && bakedTextureColor.y < 0.01)
{
textureMixFactor = 1.0;
}
vec4 finalColor = textureMixFactor*textureColor + (1 - textureMixFactor) * bakedTextureColor;
float fogFactor;
if (uDistanceToPlanetSurface > 1000)
{
gl_FragColor = vec4(finalColor.rgb, 1.0);
}
else if (uDistanceToPlanetSurface > 100)
{
float t = clamp((uDistanceToPlanetSurface - 100) / 900.0, 0.0, 1.0); // 1 upstairs, 0 downstairs
fogFactor = clamp((realDist - 2400) / (300.0*(1 + 10*t)), 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, fogFactor*(1.0 - t));
}
else if (uDistanceToPlanetSurface > 40)
{
//From 100 to 40:
//(1000 < realDist < 1800)
float t = clamp((uDistanceToPlanetSurface - 40) / 60.0, 0.0, 1.0); // 1 upstairs, 0 downstairs
fogFactor = clamp((realDist - 2400) / 300.0, 0.0, 1.0); // old fog factor
float fogFactor2 = clamp((realDist - 1000) / 800.0, 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, max(fogFactor, fogFactor2*(1.0 - t)));
}
else
{
fogFactor = clamp((realDist - 1000) / (800.0), 0.0, 1.0);
gl_FragColor = mix(vec4(finalColor.rgb, 1.0), FOG_COLOR, fogFactor);
}
//gl_FragColor = vec4(finalColor.rgb, 1.0);
}