<分区>
我正在编写一个简单的软件渲染器,它 效果很好,(使用三角形和球体/圆形 基元),但我在深度缓冲区方面遇到了一些问题 实现——我需要一个 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 领域.. 有人可以回答吗?