75 lines
2.4 KiB
Plaintext
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;
|
|
}
|