私は単純なソフトウェアレンダラーを書いていますが、それは非常にうまく機能します (三角形と球/円のプリミティブで動作します) が、深度バッファーの実装にいくつかの問題があります - 正しく動作する 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 バージョンはどのように見えますか?
//編集
私はここで、スタック上でいくつかの密接な質問を見つけましたが、それに対する正確な答えは1つではありません-球体のプレッセンハムが必要です..誰かがそれに答えることができますか?