绘制抗锯齿梯形

时间:2012-01-05 11:46:06

标签: graphics antialiasing

我正试图通过从顶部开始并逐行绘制来绘制一个消除锯齿的梯形。当该行不是整数个像素时,结束像素是背景灰度和梯形灰度的加权平均值,例如,如果一条线的长度为128.5像素,那么在每一端,灰度级为:

    0.25*(trapezoid_greylevel)+0.75*(background_greylevel)

不幸的是结果不是很顺利(我在线性显示屏上检查了这个):

Jagged trapezoid

我假设在每个线端我需要考虑全部周围的像素以达到适当的灰度级,但我无法弄清楚如何做到这一点。有什么指针吗?

2 个答案:

答案 0 :(得分:2)

由于梯形是凸的,因此很容易根据梯形对点进行分类:如果它位于所有梯形边缘的左侧(假设梯形为逆时针方向),则该点在内部。

假设正方形像素(以及大于像素的梯形),则可以通过对角落进行分类,轻松地对像素进行分类:如果所有四个角都在外面,则像素在外面;如果所有四个角都在里面,那么像素就在里面。对于其他像素,可以通过超级采样进行抗锯齿处理。

您也可以使用Warnock's algorithm中的四叉树进行自适应渲染,但是您必须针对一个正方形实现更强大的交叉测试  梯形(或一般的凸多边形)。您只需要检测正方形和陷阱何时不相交或何时正方形位于梯形内部。超出像素级别的四叉树的深度将决定抗锯齿的精细程度。

最后,您还可以通过计算梯形覆盖的像素区域的百分比来进行精确渲染。这是多边形裁剪的问题,您可以使用Sutherland–Hodgman algorithm

答案 1 :(得分:0)

如果速度不是问题,一种可能的解决方案是以分辨率的4或8倍绘制非抗锯齿状梯形,然后线性缩小图像。