3

我正在编写一个简单的软件渲染器,它工作得很好,(使用三角形和球体/圆形基元)但我在深度缓冲区实现方面遇到了一些问题 - 我需要一个可以正确使用的 Bresenham 圆算法版本3d 值(需要填充深度缓冲区)。简单的“平面”二维圆形版本。

    void FillCircleWithDepth(int x1, int y1, float z, int radius, unsigned color)
    {


     int left   = x1-radius-1;
     int right  = x1+radius+1;
     int up     = y1-radius-1;
     int down   = y1+radius+1;


     if(!_rectanglesOverlap(0, 0, CLIENT_X, CLIENT_Y,
                    left, up, right, down ) )
         return;


     int x  = 0;                   //0
     int y  = radius;              //1
     int d1 = 3 - (2 * radius);

     do
    {
     if (d1 < 0)      d1 += (x<<2) + 6;
     else             d1 += ((x-(y--))<<2) + 10;

     drawScanlineWithDepth(y1+x, x1-y, x1+y, z, color);
     drawScanlineWithDepth(y1-x, x1-y, x1+y, z, color);
     drawScanlineWithDepth(y1+y, x1-x, x1+x, z, color);
     drawScanlineWithDepth(y1-y, x1-x, x1+x, z, color);
     x++;
   }
   while(x<y);
 }

带来深度缓冲区错误,我还需要在绘制扫描线时计算适当的 z。它的 3d 版本会是什么样子?

//编辑

我在这里,在堆栈上发现了几个很接近的问题,但没有一个准确的答案——球体需要pressenham ..有人可以回答吗?

4

1 回答 1

1

就像 3d 投影下的三角形一样,1/z 的倒数是线性的;对于每个运动 x+=dx 或 y+=dy,都涉及与 z 的倒数的线性差异关系:rec_z(x+dx,y+dy) = rec_z(x,y) + a*dx + b*dy,其中 a和 b IIRC 与平面的法向量几乎无关。

这引出了另一点:法线向量具有三个分量。虽然从绘制三角形上看不是很明显,但在透视校正下绘制圆形并不仅仅是缩放 x 和 y,而是有更多的自由度。

(此处为此类图像的示例)-出于版权原因,它是链接而不是嵌入的。

于 2012-12-03T07:16:44.483 回答