我通过在相机周围的平面上用红色着色来检查filter-width GLSL功能的结果。
结果是一种奇怪的模式。我认为这是相对于距离在相机周围延伸的平面上的圆形渐变。另外的像素在更远的距离处均匀地表示像素之间的更远的UV坐标。
为什么不是fwidth(UV)
一个简单的渐变作为距离相机的距离的函数?我不明白它是如何正常工作的,如果它不是,因为我想反对别名像素作为它们之间的UV坐标幅度的函数。
float width = fwidth(i.uv)*.2;
return float4(width,0,0,1)*(2*i.color);
接近的UV =黑色,远=红色。
结果:
来自fwidth的上述图案是轴对齐的,并且具有1个对称轴。它无法防止2轴棋盘格或者perlin噪音的n轴纹理或径向棋盘:
float2 xy0 = float2(i.uv.x , i.uv.z) + float2(-0.5, -0.5);
float c0 = length(xy0); //sqrt of xx+yy, polar coordinate radius math
float r0 = atan2(i.uv.x-.5,i.uv.z-.5);//angle polar coordinate
float ww =round(sin(c0* freq) *sin(r0* 50)*.5+.5) ;
轴独立别名模式:
答案 0 :(得分:1)
mipmaping和过滤参数由屏幕空间中纹理坐标的偏导数确定,不是距离(实际上,一旦片段阶段开始,就不再有距离了)。
我建议你用程序生成的棋盘(即(mod(uv.s * k, 1) > 0.5)*(mod(uv.t * k, 1) < 0.5)
)替换fwidth可视化,其中k是缩放参数)你会看到棋盘的“密度”(和锯齿伪像)是最高的,你的照片中最红的地方。