微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

非抗锯齿线和锯齿线的最佳算法是什么

如何解决非抗锯齿线和锯齿线的最佳算法是什么

我是着色器的新手,我一直在使用网站着色器玩具。我正在尝试理解图形(和图形管道),例如绘制线条、插值、光栅化等……我编写了两个线条函数,如果处理的像素在线,则返回颜色。这是这里使用片段着色器的着色玩具代码

:
:

然而,我一直使用的线条并不快或使用抗锯齿。哪个是抗锯齿和锯齿线最快的算法,我应该如何实现它,谢谢。

解决方法

片段着色器确实不是解决此问题的正确方法,shadertoy 上的很多内容实际上只是一个玩具/代码高尔夫,展示了克服平台限制的解决方案,这些限制在实际场景中非常低效。

所有图形 API 都提供用于绘制线段的专用接口,只需搜索“API_NAME 绘制线”,例如“webgl 画线”。如果使用 MSAA 或自定义着色器 AA 不能满足三角形条带的要求。

如果您真的只是在寻找一种高效的算法,那么 wikipedia page 可以满足您的需求。

,

正如另一个答案所说,着色器对此不太好。

线光栅化是在幕后使用 gfx 卡上的硬件插值器完成的。着色器为渲染图元的每个像素调用,在您的情况下,这意味着它为屏幕的每个像素调用,并且所有这些都是为您渲染的每一行调用的,这比原生方式慢得多。

如果您真的想学习光栅化,请在 CPU 端执行此操作。行的最佳算法取决于您使用的计算硬件架构。

对于顺序处理,它是:

  • DDA 这个是亚像素精度

过去 Bresenham 速度更快,但这不是真正的 IIRC,因为 x386 ...

对于并行处理,您只需计算像素到线的距离(或多或少像您现在所做的那样)。

因此,如果您坚持为此使用着色器,您可以使用几何着色器加快速度并仅处理线附近的片段(像素)。见:

因此,您只需在线条周围创建 OOBB 并通过每行发射 2 个三角形来渲染它,然后在片段中计算与线条的距离并相应地设置颜色...

对于抗锯齿,您只需更改最后一个像素边缘距离上像素的颜色。因此,如果您的线的半宽为 w 并且片段到线的距离为 d 那么:

if (d>w) discard; // fragment too far
d=(w-d)/pixel_size; // distance from edge in pixels
frag_color = vec4(r,g,b,min(1.0,d)); // use transparency/blending 

正如您所看到的,抗锯齿只是通过子像素位置/像素相对于光栅化对象的距离调制的混合进行渲染)同样的技术可以用于 DDA。

也有渲染线条的光线追踪方法,但它们与查找到线条的距离几乎相同……但是,您检查的是 3D 光线而不是 2D 像素位置,这会使数学稍微复杂化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。