Bresenham的球体?

时间:2012-12-02 19:07:47

标签: c++ c algorithm graphics 3d

我正在写一个简单的软件渲染器,它 效果很好,(使用三角形和球形/圆形 原语)但我有深度缓冲区的一些问题 实施 - 我需要一个Bresenham圈子的版本 将使用正确的3d值的算法 (需要填充深度缓冲区)。简单的“扁平”2d圆形版本。

    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 领域......有人可以回答这个问题吗?

1 个答案:

答案 0 :(得分:1)

就像三维投影下三角形的情况一样,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,而是有更多的自由度。

example of such image here) - 出于版权原因,它是一个链接而不是嵌入。