首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反混叠简单圆片着色器

反混叠简单圆片着色器
EN

Computer Graphics用户
提问于 2022-05-28 06:45:13
回答 2查看 309关注 0票数 1

有一个碎片着色器:

代码语言:javascript
复制
// simply set all pixel white if inside unit circle else transparent.

#pragma fragment frag
float4 frag(float4 Pos : SV_POSITION) : SV_TARGET
{
    return Pos.x * Pos.x + Pos.y * Pos.y <= 1;
}

如何应用抗混叠?从

EN

回答 2

Computer Graphics用户

回答已采纳

发布于 2022-05-30 10:35:49

大多数反混叠算法的“大点子”是在该片段周围的区域内采集多个样本。它们可以从非常简单的上面/下面到随机样本到复杂的启发式。

另一个问题是,这些样本与原始碎片之间的距离。在这里,它也可以从简单的固定距离到“智能”启发式。

最后但并非最不重要的是称重所采集的样本。就像你可以猜到的,从一个简单的平均值,到计算到其他片段和许多其他方案的距离的权重。(权重就像CPU TLB算法,每个人都有一个更好的算法,但是我们总是使用通用版本,因为它足够好)

还有一个收益递减的问题,那就是多取一些样本并不能真正帮助最终的产出。

我写了一个着色器玩具,演示了基本的反走样使用椭圆(部分原因是我懒得调整高宽比),非常类似于你提交的样本与你的问题。此外,我试图使它很容易改变采样和打开/关闭采样。

着色器玩具可以找到这里

下面是着色玩具的代码:

代码语言:javascript
复制
 // 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;

}
票数 1
EN

Computer Graphics用户

发布于 2022-05-28 22:36:34

可能最简单的方法是使用平滑步实现从白色到黑色的转换:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/12728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档