#version 410 core uniform float fGlobalTime; // in seconds uniform vec2 v2Resolution; // viewport resolution (in pixels) uniform sampler1D texFFT; // towards 0.0 is bass / lower freq, towards 1.0 is higher / treble freq uniform sampler1D texFFTSmoothed; // this one has longer falloff and less harsh transients uniform sampler2D texBirds; uniform sampler2D texGrass; uniform sampler2D texNormal; uniform sampler2D texPerlin; uniform sampler2D texTiles; uniform sampler2D texZigZag; out vec4 out_color; const float PI = 3.14159; float fbx(vec3 p) { return texture(texPerlin, vec2(p.y + fGlobalTime, p.x)).x; } float scene(vec3 p) { float displace = sin(p.x + fGlobalTime)*sin(p.y)*sin(p.z); return fbx(p) + displace; } vec3 normal(vec3 p) { vec3 e = vec3(0.01,0,0); vec3 normal; normal.x = scene(p-e.xyz) + scene(p+e.xyz); normal.y = scene(p-e.yxz) + scene(p+e.yxz); normal.z = scene(p-e.yzx) + scene(p+e.yzx); return normalize(normal); } void main() { vec2 uv = vec2((gl_FragCoord.x - 0.5 * v2Resolution.x) / v2Resolution.y, (gl_FragCoord.y - 0.5 * v2Resolution.y) / v2Resolution.y); vec3 rayO = vec3(0,0,2.0); vec3 rayD = vec3(uv, -1.0); float t = 0; vec3 color = vec3(0,0,0); for(int i = 0;i != 32;++i) { vec3 p = rayO + rayD * t; float d = scene(p); if(d < 0.05) { vec3 norm = normal(p); color = vec3(0.4,0.9,1.0) * dot(norm, vec3(0.33)); } t += d; } color += pow(color, vec3(2.0)); // gamma adjust out_color.rgb = color;//pow(o, vec3(1/2.2)); }