【问题标题】:fwidth(uv) giving strange results in glslfwidth(uv) 在 glsl 中给出奇怪的结果
【发布时间】:2014-08-09 19:16:32
【问题描述】:

我检查了filter-width GLSL 函数的结果,方法是在相机周围的平面上将其涂成红色。

结果是一个奇怪的模式。我认为这将是相对于距离在相机周围延伸的平面上的圆形渐变。更远的像素均匀地表示更远距离的像素之间更远的 UV 坐标。

为什么fwidth(UV) 不是作为与相机距离函数的简单渐变?我不明白如果不是这样它会如何正常工作,因为我想根据它们之间的 UV 坐标的幅度来消除锯齿像素。

float width = fwidth(i.uv)*.2;  
return float4(width,0,0,1)*(2*i.color);

近处 = 黑色,远处 = 红色。

结果:

上述来自 fwidth 的模式是轴对齐的,并且有 1 个对称轴。它无法抗锯齿 2 轴棋盘或柏林噪声的 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) ;

与轴无关的别名模式:

【问题讨论】:

    标签: opengl graphics textures glsl antialiasing


    【解决方案1】:

    mipmaping 和过滤参数是由屏幕空间中纹理坐标的偏导数决定的,不是距离(实际上,一旦片段阶段开始,就不再有距离之类的东西了)。

    我建议您将 fwidth 可视化替换为程序生成的棋盘(即(mod(uv.s * k, 1) > 0.5)*(mod(uv.t * k, 1) < 0.5)),其中 k 是缩放参数)您会看到棋盘的“密度”(以及锯齿伪影)是最高的,你的照片中最红的地方。

    【讨论】:

    • 很抱歉我不同意。如果我旋转棋盘,则锯齿模式与它的旋转有关。与使用极坐标的圆形棋盘相同,相机周围的锯齿是均匀的。纹理的别名不能轴对齐(棋盘除外),但是 fwidth 的红色图案是轴对齐的……我将以另一种方式证明我的观点。红色图案本质上是一个 () 形状,它有 1 个对称轴,UVx,棋盘有 2 个对称轴,UVy 和 UVy,所以一个与另一个不相关。径向有 n 个对称轴。
    • float2 xy0 = float2(i.uv.x , i.uv.z) + float2(-0.5, -0.5);浮动 c0 = 长度(xy0); //sqrt of xx+yy, 极坐标半径 math float r0 = atan2(i.uv.x-.5,i.uv.z-.5);//角度极坐标 float ww =round(sin(c0* freq) sin(r0 50)*.5+.5) ;//径向棋盘
    • 而不是 fwidth,这可以用来估计像素之间的 uv 幅度: - float ww = length( ddx(uv) - ddy(uv) ); - 我认为关于抗锯齿程序纹理的教程具有误导性,因为它们使用 fwidth,即 gpugems 教程。
    • 对不起,Datenwolf,我忘了提到 fwidth(UV) 图案没有随相机旋转,它相对于物体是固定的。所以 fwidth(UV) 不应该用于像棋盘格这样的抗锯齿。
    猜你喜欢
    • 2013-08-20
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多