代码之家  ›  专栏  ›  技术社区  ›  Lucas

GPU绘制的三角形宽度占用15个像素而不是16个像素的原因是什么?

  •  0
  • Lucas  · 技术社区  · 2 年前

    我想在一个160*160颜色的附件中画一个三角形。协调是

    -1.0,1.0,0.0
    -0.9,0.9,0.0
    -0.8,1.0,0.0
    

    在我看来,三角形的宽度是0.2,所以它应该占用16个像素。 但是结果是15。 enter image description here

    我想知道GPU是如何处理这种情况的?我能找到一些算法或公式吗

    1 回复  |  直到 2 年前
        1
  •  5
  •   Yakov Galka    2 年前

    三角形的边正好通过像素中心(在半整数坐标下)。因此,边缘上的那些像素是否属于三角形还不能很好地确定。

    一个适用的规则是,共享一条边的三角形必须将该边上的像素光栅化一次,以防止混合等伪影。实现的方式是在单独光栅化每个三角形时包括左边缘并排除右边缘(例如)。

    请注意,这仅适用于样品正好在边缘上时的打结。如果你把三角形提高了四分之一个像素,那么所有的样本都会明确地位于三角形的内部或外部,它的表观宽度也会如你所期望的那样。

    为了清晰起见,这是一张图,其中三角形绘制在60x60帧缓冲区上。菱形指示样本在每个像素内的位置。白色钻石位于三角形之外,因此没有阴影。黑钻石被确定在三角形内,因此被着色。红色钻石恰好位于右边缘,如前所述,它们被认为在三角形之外,因此也没有着色。结果是,三角形在屏幕上的宽度只有五个像素,而不是你所期望的六个像素:

    diagram