有没有人用c语言写过抗锯齿圆的函数?
rt,想用c语言写一个画圆函数,支持抗锯齿,不知道有哪位大神做过? 本帖最后由 Himem 于 2023-10-7 14:51 编辑所以直接画个N倍大的锯齿圆,然后再把画布下采样N倍是不是也抗锯齿(SSAA)了 本帖最后由 kv2004 于 2023-10-7 15:36 编辑
https://www.amobbs.com/thread-5463068-1-1.html
这里有个画圆的,看看这里满足要求不
……
我看上面的链接是依赖系统库函数的,
或者,参考一下这个文档:,
另外,记得还有不用浮点数实现的算法。 kv2004 发表于 2023-10-7 14:56
https://www.amobbs.com/thread-5463068-1-1.html
这里有个画圆的,看看这里满足要求不
……
(引用自3楼)
感谢分享,只是这个画圆不带抗锯齿功能。 emwin的早期版本,ucgui中可能有,开放源码 抗锯齿是需要屏幕支持 alpha blend 渲染方法的,即使用半灰像素补齐锯齿的突兀感。
例如 1bpp 的二值单色屏,根本不可能抗锯齿。
然后问题就更复杂了,alpha 渲染是基于透明度的,渲染结果不光与要花的圆方程有关,还要和当前屏幕背景图案有关,即半透明。
如果这些技术点都打算自己实现的话,可以考虑研究抗锯齿代码 #include <math.h>
void DrawAntiAliasedCircle(int centerX, int centerY, int radius);
void DrawPixel(int x, int y, float intensity);
void DrawAntiAliasedCircle(int centerX, int centerY, int radius)
{
// 循环遍历圆的包围盒
for (int y = centerY - radius; y <= centerY + radius; y++)
{
for (int x = centerX - radius; x <= centerX + radius; x++)
{
// 计算当前像素到圆心的距离
float distance = sqrt((x - centerX) * (x - centerX) + (y - centerY) * (y - centerY));
// 计算抗锯齿的像素强度
float intensity = radius - distance;
// 如果强度在0到1之间,则绘制像素
if (intensity >= 0 && intensity <= 1)
{
DrawPixel(x, y, intensity);
}
}
}
}
void DrawPixel(int x, int y, float intensity)
{
// 在这里实现你的像素绘制逻辑,例如将它绘制到屏幕或图像缓冲区上。
// intensity是一个0到1之间的值,用于调整像素的不透明度或颜色强度。
} lb0857 发表于 2023-10-7 19:12
(引用自7楼)
非常感谢,我先试一下。 t3486784401 发表于 2023-10-7 18:21
抗锯齿是需要屏幕支持 alpha blend 渲染方法的,即使用半灰像素补齐锯齿的突兀感。
例如 1bpp 的二值单色 ...
(引用自6楼)
除了不知道画圆的抗锯齿逻辑,其他技术点都能解决。 本帖最后由 t3486784401 于 2023-10-8 02:35 编辑
chun2495 发表于 2023-10-7 23:27
除了不知道画圆的抗锯齿逻辑,其他技术点都能解决。
(引用自9楼)
就是评估每个像素坐标 (xi, yi) 和圆方程的匹配程度。
如果结果只划分成: 匹配(距离<1/2 Pixel) vs 不匹配(距离>1/2 Pixel),就是带锯齿的画法;
如果把结果细分:匹配、中匹配、差不多匹配、不匹配 这样,并且赋予相应的透明度(Alpha通道),就是抗锯齿画法。
上半带锯齿画法,下半是抗锯齿:
加上高度模糊,模拟人眼对屏幕采样(低通),可以看到上半部仍旧保留了锯齿轮廓,而下半部已经有抗锯齿圆的样子了:
t3486784401 发表于 2023-10-8 02:23
就是评估每个像素坐标 (xi, yi) 和圆方程的匹配程度。
如果结果只划分成: 匹配(距离1/2 Pixel),就是 ...
(引用自10楼)
原来是这样计算的,太感谢了!这下终于明白了抗锯齿原理。我再整理下代码,把函数分享给坛友们。
页:
[1]