GLSL着色器:FFT数据为圆半径

时间:2015-08-17 22:16:09

标签: opengl-es glsl shader

我正在尝试创建着色器,将fft数据(作为纹理传递)转换为条形图形,然后转换为屏幕中心的圆形。这是我想要实现的目标的图像:link to image

我用着色器玩具做了一些实验,然后带着这个着色器:link to shadertoy

我在shadertoy上看到的所有复杂着色器,它认为这应该可以用数学方法来实现。

这里的任何人都可以给我一个如何做到的提示吗?

1 个答案:

答案 0 :(得分:1)

这是非常可行的 - 您只需要考虑您正在采样的范围。在您的Shadertoy示例中,您有以下内容:

float r = length(uv);
float t = atan(uv.y, uv.x);

fragColor = vec4(texture2D(iChannel0, vec2(r, 0.1)));

所以r大致会从0 ... 1(在角落中延伸超过1)变化,而t - uv向量的角度 - 将会发生变化0 ...2π。

目前,您正在(r, 0.1)对纹理进行采样 - 换句话说,输出的每个像素都将来自V位置10%的源纹理,并在其中变化。您正在计算t的角度根本没用。您想要的是角度变化(t)在U方向上穿过纹理,以及距离中心距离(r)的变化是否会在纹理中移动V方向。换句话说,这个:

float r = length(uv);
float t = atan(uv.y, uv.x) / 6.283; // normalize it to a [0,1] range - 6.283 = 2*pi

fragColor = vec4(texture2D(iChannel0, vec2(t, r)));

对于您在上面提供的源纹理,您可能会发现图像显示为“里里外外”,在这种情况下,您可以从1.0中删除r以翻转它。