Files
starruler-linux/data/shaders/source/star_anim_gui_ps.txt
T
2018-07-17 14:15:37 +02:00

75 lines
2.4 KiB
Plaintext

#version 120
uniform sampler2D texture[2];
uniform float cycles[5];
uniform float temperature;
varying float distortion;
varying vec2 uv;
varying vec3 normal;
varying vec3 v;
const float maxVariance = 0.03; //should be kept low
const float deviationCycles = 3.25; //How much variation is based on base color
const float two_pi = 6.28318531;
const float noise1Base = 0.84, noise1Range = 0.25;
const float noise2Base = 0.93, noise2Range = 0.34;
const float diffPower = 2.3;
const float tempInfluence = 0.25;
const float baseTemp = 10000.0;
const float noiseOffsetNoise = 0.1;
float mixRange(float x, float low, float hi) {
return clamp((x - low) / (hi - low), 0.0, 1.0);
}
vec3 blackBody(float temp) {
vec3 c;
c.r = mix(1.0, 0.6234, mixRange(temp, 6400.0, 29800.0));
c.b = mix(0.0, 1.0, mixRange(temp, 2800.0, 7600.0));
if(temp < 6600.0)
c.g = mix(0.22, 0.976, mixRange(temp, 1000.0, 6600.0));
else
c.g = mix(0.976, 0.75, mixRange(temp, 6600.0, 29800.0));
return c;
}
void main() {
vec2 noiseCoord = uv * 3.0 + (texture2D(texture[1], uv * 16.0).xz - vec2(0.5)) * noiseOffsetNoise;
noiseCoord += vec2( cycles[0], cycles[1]);
vec2 noise2Coord = noiseCoord + vec2( -cycles[3], cycles[4] );
vec2 noise3Coord = noiseCoord + vec2( -cycles[2], cycles[3] * 4.0 );
vec2 noise4Coord = noiseCoord * 2.0 + vec2( cycles[4], cycles[0] * -2.0 );
noiseCoord += vec2( cycles[1], cycles[2] );
float heat;
heat = noise1Base + noise1Range *
mix(texture2D(texture[1], uv * 4.0).r, texture2D(texture[1], noiseCoord, 20.0 * distortion).r, distortion);
heat *= noise2Base + noise2Range *
mix(texture2D(texture[0], noise2Coord).g, texture2D(texture[0], noise2Coord, 20.0 * distortion).g, distortion);
heat *= noise2Base + noise2Range *
mix(texture2D(texture[0], noise3Coord).b, texture2D(texture[0], noise3Coord, 20.0 * distortion).r, distortion);
heat *= noise1Base + noise1Range *
mix(texture2D(texture[1], noise4Coord).g, texture2D(texture[1], noise4Coord, 20.0 * distortion).b, distortion);
heat = (heat - 1.1);
if(temperature < 4500.0 || temperature > 6000.0) {
if(heat < 0.0)
heat *= 2.0;
else
heat *= 8.0;
}
else {
heat *= 4.0;
}
heat = heat * pow(max(dot(normalize(normal), vec3(0.0,0.0,1.0)), 0.0), 1.7) + 1.0;
gl_FragColor.rgb = blackBody(temperature * heat) * clamp(heat, min(temperature / 2500.0, 1.0), 1.0);
gl_FragColor.a = 1.0;
}