先进的莫尔纹在HLSL / GLSL程序纹理着色器中减少模式 - 抗锯齿

时间:2013-11-25 22:19:50

标签: opengl glsl gpu 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);

远离纹理的四舍五入的结果是它们看起来像这样,除了很远的地方:http://i44.tinypic.com/2r4ph1d.jpg 这个问题是如果不同距离的条件我必须做5左右,我必须估计一个随机的良好舍入值

我试图制作一个将像素的距离缩小到距离步长的函数,并将LOD devider应用于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

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

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

2 个答案:

答案 0 :(得分:4)

您是否熟悉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));

答案 1 :(得分: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);}
}