在OpenGL规范中,行光栅化由“钻石退出”规则定义。
对于窗口坐标为x f 且y f 的中心的每个片段f, 定义一个菱形区域,它是四个半平面的交点:
R f = {(x,y)| | X-X <子>˚F子> | + | y-y f | &LT; 1/2}。
基本上,从p a 开始并以p b 结束的线段产生片段与R f 相交的片段f,除非p b 包含在R f 中。
(来自OpenGL 1.5 specification,第3.4.1节)
这意味着根本不会绘制与具有整数端点的x轴或y轴平行的线。例如。从(x,y)=(5,5)开始到(5,10)结束的一条线对于任何片段中心都不会有小于1/2的曼哈顿距离。
为什么规范在两个片段之间留下了这样一个“洞”?
在下面的部分中,描述了另一个标准来确定是否绘制了一个片段:
为了避免当端点位于R f 的边界上时出现困难,我们(原则上)会干扰提供的端点一小部分。设p a 和p b 有窗口坐标(x a ,y a )和(x b ,y b )。获得由(x a ,y a )给出的扰动端点p' a - (ε,ε 2 )由(x b ,y b ) - (ε,ε 2 )给出的p' b 。从p a 开始并在p b 处结束光栅化线段会产生片段f,其片段从p' a 开始并以p' b 与R f 相交,除非p b 包含在R f 中。 ε被选择得如此之小以至于当用δ代替任何0 <1时的ε时,光栅化线段产生相同的片段。 δ≤ε。
(来自OpenGL 1.5 specification,第3.4.1节)
我认为他们已经添加了这个额外的规则来解决像我的例子这样的边缘情况。但是为什么他们首先不允许距离恰好为1/2的点?
另外,由于δ和ε是正的,这是否意味着在两个片段中心之间的中间完美通过的线将默认为较低的片段(带有水平线)或最左边的片段(带有垂直线)?
答案 0 :(得分:1)
但为什么他们首先不允许距离恰好为1/2的点?
因为这会导致在这些情况下生成两个碎片,导致比预期更粗的线。人们需要某种打破平局规则,GL规范中选择的配方就是这样。
另外,由于δ和ε是正的,这是否意味着在两个片段中心之间的中间完美通过的线将默认为较低的片段(带有水平线)或最左边的片段(带有垂直线)?
没有。因为GL规范不要求实现使用钻石退出规则。您引用的段落实际上以
开头理想情况下,GL使用“钻石退出”规则来确定那些碎片 是通过光栅化线段产生的。 [...]
在后面的段落中说明:
因为钻石退出规则的初始和最终条件可能很难 要实现,允许使用其他线段栅格化算法 以下规则:
- 算法产生的片段的坐标可能不会偏离 x或y窗口中的多个单位坐标对应 由钻石退出规则产生的碎片。
- 算法生成的片段总数可能不同 由钻石出口规则产生的不超过一个。
醇>[...]
单独的规则1已经允许实现使用它自己选择的一些打破平局规则。