我正在写一个简单的软件渲染器,它 效果很好,(使用三角形和球形/圆形 原语)但我有深度缓冲区的一些问题 实施 - 我需要一个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 领域......有人可以回答这个问题吗?
答案 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) - 出于版权原因,它是一个链接而不是嵌入。