发布于 2022-05-30 10:35:49
大多数反混叠算法的“大点子”是在该片段周围的区域内采集多个样本。它们可以从非常简单的上面/下面到随机样本到复杂的启发式。
另一个问题是,这些样本与原始碎片之间的距离。在这里,它也可以从简单的固定距离到“智能”启发式。
最后但并非最不重要的是称重所采集的样本。就像你可以猜到的,从一个简单的平均值,到计算到其他片段和许多其他方案的距离的权重。(权重就像CPU TLB算法,每个人都有一个更好的算法,但是我们总是使用通用版本,因为它足够好)
还有一个收益递减的问题,那就是多取一些样本并不能真正帮助最终的产出。
我写了一个着色器玩具,演示了基本的反走样使用椭圆(部分原因是我懒得调整高宽比),非常类似于你提交的样本与你的问题。此外,我试图使它很容易改变采样和打开/关闭采样。
着色器玩具可以找到这里。
下面是着色玩具的代码:
// Comment this out to turn of sampling
#define do_samples
// Average the samples together
float num_samples =0.0;
vec4 GetFragValAt( vec2 uv )
{
num_samples += 1.0;
// dot is same as uv.x*uv.x+uv.y*uv.y
return vec4( dot( uv, uv) <= 0.4);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Normalized pixel coordinates (from -1 to 1)
vec2 uv = fragCoord/iResolution.xy*2.0-1.0;
// Change offset to adjust sampling distance
float offset = 0.002;
fragColor = GetFragValAt( uv );
#ifdef do_samples
// samples in +/- x direction
fragColor += GetFragValAt(uv + vec2( offset, 0.0));
fragColor += GetFragValAt(uv + vec2( -offset, 0.0));
// samples in +/- y direction
fragColor += GetFragValAt(uv + vec2( 0.0, offset ));
fragColor += GetFragValAt(uv + vec2( 0.0, -offset));
// samples at diagonals
fragColor += GetFragValAt(uv + vec2(offset, offset));
fragColor += GetFragValAt(uv + vec2(-offset, offset));
fragColor += GetFragValAt(uv + vec2(offset, -offset));
fragColor += GetFragValAt(uv + vec2(-offset, -offset));
#endif
// compute average
fragColor /= num_samples;
}发布于 2022-05-28 22:36:34
可能最简单的方法是使用平滑步实现从白色到黑色的转换:
float R = 0.5 / ScreenSize; // you'll have to pass or hardcode it
return smoothstep(Pos.x * Pos.x + Pos.y * Pos.y, 1.0 - R, 1.0 + R);https://computergraphics.stackexchange.com/questions/12728
复制相似问题