#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; }