3

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

4

1 に答える 1

1

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 は、平面の法線ベクトルにほぼ自明に関連しています。

これは別のポイントにつながります。法線ベクトルには 3 つのコンポーネントがあります。三角形の描画からはそれほど明白ではありませんが、遠近補正を使用して円を描画すると、単純に x と y をスケーリングするのではなく、より多くの自由度があります。

(そのような画像の例はこちら) -- 著作権上の理由から、埋め込みではなくリンクになっています。

于 2012-12-03T07:16:44.483 に答える