
スキャンラインレンダリング(スキャンラインレンダリングとも呼ばれる)は、 3Dコンピュータグラフィックスにおける可視面判定アルゴリズムであり、ポリゴン単位またはピクセル単位ではなく、行単位で動作します。レンダリングするすべてのポリゴンは、最初に現れる最上位のy座標でソートされ、次に、スキャンラインとソート済みリストの先頭にあるポリゴンとの交点を使用して、画像の各行またはスキャンラインが計算されます。このとき、アクティブなスキャンラインが画像の下に進むにつれて、ソート済みリストは、もはや表示されなくなったポリゴンを破棄するように更新されます。
この方法の主な利点は、走査面の法線に沿って頂点をソートすることで、エッジ間の比較回数を減らせることです。また、すべての頂点の座標をメインメモリからワーキングメモリに変換する必要がないという利点もあります。現在の走査線と交差するエッジを定義する頂点のみをアクティブメモリに保持すればよく、各頂点は一度だけ読み込まれます。メインメモリは中央処理装置とキャッシュメモリ間のリンクに比べて非常に低速な場合が多いため、メインメモリ内の頂点への再アクセスを避けることで、大幅な高速化を実現できます。
この種のアルゴリズムは、フォン反射モデルやZバッファアルゴリズムなど、他の多くのグラフィックス技術と容易に統合できる。
通常の方法では、投影されたポリゴンのエッジをスキャンラインごとに1つずつバケットに挿入することから始まります。ラスタライザーはアクティブエッジテーブル(AET)を保持します。エントリは、ソートリンク、X座標、勾配、およびそれらが境界とするポリゴンへの参照を保持します。次のスキャンラインをラスタライズするには、もはや関係のないエッジが削除され、現在のスキャンラインのYバケットから新しいエッジが追加され、X座標でソートされて挿入されます。アクティブエッジテーブルのエントリには、Xおよびその他のパラメータ情報がインクリメントされます。アクティブエッジテーブルのエントリはXでソートされたリストで保持され、2つのエッジが交差すると変更が反映されます。エッジを更新した後、アクティブエッジテーブルはX方向に走査され、可視スパンのみを出力します。このとき、Zでソートされたアクティブスパンテーブルが保持され、エッジが交差するとサーフェスが挿入および削除されます。
これとZバッファリングのハイブリッド方式では、アクティブエッジテーブルのソートが不要になり、代わりに1つのスキャンラインをZバッファにラスタライズし、アクティブなポリゴン範囲を1つのスキャンラインから次のスキャンラインまで維持します。
別の方式では、中間段階でIDバッファをラスタライズし、結果として得られる可視ピクセルのシェーディングを遅延させる。
スキャンラインレンダリング技術の最初の発表は、おそらく1967年にワイリー、ロムニー、エヴァンス、エルダールによって行われた。[ 1 ]
スキャンラインレンダリング方式のその他の初期の開発は、1969年にBouknight [ 2 ]、1972年にNewell、Newell、およびSancha [ 3 ]によって行われた。これらの方法に関する初期の研究の多くは、ユタ大学のIvan Sutherlandのグラフィックスグループと、ソルトレイクシティのEvans & Sutherland社 で行われた。
初期のEvans & Sutherland ESIGシリーズの画像生成器(IG)は、フレームバッファを使用せずに一度に1ラスタラインずつ画像を生成するハードウェア技術を「オンザフライ」で採用し、当時高価だったメモリを不要にしていた。後の派生型では、ハイブリッド方式が採用された。
ニンテンドーDSは、このような方法で3Dシーンをレンダリングできる最新のハードウェアであり、ラスタライズされた画像をVRAMにキャッシュするオプションも備えている。
1980年代のゲーム機で普及していたスプライトハードウェアは、単純な2次元スキャンラインレンダリングの一種と考えることができる。
この技術は、初代Quakeエンジンで環境のソフトウェアレンダリングに使用されました(ただし、移動オブジェクトはZバッファリングによって上書きされていました)。静的なシーンは、BSP由来のソートによって優先順位が決定されました。この技術は、高深度で複雑なシーンを、コストのかかるピクセル演算(ハードウェア支援なしの透視補正テクスチャマッピングなど)で処理する上で、 Zバッファ/ペインタータイプのアルゴリズムよりも優れていることが証明されました。この使用例は、現在PCで一般的になっているZバッファベースのGPUが広く普及する以前のことです。
ソニーはPlayStation 3の開発中に、 2つ目のCellプロセッサ上でソフトウェアによるスキャンラインレンダリングを試みたが、最終的には従来のCPU/GPU構成に落ち着いた。
タイルレンダリング(最も有名なのはPowerVR 3Dチップ)でも同様の原理が用いられています。つまり、プリミティブが画面空間にソートされ、高速なオンチップメモリ上でタイルごとにレンダリングされます。ドリームキャストは、タイルを1行ずつラスタライズして直接ラスタスキャンアウトするモードを提供し、完全なフレームバッファを必要とせず、ハードウェアスキャンラインレンダリングの精神をいくらか受け継いでいました。
一部のソフトウェアラスタライザーは、「スパンバッファリング」(または「カバレッジバッファリング」)を使用します。これは、ソートされクリップされたスパンのリストをスキャンラインバケットに格納する方式です。プリミティブは、このデータ構造に順次追加され、最終段階で可視ピクセルのみがラスタライズされます。
スキャンラインレンダリングがZバッファリングよりも優れている主な点は、可視ピクセルの処理回数を最小限に抑えられることです。透明度効果を使用しない場合は常に1回で済むため、高解像度や高負荷なシェーディング計算を行う場合に有利です。
最新のZバッファシステムでは、粗い前面から背面へのソート(「リバースペインターズアルゴリズム」に近い)、早期Zリジェクト(階層型Zとの組み合わせ)、およびプログラマブルGPUで可能なあまり一般的ではない遅延レンダリング技術によって、同様の利点を得ることができます。
ラスタ画像上で動作するスキャンライン技術には、過負荷を適切に処理できないという欠点がある。
この手法は、プリミティブの数が増えるにつれてスケーラビリティが低下すると考えられています。これは、レンダリング中に必要となる中間データ構造のサイズが、複雑なシーンではZバッファのサイズを超える可能性があるためです。
そのため、現代のインタラクティブグラフィックスアプリケーションでは、Zバッファが広く普及しています。Zバッファを使用することで、大量のプリミティブを線形かつ並列に、最新のハードウェアに適した方法で走査することが可能になります。変換された座標や属性勾配などはグラフィックスチップから外部に送信される必要がなく、可視ピクセルと深度値のみが保存されます。