c++ - Bresenham 用于球体?

标签 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 领域.. 有人可以回答吗?

最佳答案

就像三角形在 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 几乎与平面的法 vector 无关。

这引出了另一点:法 vector 具有三个分量。虽然从画三角形上看不是那么明显,但在透视校正下画圆并不是简单地缩放 x 和 y,而是有更多的自由度。

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

关于c++ - Bresenham 用于球体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672702/

相关文章:

c++ - 如何在 vector 元素中找到结构数据?

c++ - Visual Studio 2008 构建错误

c++ - 在 Windows 上使用 Boost (Visual Studio)

C - 为什么我的 int 值非常大?

javascript - 以精确数量获取项目的算法

c++ - std::sort 中的二进制表达式错误(缺少 const)无效操作数:为什么指定比较运算符可以解决这个问题?

c - 使用散点图发送 2 个昏暗数组

c - 如何编译带有头文件的c文件

c++ - 查找具有唯一标签的前 K 个元素的算法

javascript - 在数组中找到最大的 d 使得 a + b + c = d