计算放大纹理的轮廓时的伪像

时间:2017-11-07 19:06:32

标签: 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 = clamp( (f - df * mi ) / ( df * ( ma - mi ) ), 0.0, 1.0 );

这可以按预期工作,但是当我从纹理中提供height参数并放大时,渲染像素比采样纹理像素小得多,工件开始出现。

采样纹理具有线性过滤,为了研究我在着色器中手动实现线性过滤以尝试隔离问题。这解决了这个问题,但是我想了解为什么会发生这种情况,并且唯一的解决方案是如我所知在着色器中手动实现线性过滤,或者是否有更好的方法。

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

Standard versus manual bilinear filtering

我已经在Shadertoy上创建了一个工作示例来演示这个问题:https://www.shadertoy.com/view/MljcDy

我在Mac OSX以及移动版Safari中看到了这个问题(其中atrifacts更糟糕)

0 个答案:

没有答案