C++ 关于光栅化的问题:随机抽样、Pineda边函数和不动点数

C++ 关于光栅化的问题:随机抽样、Pineda边函数和不动点数,c++,cgi,rendering,rasterizing,C++,Cgi,Rendering,Rasterizing,我正在努力学习/理解光栅化算法,并且已经发布了一些与此相关的帖子,不幸的是没有得到很多答案: 在第一个问题中,我想光栅化一个四边形,但现在我将自己限制为一个三角形,这是标准的渲染原语 因此,我的问题是要确切地知道使用哪种技术来确定给定像素是否在三角形中。我一直在使用边函数的方法,这是好的。假设我需要循环一个二维三角形周围的bbox的所有像素 float dX0 = (v1.x - v0.x); float dY0 = (v1.y - v0.y); float dX1 = (v2.x - v1.

我正在努力学习/理解光栅化算法,并且已经发布了一些与此相关的帖子,不幸的是没有得到很多答案:

在第一个问题中,我想光栅化一个四边形,但现在我将自己限制为一个三角形,这是标准的渲染原语

因此,我的问题是要确切地知道使用哪种技术来确定给定像素是否在三角形中。我一直在使用边函数的方法,这是好的。假设我需要循环一个二维三角形周围的bbox的所有像素

float dX0 = (v1.x - v0.x);
float dY0 = (v1.y - v0.y);
float dX1 = (v2.x - v1.x);
float dY1 = (v2.y - v1.y);
float dX2 = (v0.x - v2.x);
float dY2 = (v0.y - v2.y);
for (int y = ymin; y <= ymax; ++y) {
    for (int x = xmin; x <= xmax; ++x) {
        float xctr = x + 0.5;
        float yctr = y + 0.5;
        float s0 = (xctr - v0.x) * dX0 - (yctr - v0.y) * dY0;
        float s1 = (xctr - v1.x) * dX1 - (yctr - v1.y) * dY1;
        float s2 = (xctr - v2.x) * dX2 - (yctr - v2.y) * dY2;

        if (s0 >= 0 && s1 >= 0 && s2 >= 0) {
             // point is in triangle
        }
    }
}
这没关系,我理解为什么会这样,但在一般情况下,我们进行超级采样,甚至是随机采样(将像素划分为抖动的4x4个样本),这种方法仍然有用吗

2) 我仍然不知道如何用边函数通过插值计算s/t/z?有人能帮我一下吗,或者给我指出一些解释这一点的页面

3) 现在我正在研究其他栅格化三角形的方法,比如Bresenham算法,但似乎到处都说它只在固定点坐标上工作?我很困惑。投影后三角形顶点位于浮点中。如何从浮点坐标转换为定点坐标?

光栅化 首先,典型的光栅化算法不会像您尝试的那样在投影三角形的整个边界框上迭代,因为这太慢了。 其想法是:

  • 将顶点投影到图像空间
  • 水平或垂直排列2D顶点(最好使用较小边界框标注的方向)
  • 将三角形一分为二:
    • 从第一个顶点到穿过第二个顶点的垂直或水平方向
    • 从垂直/水平穿过第二个顶点到第三个顶点
  • 光栅化每一半
你会得到这样的结果:

           * v2
          /|\
         / | \
        /  |  \
       / T1|T2 \
   v1 *----+----* v3
现在,对于栅格化三角形T1,您可以让X从v1.X迭代到v2.X,并使用边的斜率来计算Y在X处迭代三角形切片的范围

该Y范围的边界将为每个垂直切片提供恒定增量,因此您可以将这些增量表示为小数(固定或浮点),也可以使用Bresenham算法

三角形T2的想法也是一样的

多重取样 在对抖动采样进行多重采样时,您将决定每个单独的采样是否位于三角形内,基本上是按照您的尝试进行的,但这仅适用于三角形边缘的像素

但是,纹理查找只需要对每个像素执行一次(覆盖多个采样)

如果要计算每个采样点的深度,每像素深度增量基本上必须乘以采样点质心的分数抖动

插值纹理坐标

现在,如果我们考虑光栅化ALGOGITM,可以认为X或Y中的每一个增量转化为S、T和Z的增量。基本上可以工作,但是会引起失真,因为S,T,Z的线性插值不考虑深度分割。 与其尝试将图像空间坐标转换回3D场景坐标,还可以(而且更便宜)从原始计算的坐标计算校正的s、T、Z

您可以查看此PDF以查找修正系数的公式:

这是一个很好的答案。非常感谢。这应该足以开始试验你的想法、建议。我还没有找到关于将顶点位置转换为定点的信息,但我相信我已经找到了一些东西。明亮的感谢您花时间详细阐述。
           * v2
          /|\
         / | \
        /  |  \
       / T1|T2 \
   v1 *----+----* v3