Glsl 计算放大纹理轮廓时的瑕疵

Glsl 计算放大纹理轮廓时的瑕疵,glsl,textures,webgl,shader,Glsl,Textures,Webgl,Shader,我有一个着色器,它根据程序中的参数计算轮廓线,在我的例子中是网格的高度值。使用标准导数进行计算,如下所示: float contourWidth = 0.5; float f = abs( fract( height ) - 0.5 ); float df = fwidth( height ); float mi = max( 0.0, contourWidth - 1.0 ); float ma = max( 1.0 , contourWidth ); float contour = clam

我有一个着色器,它根据程序中的参数计算轮廓线,在我的例子中是网格的高度值。使用标准导数进行计算,如下所示:

float contourWidth = 0.5;
float f = abs( fract( height ) - 0.5 );
float df = fwidth( height );
float mi = max( 0.0, contourWidth - 1.0 );
float ma = max( 1.0 , contourWidth );
float contour = clamp( (f - df * mi ) / ( df * ( ma - mi ) ), 0.0, 1.0 );
这与预期一样有效,但是,当我从纹理中输入高度参数并放大时,渲染的像素比采样的texel小得多,瑕疵开始出现

采样的纹理具有线性过滤,为了调查,我在着色器中手动实现了线性过滤,以尝试隔离问题。这解决了问题,但我想了解为什么会发生这种情况,以及唯一的解决方案是像我一样在着色器中手动实现线性过滤,还是有更好的方法

下面是两种渲染技术的比较:

我在Shadertoy上创建了一个工作示例来演示这个问题:


我在Mac OSX和mobile Safari上看到了这个问题(事实更糟)

如果可以的话,尝试使用
double
s(对于受
float
低精度影响的部分)。