【问题标题】:Advanced moiré a pattern reduction in HLSL / GLSL procedural textures shader - antialiasingHLSL / GLSL 程序纹理着色器中的高级摩尔纹图案减少 - 抗锯齿
【发布时间】:2013-12-10 20:34:29
【问题描述】:

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

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

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

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

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

我尝试制作一个函数,将像素的距离切割成距离步长,并将 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

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

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

【问题讨论】:

    标签: opengl glsl gpu hlsl antialiasing


    【解决方案1】:

    您是否熟悉 GLSL(我假设为 HLSL)函数 dFdx()dFdy()fwidth()?它们是专门为解决这个问题而设计的。来自GLSL Spec

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

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

    【讨论】:

    • 听起来不错,在 hlsl 中使用 ddx ddy,这是我必须搜索的东西,以及与抗锯齿相关的所有主题。谢谢!!!
    【解决方案2】:

    好的,我找到了一些很棒的代码和解决方案的教程,这是一个可以通过距离和许多参数进行调整的简单代码。

    来自本教程: http://www.yaldex.com/open-gl/ch17lev1sec4.html#ch17fig04

     half4 frag (v2f i) : COLOR
    {
    float Frequency = 0.020;
            float3 pos = mul (_Object2World, i.uv).xyz;
            float V = pos.z;
            float sawtooth = frac(V * Frequency);
    
             float triangle = (abs(2.0 * sawtooth - 1.0));
             //return triangle;
             float dp = length(float2(ddx(V), ddy(V)));
             float edge = dp * Frequency * 8.0;
             float square = smoothstep(0.5 - edge, 0.5 + edge, triangle);
            // gl_FragColor = vec4(vec3(square), 1.0);
            if (pos.x>0.){return float4(float3(square), 1.0);}
            if (pos.x<0.){return float4(float3(triangle), 1.0);}
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多