armory/Shaders/water_pass/water_subtransform.frag.glsl
2016-10-25 13:01:20 +02:00

50 lines
1.6 KiB
GLSL
Executable file

// Based on work by David Li(http://david.li/waves)
// GPU FFT using a Stockham formulation
#version 450
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D texInput;
in vec2 texCoord;
out vec4 fragColor;
const float PI = 3.14159265359;
const float transformSize = 512.0;
const float texSize = 512.0;
const float subtransformSize = 250.0;
vec2 multiplyComplex(vec2 a, vec2 b) {
return vec2(a[0] * b[0] - a[1] * b[1], a[1] * b[0] + a[0] * b[1]);
}
void main() {
// #ifdef HORIZONTAL
// float index = texCoord.x * transformSize - 0.5;
// #else
float index = texCoord.y * transformSize - 0.5;
// #endif
float evenIndex = floor(index / subtransformSize) * (subtransformSize * 0.5) + mod(index, subtransformSize * 0.5);
//transform two complex sequences simultaneously
// #ifdef HORIZONTAL
// vec4 even = texture(texInput, vec2(evenIndex + 0.5, texCoord.y * texSize) / transformSize);
// vec4 odd = texture(texInput, vec2(evenIndex + transformSize * 0.5 + 0.5, texCoord.y * texSize) / transformSize);
// #else
// gl_FragCoord.x / texCoord.x * texSize
vec4 even = texture(texInput, vec2(texCoord.x * texSize, evenIndex + 0.5) / transformSize);
vec4 odd = texture(texInput, vec2(texCoord.x * texSize, evenIndex + transformSize * 0.5 + 0.5) / transformSize);
// #endif
float twiddleArgument = -2.0 * PI * (index / subtransformSize);
vec2 twiddle = vec2(cos(twiddleArgument), sin(twiddleArgument));
vec2 outputA = even.xy + multiplyComplex(twiddle, odd.xy);
vec2 outputB = even.zw + multiplyComplex(twiddle, odd.zw);
fragColor = vec4(outputA, outputB);
}