2

ソフトウェアレベルでグラフィックパイプラインを実装しようとしています。現在、クリッピングとカリングに問題があります。

基本的に、2つの主な懸念事項があります。

  1. 裏面カリングはいつ行う必要がありますか?目の座標、クリッピング座標、またはウィンドウ座標?多くの後ろ向きの頂点がすでに破棄されているので、この方法でクリッピングプロセスの負担を軽減できると考えて、最初は目の座標でカリングプロセスを作成しました。しかし後で、この方法で頂点が2つの行列乗算を行う必要があることに気付きました。つまり、左乗算モデルビュー行列->カリング->左乗算遠近行列であり、オーバーヘッドがある程度増加します。

  2. 三角形をクリッピングして再構築するにはどうすればよいですか?私の知る限り、クリッピングはクリッピング座標(遠近法変換後)で発生します。つまり、x、y、z成分をw成分と比較することにより、すべての頂点を破棄するかどうかを決定する同次座標です。これまでのところ良いですよね?しかし、その後、1つまたは2つの頂点が破棄された三角形を再構築する必要があります。この場合、Liang-Barskyアルゴリズムが役立つとグーグルで検索しましたが、クリッピング座標では、どのクリッピング平面を使用する必要がありますか?クリップされた三角形を記録して、NDCで再構築する必要がありますか?

どんなアイデアも役に立ちます。ありがとう。

4

1 に答える 1

3

(1)

バック フェース カリングは、必要な場所で発生する可能性があります。

3dfx ハードウェア、およびおそらくラスタライズのみを行う他のカードでは、ウィンドウ座標で実装されていました。あなたが言うように、使用しないいくつかの頂点を処理する必要がありますが、それを他のコストと比較検討する必要があります。

ワールド座標を選択することもできます。カメラの位置がわかっているので、カメラから顔までのベクトルがわかります。エッジの頂点のいずれかに移動するだけです。したがって、その内積を法線に対してテストできます。

z80 ベースのマイクロにソフトウェア ラスタライザーを実装していたとき、私はそれをさらに一歩進めて、カメラをモデル空間に変換しました。したがって、モデル行列の逆を取得し (この場合、正規直交であることが保証されているため安価でした。そのため、転置が実行されます)、それをカメラに適用し、そこからカリングします。これはベクトルの差と内積ですが、表面法線をカリングのみに使用している場合は、カメラのためにそれらをすべて変換する必要がなくなります。その特定のレンダラーでは、どの面から見えるかを順方向に進めて、どの頂点が見えるかを判断し、それらだけをウィンドウ座標に変換することができました。

(2)

Sutherland-Cohen の変種は、私が最も頻繁に見た覚えのあるものです。ポリゴンの外側を順方向にスキャンして、各エッジを順番にチェックし、適切に調整します。

たとえば、点 (V1、V2、V3) 間の凸多角形から始めます。クリッピング プレーンごとに、次のようにします。

for(Vn in input vertices)
{
    if(Vn is on the good side of the plane)
        add Vn to output vertices

    if(edge from Vn to Vn+1 intersects plane) // or from Vn to 0 if this is the last edge
    {
        find point of intersection, I
        add I to output vertices
    }
}

飛行機ごとに繰り返します。繰り返されるコストが心配な場合は、面とエッジの間に余分なレベルの間接性を持つ構造を採用するか、単にキャッシュを保持する必要があります。頂点をインまたはアウトとしてマークしたら、頂点をダッシュ​​で囲み、エッジごとに交点をキャッシュし、キー (v1、v2) を介して検索するようなことをおそらく行うでしょう。余分なレベルの間接化を設定した場合は、結果をエッジ オブジェクトに格納します。

于 2013-02-16T00:40:38.527 に答える