Opengl 高级莫尔é;HLSL/GLSL程序纹理着色器中的图案减少-抗锯齿

Opengl 高级莫尔é;HLSL/GLSL程序纹理着色器中的图案减少-抗锯齿,opengl,glsl,gpu,hlsl,antialiasing,Opengl,Glsl,Gpu,Hlsl,Antialiasing,我正在处理一个程序纹理,它看起来很好,除了非常远,小的纹理像素分解成噪音和云纹图案 我已着手寻找一种解决方案,对远处和近处的图案比例进行平均和量化,以便近处的图案具有完整的细节,而远处的图案则被四舍五入,以便远处山脉的一个像素仅代表那里发现的一种颜色,而不是当时的10或20种颜色 通过使用if语句将体积纹理基于的世界_位置四舍五入很容易做到这一点,即: if( camera-pixel_distance > 1200 meters ) {wpos = round(wpos/3)*3

我正在处理一个程序纹理,它看起来很好,除了非常远,小的纹理像素分解成噪音和云纹图案

我已着手寻找一种解决方案,对远处和近处的图案比例进行平均和量化,以便近处的图案具有完整的细节,而远处的图案则被四舍五入,以便远处山脉的一个像素仅代表那里发现的一种颜色,而不是当时的10或20种颜色

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

    if( camera-pixel_distance > 1200 meters ) {wpos = round(wpos/3)*3;}//---round far away pixels
    return texturefucntion(wpos);
舍入远处纹理的结果是,除了非常远处的纹理外,它们的外观如下所示: 问题是,对于不同的距离,我必须给出大约5个if条件,并且我必须估计一个随机的良好舍入值

我尝试制作一个函数,将像素的距离切割为距离步长,并对像素的“世界位置”值应用LOD devider,使其在距离处逐渐变圆,但我得到了毫无意义的结果,实际上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像素分辨率,结合像素的距离,将每个像素四舍五入为一种保持稳定颜色的颜色吗?

您熟悉GLSL(我假设是HLSL)函数
dFdx()
dFdy()
fwidth()
?它们是专门用来解决这个问题的。从:

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

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


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

从本教程中:

half4框架(v2f i):颜色
{
浮动频率=0.020;
float3 pos=mul(_Object2World,i.uv).xyz;
浮动V=位置z;
浮动锯齿=分形(V*频率);
浮动三角形=(abs(2.0*锯齿-1.0));
//返回三角形;
浮点数dp=长度(浮点数2(ddx(V),ddy(V));
浮动边缘=dp*频率*8.0;
浮动正方形=平滑步长(0.5-边,0.5+边,三角形);
//gl_FragColor=vec4(vec3(正方形),1.0);
如果(pos.x>0.){返回float4(float3(正方形),1.0);}

如果(pos.xSounds.great,hlsl中的ddx ddy,这是我必须搜索的内容,以及所有与抗锯齿相关的主题。谢谢!!!
 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);}
}