HLSL / GLSL 程序纹理着色器中的高级摩尔纹减少 - 抗锯齿

com*_*ble 4 opengl gpu glsl hlsl antialiasing

我正在处理程序纹理,它看起来很好,除了很远之外,小的纹理像素分解为噪点和莫尔图案。

我已经着手寻找一种解决方案来平均和量化远处和近处的图案比例,以便近处是完整的细节,远处则四舍五入,以便远处山的一个像素仅代表在那里找到了一种颜色,而不是 10 或 20 种颜色。

通过四舍五入体积纹理基于使用 if 语句的 World_Position 很容易做到这一点,即:

    if( camera-pixel_distance > 1200 meters ) {wpos = round(wpos/3)*3;}//---round far away pixels
    return texturefucntion(wpos);
Run Code Online (Sandbox Code Playgroud)

四舍五入的结果是它们看起来像这样,除了很远的地方: 问题是我必须为各种距离设置大约 5 个 if 条件,并且我必须估计一个随机的好舍入值

我试图制作一个函数,将像素的距离切割成距离步长,并将 LOD 分隔符应用于 pixel_worldposition 值,使其在远处逐渐变圆,但我得到了无意义的结果,实际上 HLSL 完全翻转了。这是尝试:

float cmra= floor(_WorldSpaceCameraPos/500)*500;  //round camera distance by steps of 500m
float dst=  (1-distance(cmra,pos)/4500)*1000 ; //maximum faraway view is 4500 meters
pos= floor(pos/dst)*dst;//close pixels are rounded by 1000, far ones rounded by 20,30 etc
Run Code Online (Sandbox Code Playgroud)

它返回了我无法理解的无意义模式。

是否有用于平滑和舍入距离纹理伪影的良好记录算法?我可以使用屏幕像素分辨率,结合像素的距离,将每个像素四舍五入为一种保持稳定颜色的颜色吗?

use*_*321 5

您是否熟悉 GLSL(我假设为 HLSL)函数dFdx()dFdy()fwidth()?它们是专门为解决这个问题而制作的。从GLSL 规范

genType dFdy (genType p) 使用输入参数 p 的局部差分返回 y 中的导数。这两个函数通常用于估计用于抗锯齿程序纹理的滤波器宽度。

genType fwidth (genType p) 使用输入参数 p 的局部差分返回 x 和 y 中绝对导数的总和,即: abs (dFdx (p)) + abs (dFdy (p));