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