【发布时间】:2018-08-29 04:40:52
【问题描述】:
我正在尝试通过纹理将一组浮点数(在我的情况下为音频波)传递给片段着色器。它可以工作,但我得到了一些缺陷,好像从 1px 高度纹理读取的值不可靠。
这种情况发生在条形宽度和数量的许多组合中。
我从纹理中获取值:
precision mediump float;
...
uniform sampler2D uDisp;
...
void main(){
...
float columnWidth = availableWidth / barsCount;
float barIndex = floor((coord.x-paddingH)/columnWidth);
float textureX = min( 1.0, (barIndex+1.0)/barsCount );
float barValue = texture2D(uDisp, vec2(textureX, 0.0)).r;
...
如果我使用其他东西而不是纹理中的值,则问题似乎不存在。
barValue = barIndex*0.1;
知道可能是什么问题吗?为此目的使用纹理是一个坏主意吗? 我使用Pixi.JS 作为 WebGL 框架,所以我无法访问低级 API。
使用渐变纹理的数据和许多条形,问题变得非常明显。
更新:看起来问题与 textureX 值的一致性有关。
尝试不同的公式,如barIndex/(barsCount-1.0) 可以减少噪音。将其包裹在 min 上肯定会增加噪音。
【问题讨论】:
-
如果使用:float textureX = min( 1.0, (barIndex+0.5)/barsCount ) 会更好吗? (那是 +0.5 而不是 +1.0)?这意味着您从纹素的中心而不是边缘进行采样。此外,您应该使用精确的 highp 浮点数;而不是 mediump。
-
@Columbo 不幸的是,这些更改都没有任何区别。
-
另外,请确保不要为纹理生成/使用 mipmap。