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