我正在尝试创建着色器,将fft数据(作为纹理传递)转换为条形图形,然后转换为屏幕中心的圆形。这是我想要实现的目标的图像:link to image
我用着色器玩具做了一些实验,然后带着这个着色器:link to shadertoy
我在shadertoy上看到的所有复杂着色器,它认为这应该可以用数学方法来实现。
这里的任何人都可以给我一个如何做到的提示吗?
答案 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
以翻转它。