terrain-gen/shaders/nightsky.frag

78 lines
2.0 KiB
GLSL

#version 420 core
out vec4 out_color;
in vec3 fPosition;
uniform samplerCube skyTexture;
#define M_PI 3.1415926535897932384626433832795
#define STAR_DENSITY 0.02
#define STAR_RADIUS 0.01
const vec3 nightHorizonColor = vec3(0.015, 0.592, 0.976);
const vec3 nightSkyColor = vec3(0.098, 0.129, 0.219);
#include "noise.glsl"
float starLight(vec3 starCenter, vec2 planPos, vec2 starPlanPos)
{
float danger = perlin(49031, 4, 0.5, normalize(starCenter) * 6);
float dx = singlePerlin(49031, starCenter * 9631);
float dy = singlePerlin(49031, starCenter * 13765);
float prob = singlePerlin(49031, starCenter * 62527);
if (prob > 0 && danger < prob) {
dy *= (STAR_DENSITY - STAR_RADIUS) * 2;
dx *= (STAR_DENSITY - STAR_RADIUS) * 2;
vec2 dPos = vec2(dx, dy);
float scaleFactor = (danger * 0.5 + 0.5);
scaleFactor *= scaleFactor;
float invertScale = 1 - scaleFactor;
float size = (scaleFactor * STAR_RADIUS);
float power = 1 - min(1.0, distance(planPos, starPlanPos + dPos * invertScale) / size);
return power * power;
}
return 0;
}
void main(void)
{
vec3 normalizedPos = normalize(fPosition);
vec3 starCenter = floor(fPosition / STAR_DENSITY) * STAR_DENSITY + STAR_DENSITY / 2;
vec3 absPos = abs(fPosition);
vec2 planPos;
vec2 starPlanPos;
if (absPos.x == 1) {
planPos = fPosition.yz;
starPlanPos = starCenter.yz;
} else if (absPos.y == 1) {
planPos = fPosition.xz;
starPlanPos = starCenter.xz;
} else {
planPos = fPosition.xy;
starPlanPos = starCenter.xy;
}
vec3 color = vec3(starLight(starCenter, planPos, starPlanPos));
float blue = perlin(49031, 4, 0.5, normalizedPos);
float purple = perlin(147848, 6, 0.5, normalizedPos * 3);
blue = abs((- blue * 0.5) + 0.5);
purple = abs((- purple * 0.5) + 0.5);
blue = fade(blue * blue);
purple = fade(purple * purple);
color += vec3(0.48, 0.87, 0.98) * blue + vec3(0.82, 0.43, 0.98) * purple;
out_color = vec4(color, 1.0);
}