(57)【要約】  グラフィック処理ユニット（ＧＰＵ）は、他のグラフィック機能に用いられる処理ユニットを用いて、３次元（３Ｄ）クリッピングを効率的に実行する。ＧＰＵは、第１および第２のハードウェアユニットおよび少なくとも１つのバッファを含む。第１のハードウェアユニットは、第１のグラフィック機能のために用いられる第１の処理ユニット（例えば三角形セットアップ、深さグラディエントセットアップなどに用いられるＡＬＵ）を用いて、プリミティブの３次元クリッピングを実行する。第１のハードウェアユニットは、（ａ）各プリミティブの各頂点についてクリップコードを計算し、（ｂ）プリミティブのすべての頂点についてのクリップコードに基づいて、各プリミティブをパスするか、破棄するか、またはクリッピングするかどうかを決定し、（ｃ）クリッピング平面に対してクリッピングされるべき各プリミティブをクリッピングすることによって、３次元クリッピングを実行してもよい。第２のハードウェアユニットは、３次元クリッピングの結果として生じる新たな頂点についての属性成分値を、例えば属性グラディエントセットアップ、属性補間などに用いられるＡＬＵを用いて計算する。バッファは、３次元クリッピングの中間結果を格納する。
2010507875.tif 000002
【特許請求の範囲】
【請求項１】
第１のグラフィック機能のために用いられる第１の処理ユニットを用いて、プリミティブの３次元（３Ｄ）クリッピングを実行する第１のハードウェアユニットと、
前記第１のハードウェアユニットによる前記３次元クリッピングの中間結果を格納する少なくとも１つのバッファと、を具備するグラフィック処理ユニット。
【請求項２】
第２のグラフィック機能のために用いられる第２の処理ユニットを用いて、前記３次元クリッピングの結果として生じる新たな頂点についての属性成分値を計算する第２のハードウェアユニットをさらに具備する請求項１のグラフィック処理ユニット。
【請求項３】
前記第１の処理ユニットは、三角形セットアップおよび深さグラディエントセットアップの少なくともいずれかに用いられる算術論理演算ユニット（ＡＬＵ）である請求項１のグラフィック処理ユニット。
【請求項４】
前記第２の処理ユニットは、属性グラディエントセットアップおよび属性補間の少なくともいずれかに用いられる算術論理演算ユニット（ＡＬＵ）である請求項２のグラフィック処理ユニット。
【請求項５】
前記第１の処理ユニットは、三角形セットアップおよびラスタライズに先立って３次元クリッピングを実行する請求項１のグラフィック処理ユニット。
【請求項６】
前記第２の処理ユニットは、深さおよびステンシルのテストの後であって、属性グラディエントセットアップおよび属性補間より前に、新たな頂点についての属性成分値を計算する請求項２のグラフィック処理ユニット。
【請求項７】
前記プリミティブの各々は、少なくとも１つの頂点を具備し、各プリミティブについて、前記第１のハードウェアユニットは、前記プリミティブの各頂点についてクリップコードを生成し、前記プリミティブのすべての頂点についてのクリップコードに基づいて、前記プリミティブをパスするべきか、破棄するべきか、クリッピングするべきかどうか決定する請求項１のグラフィック処理ユニット。
【請求項８】
前記第１のハードウェアユニットは、複数のクリッピング平面に対する３次元クリッピングを実行し、各頂点についての前記クリップコードは、該頂点が前記複数のクリッピング平面の内部であるか外部であるかを示す請求項７のグラフィック処理ユニット。
【請求項９】
各頂点についての前記クリップコードは、複数のクリッピング平面の各々が１ビットで構成されるビットマップにより表わされ、各頂点について、前記第１のハードウェアユニットは、前記クリッピング平面についての前記頂点およびパラメータの座標に基づいて、各クリッピング平面ごとのビット値を決定する請求項７のグラフィック処理ユニット。
【請求項１０】
各プリミティブについて、前記第１のハードウェアユニットは、前記プリミティブのすべての頂点がビューポートに関してクリッピング平面の少なくとも１つの外部である場合、前記プリミティブを破棄し、前記プリミティブの少なくとも１つの頂点がガードバンドに関してクリッピング平面の外側である場合、前記プリミティブをクリッピングし、そうでなければ前記プリミティブをパスする請求項８のグラフィック処理ユニット。
【請求項１１】
クリッピングされる各プリミティブについて、前記第１のハードウェアユニットは、複数のクリッピング平面に対し前記プリミティブを、一度に１つのクリッピング平面ずつ、クリッピングする請求項１のグラフィック処理ユニット。
【請求項１２】
前記第１のハードウェアユニットは、前記複数のクリッピング平面の各々に対するクリッピングの中間結果を格納するために、少なくとも１つのバッファを再使用する請求項１１のグラフィック処理ユニット。
【請求項１３】
クリッピング平面に対してプリミティブをクリッピングするために、前記第１のハードウェアユニットは、前記プリミティブの少なくとも１つのエッジを、一度に１エッジずつ処理し、各エッジを前記クリッピング平面に対してクリッピングするべきかどうか決定し、前記クリッピング平面に対してクリッピングされる各エッジについての新たな頂点を決定する請求項１１のグラフィック処理ユニット。
【請求項１４】
クリッピング平面に対してプリミティブをクリッピングするために、前記第１のハードウェアユニットは、第１の処理ユニットを用いて、前記プリミティブの頂点と前記クリッピング平面との間の距離を計算し、前記距離に基づいて、前記プリミティブのエッジをクリッピングするべきかどうか決定し、前記第１の処理ユニットを用いて、クリッピングされる各エッジについての新たな頂点の座標を計算する請求項１１のグラフィック処理ユニット。
【請求項１５】
前記第１のハードウェアユニットは、前記第１の処理ユニットを用いて、クリッピングされる各エッジについての前記新たな頂点に関して補間係数をさらに計算し、前記補間係数は、前記新たな頂点についての属性成分値を計算するために用いられる請求項１４のグラフィック処理ユニット。
【請求項１６】
前記少なくとも１つのバッファは、クリッピングされているプリミティブの頂点の座標を格納する第１のバッファを具備する請求項１のグラフィック処理ユニット。
【請求項１７】
前記第１のバッファは、クリッピングされている前記プリミティブの新たな頂点の属性成分値を計算するのに用いられる係数をさらに格納する請求項１６のグラフィック処理ユニット。
【請求項１８】
前記少なくとも１つのバッファは、クリッピング平面に対するクリッピングの実行に先立って、前記プリミティブの頂点のインデックスを格納する第２のバッファと、前記クリッピング平面に対してクリッピングを行う間および前記クリッピング平面に対してクリッピングを行った後に、プリミティブの頂点のインデックスを格納する第３のバッファとをさらに具備する請求項１６のグラフィック処理ユニット。
【請求項１９】
前記少なくとも１つのバッファは、クリッピングされたプリミティブの新たな頂点についての属性成分値を計算するのに用いられる係数を格納するバッファを具備する請求項１のグラフィック処理ユニット。
【請求項２０】
後のパイプラインステージでリジェクトされる、クリッピングされたプリミティブについての係数は、前記バッファから解放される請求項１９のグラフィック処理ユニット。
【請求項２１】
第１のグラフィック機能のために用いられる第１の処理ユニットを用いて、プリミティブの３次元（３Ｄ）クリッピングを実行する第１のハードウェアユニットと、
前記第１のハードウェアユニットによる３次元クリッピングの中間結果を格納する少なくとも１つのバッファと、を具備する集積回路。
【請求項２２】
第２のグラフィック機能のために用いられる第２の処理ユニットを用いて、前記３次元クリッピングの結果として生じる新たな頂点についての属性成分値を計算する第２のハードウェアユニットをさらに具備する請求項２１の集積回路。
【請求項２３】
前記プリミティブの各々は、少なくとも１つの頂点を具備し、各プリミティブについて、前記第１のハードウェアユニットは、前記プリミティブの各頂点についてクリップコードを生成し、前記プリミティブのすべての頂点のクリップコードに基づいて、プリミティブをパスするべきか、破棄するべきか、それともクリッピングするべきかどうか決定し、前記プリミティブをクリッピングすべきならば、一度に１つのクリッピング平面ずつ、複数のクリッピング平面に対して前記プリミティブをクリッピングする請求項２１の集積回路。
【請求項２４】
前記少なくとも１つのバッファは、クリッピングされているプリミティブの頂点の座標と、クリッピングされている前記プリミティブの新たな頂点についての属性成分値を計算するのに用いられる係数とを格納する請求項２１の集積回路。
【請求項２５】
第１のグラフィック機能のために用いられる第１の処理ユニットを用いて、ハードウェアでプリミティブの３次元（３Ｄ）クリッピングを実行すること、
少なくとも１つのバッファに前記３次元クリッピングの中間結果を格納することを含む方法。
【請求項２６】
第２のグラフィック機能のために用いられる第２の処理ユニットを用いて、３次元クリッピングの結果として生じる新たな頂点についての属性成分値をハードウェアで計算することをさらに含む請求項２５の方法。
【請求項２７】
前記プリミティブの各々は、少なくとも１つの頂点を具備し、前記３次元クリッピングの実行は、各プリミティブについて、前記プリミティブの各頂点についてクリップコードを生成すること、前記プリミティブのすべての頂点のクリップコードに基づいて、前記プリミティブをパスするべきか、破棄するべきか、それともクリッピングするべきかどうか決定すること、前記プリミティブをクリッピングすべきならば、前記第１の処理ユニットを用いて、複数のクリッピング平面に対し、一度に１つのクリッピング平面ずつ前記プリミティブをクリッピングすること、を含む請求項２５の方法。
【請求項２８】
第１のグラフィック機能のために用いられる第１の処理ユニットを用いて、ハードウェアでプリミティブの３次元（３Ｄ）クリッピングを実行するための手段と、
前記３次元クリッピングの中間結果を格納するための手段と、を具備する装置。
【請求項２９】
第２のグラフィック機能のために用いられる第２の処理ユニットを用いて、３次元クリッピングの結果として生じる新たな頂点についての属性成分値をハードウェアで計算するための手段をさらに具備する請求項２８の装置。
【請求項３０】
グラフィックス処理を実行するように機能し、第１のグラフィック機能のために用いられる第１の処理ユニットを用いて、プリミティブの３次元（３Ｄ）クリッピングを実行する第１のハードウェアユニットと、前記第１のハードウェアユニットによる前記３次元クリッピングの中間結果を格納する少なくとも１つのバッファと、前記グラフィック処理ユニット用にデータを格納するメモリと、を具備するグラフィック処理ユニットを具備する無線装置。
【請求項３１】
前記グラフィック処理ユニットは、第２のグラフィック機能のために用いられる第２の処理ユニットを用いて、前記３次元クリッピングの結果として生じる新たな頂点についての属性成分値を計算する第２のハードウェアユニットをさらに具備する請求項３０の無線装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、一般に電子機器に関し、特に、グラフィック処理ユニット（ＧＰＵ）において３次元クリッピングを実行するための技術に関する。
【背景技術】
【０００２】
グラフィック処理ユニット（ＧＰＵ）は、ビデオゲーム、グラフィックス、コンピューター支援設計（ＣＡＤ）、シミュレーションおよびビジュアル化ツール、イメージングなどのような種々のアプリケーション向けに、２次元（２Ｄ）および（または）３次元（３Ｄ）画像をレンダリングするために用いられる専用ハードウェアユニットである。３次元画像は、複数表面でモデル化され、各表面はそれぞれプリミティブで近似されてもよい。プリミティブは、基本的な形状単位であり、三角形、線などを含んでも良い。ＧＰＵは、３次元画像をレンダリングするために、変換、ラスタライズ、シェーディング、ブレンディングなどのような種々のグラフィックス処理を実行してもよい。これらグラフィックス処理は、計算上、集中的となることがある。さらに、３次元画像を表現するのに用いられるプリミティブの数が例えば何百万もの多数にのぼることがある。従って、３次元画像をレンダリングするために、大量の形状データについての計算を実行するために、多くの処理およびメモリ資源が消費される可能性がある。
【０００３】
不可視であるがゆえにレンダリングされる必要のないプリミティブを識別し破棄(discard)するために、３次元クリッピングは実行されてもよい。破棄されるプリミティブについての計算を省略することにより、パフォーマンスの向上を実現することができる。しかし、３次元クリッピングそれ自体は複雑な演算である。ＧＰＵは、すべての３次元クリッピング演算を実行するための専用ハードウェアを有してもよい。しかし、そのような専用３次元クリッピングハードウェアは、ＧＰＵのコストおよび電力消費を増加させ、モバイルおよびハンドヘルド装置のような特定のアプリケーションには不適となる可能性がある。中央処理装置（ＣＰＵ）、デジタル信号プロセッサ（ＤＳＰ）などによって実行することのできるソフトウェアで３次元クリッピングを行うことにより、専用３次元クリッピングハードウェアの使用を回避してもよい。しかし、他の目的にも用いられるＣＰＵまたはＤＳＰを用いて３次元クリッピングを行うことが、プリミティブデータおよび３次元クリッピング結果を運ぶのに用いられるデータバス上の高負荷、３次元クリッピングのために送出されたプリミティブとレンダリングされるべき他のプリミティブとの間の同期といった別の問題を引き起こすことがある。
【発明の概要】
【０００４】
本明細書では、他のグラフィック機能のために用いられる１つまたは複数の処理ユニットを用いて、３次元クリッピングを効率的に実行するグラフィック処理ユニット（ＧＰＵ）について説明する。ＧＰＵは、３次元クリッピングをハードウェアで実行することによりパフォーマンスを向上することができ、３次元クリッピングを行うためにＣＰＵやＤＳＰを呼び出す必要がないことにより３次元グラフィックスパイプラインに対する悪影響を低減することができ、その他のメリットを提供することができる。
【０００５】
ある設計では、ＧＰＵは、第１および第２のハードウェアユニットおよび少なくとも１つのバッファを含む。第１のハードウェアユニットは、第１のグラフィック機能に用いられる第１の処理ユニット、例えば三角形セットアップ、深さグラディエントセットアップに用いられる算術論理演算ユニット（ＡＬＵ）などを用いて、プリミティブの３次元クリッピングを実行する。第１のハードウェアユニットは、（ａ）各プリミティブの各頂点についてクリップコードを計算し、（ｂ）プリミティブのすべての頂点についてのクリップコードに基づいて、各プリミティブをパスするべきか、破棄するべきか、クリッピングするべきかどうか決定し、（ｃ）クリッピング平面に対してクリッピングすべき各プリミティブをクリッピングすることにより、３次元クリッピングを実行してもよい。第２のハードウェアユニットは、３次元クリッピングの結果として生じる新たな頂点についての属性成分値を計算する。第２のハードウェアユニットは、第２のグラフィック機能のために用いられる第２の処理ユニット（例えば属性グラディエントセットアップ、属性補間などに用いられるＡＬＵ）を用いる。バッファは、第１のハードウェアユニットによる３次元クリッピングの中間結果を格納する。
【０００６】
以下、この開示の種々の態様および特徴をより詳しく説明する。
【図面の簡単な説明】
【０００７】
【図１】図１は、３次元クリッピング無しのＧＰＵの場合の３次元グラフィックスパイプラインを示す。
【図２】図２は、３次元クリッピングを備えたＧＰＵの場合の３次元グラフィックスパイプラインを示す。
【図３】図３は、３次元グラフィックスのための視錐台を示す。
【図４】図４は、ビューポートに対するプリミティブを示す。
【図５】図５は、１つの頂点についてのクリップコードに使われるビットマップを示す。
【図６】図６は、クリッピング平面に対する三角形のクリッピングを示す。
【図７】図７は、３次元クリッピングに用いられるバッファの構造を示す。
【図８】図８は、図２のＧＰＵにおけるユニット２２０のブロック図を示す。
【図９】図９は、図２のＧＰＵにおけるユニット２５０のブロック図を示す。
【図１０】図１０は、無線通信装置のブロック図を示す。
【発明を実施するための形態】
【０００８】
３次元画像は、プリミティブ（例えば三角形、線、他の多角形など）で表わされてもよい。プリミティブはそれぞれ、１つまたは複数の頂点（例えば三角形の３つの頂点）によって定義される。各頂点には、空間座標、カラー、テクスチャ座標などのような種々の属性が関連付けられる。各属性は、最大で４つまでの成分を持つことができる。例えば空間座標は、３つの成分ｘ，ｙ，ｚ、または４つの成分ｘ，ｙ，ｚ，ｗのどちらかで与えられてもよい。ただし、ｘおよびｙは水平および垂直座標であり、ｚは深さである。また、ｗは同次の座標(homogeneous coordinate)である。カラーは、３つの成分ｒ，ｇ，ｂ、または４つの成分ｒ，ｇ，ｂ，ａから与えられてもよい。ただし、ｒは赤、ｇは緑、ｂは青、ａはピクセルの透明度を決定する透明度ファクタである。典型的には、テクスチャ座標は水平および垂直座標、すなわちｕおよびｖから与えられる。頂点は他の属性が関連付けられてもよい。
【０００９】
図１は、ＧＰＵ１００に関して３次元グラフィックスパイプラインのブロック図を示す。頂点シェーダ１１０は、三角形および線のようなプリミティブを包含してもよい形状データについて、頂点処理を実行する。例えば、頂点シェーダ５１２は、頂点に対する光値を計算し、形状などに関してブレンディングを実行することができる。また頂点シェーダ１１０は、各頂点の座標と属性の成分値（例えばｘ，ｙ，ｚ，ｗ）を決定し、三角形セットアップおよび深さ（ｚ）グラディエントセットアップユニット１２０に頂点座標を提供し、頂点キャッシュ１８０に頂点属性成分値を提供してもよい。頂点キャッシュ１８０は、頂点とプリミティブについて属性成分値および場合により他のデータを格納する。
【００１０】
ユニット１２０は、後のラスタライズ処理のためのパラメータを計算する。例えば、ユニット１２０は、プリミティブをクリッピング座標系（あるいはクリッピング空間）からスクリーン座標系（あるいはスクリーン空間）に変換するためにビューポート変換を実行してもよい。クリッピング空間は、４次元のｘ，ｙ，ｚ，ｗを備えた正規化された同次の座標系である。スクリーン空間は、表示画面または他の何らかの出力デバイスについての３次元の座標系である。ユニット１２０は、さらに、シザリングウインドウ内にないオブジェクトを破棄するシザリング、オブジェクトのバックサイドのプリミティブを破棄する裏面カリングなどを実行してもよい。ユニット１２０は三角形／プリミティブセットアップを実行し、各プリミティブのエッジに関して一次方程式の係数、深さ（ｚ）グラディエントに関して係数などを計算してもよい。ラスタライザ１３０は、各プリミティブをピクセルに分解し、各ピクセルについてスクリーン座標を生成する。
【００１１】
初期深さ／ステンシルテストユニット１４０は、可能であれば、ピクセルがレンダリングされるか破棄されるべきかどうか決定するために、ピクセルに関してステンシルテストを行なってもよい。用語「破棄」、「ドロップ」、「リジェクト」は同意語である。用語が「パス」、「受理」もまた同意語である。ユニット１４０は、ピクセルについてのステンシルバッファ（図１においては示されない）に格納されたステンシル値を基準値と比較し、その比較結果に基づいて、ピクセルをパスするか破棄する。ユニット１４０は、適用可能な場合、ピクセルがレンダリングされるべきか破棄されるべきかどうかを決定するために、ピクセルごとに深さテスト（ｚテストとも称される）を行なってもよい。ユニット１４０は、ピクセルに対するｚ値（現在のｚ値）をｚバッファにおいて対応するｚ値（格納されたｚ値）と比較し、現在のｚ値が、格納されたｚ値に対してより接近し／近いならば、ピクセルをパスし、ｚバッファおよび場合によりステンシルバッファを更新する。現在のｚ値が、格納されたｚ値よりさらに後方であるならば、ピクセルを破棄する。
【００１２】
属性グラディエントセットアップおよび属性補間ユニット１５０は、プリミティブ内のピクセルについて属性成分値を得るために、プリミティブの頂点について属性成分値を補間する。ユニット１５０は、最初に、頂点の属性成分値に基づいて、属性補間のためのパラメータを計算してもよい。これらのパラメータは、属性補間のための一次方程式の属性グラディエントまたは係数であってもよい。その後、ユニット１５０は、そのピクセルのスクリーン座標および補間パラメータに基づいて、各プリミティブ内の各ピクセルについて属性成分値を計算することができる。
【００１３】
ピクセル／フラグメントシェーダ１６０は、ピクセルとフラグメントについて種々のグラフィックス処理を実行してもよい。フラグメントはピクセルと、その関連情報である。例えば、ピクセル／フラグメントシェーダ１６０は、可能であるならば、ピクセルにテクスチャを適用するテクスチャマッピングを実行してもよい。テクスチャ化は、そのピクセルのテクスチャ座標によって示された位置におけるテクスチャ画像のカラーでピクセルのカラーを修正することにより実現される。ポストプロセッサ１７０は、各フラグメントについて、アルファテスト、フォグブレンディング、アルファブレンディング、論理演算、ディザリング演算などのような他のグラフィックス処理を実行してもよい。ポストプロセッサ１７０は、ディスプレイデバイス上での提示のためのカラーバッファ（両方とも図１には示されない）に出力ピクセルを提供する。
【００１４】
ＧＰＵ１００は、３次元クリッピングに必要な計算が複雑であることからコスト高となり得、プリミティブの僅かな割合だけをクリッピングする場合であっても調整され得ない専用３次元クリッピングハードウェアは、持っていない。この場合、３次元クリッピングは、ＣＰＵまたはＤＳＰ上で実行されるソフトウェアで行ってもよい。頂点処理を完了した後に、ＧＰＵ１００は、必要に応じて、３次元クリッピングのためにＣＰＵまたはＤＳＰに対してプリミティブデータを送信してもよい。その後、ＧＰＵ１００は、ＣＰＵまたはＤＳＰからの３次元クリッピング結果を待ってもよい。それは、ＧＰＵがアイドル状態でいる間、ＧＰＵのリソースを浪費するであろう。その代わりに、ＧＰＵ１００は、新たなプリミティブを処理し、バッファに結果を格納してもよい。ＣＰＵまたはＤＳＰから新たなプリミティブとともに３次元クリッピング結果を受け取ると、ＧＰＵ１００は、該新たなプリミティブを次のステージへ送り、該バッファにおいて該プリミティブをバイパスする。これは、３次元クリッピング結果を待つ間のＧＰＵリソースの浪費を回避するが、多くのバッファリングが要求され、同期および他の問題を引き起こす可能性がある。
【００１５】
図２は、他のグラフィック機能のための処理ユニットを用いて、３次元クリッピングを効率的にサポートするＧＰＵ２００に関して３次元グラフィックスパイプラインのブロック図を示す。ＧＰＵ２００は、図１について上述したように動作する、頂点シェーダ１１０、ラスタライザ１３０、初期深さ／ステンシルテストユニット１４０、ピクセル／フラグメントシェーダ１６０、ポストプロセッサ１７０および頂点キャッシュ１８０を含む。さらにＧＰＵ２００は、（ａ）図１におけるユニット１２０に代わる、３次元クリッピング、三角形セットアップおよび深さグラディエントセットアップユニット２２０と、（ｂ）図１におけるユニット１５０に代わる、新頂点属性計算、属性グラディエントセットアップおよび属性補間ユニット２５０を含む。
【００１６】
ユニット２２０は、三角形セットアップおよび深さグラディエントセットアップに用いられる処理ユニット（例えばＡＬＵ）を用いて、プリミティブごとの３次元クリッピングを実行する。３次元クリッピングについては、ユニット２２０は、各プリミティブをパスするべきか、破棄するべきか、クリッピングするべきかどうか決定し、クリッピングされる各プリミティブごとに、３次元クリッピングにより生じる新規の頂点に関して、座標および補間係数を決定する。３次元クリッピングのためのユニット２２０による処理を以下で説明する。
【００１７】
ユニット２５０は、３次元クリッピングから、新たな頂点についての属性成分値を計算する。ユニット２５０は、この計算を、属性グラディエントセットアップおよび属性補間に用いられる処理ユニット（例えばＡＬＵ）を用いて実行してもよい。その後、ユニット２５０は、他のプリミティブと共に新たなプリミティブに関して、属性グラディエントセットアップおよび属性補間を実行してもよい。
【００１８】
図２において示されるように３次元クリッピングを行うことには、（ａ）はハードウェアで３次元クリッピングを実行することによるパフォーマンスの向上、（ｂ）他のグラフィック機能に用いられる処理ユニットを借用することで、３次元クリッピングをサポートするための付加的ハードウェアコストを小さくすること、（ｃ）３次元クリッピングを実行するためにＣＰＵやＤＳＰを呼び出す必要がないことによる、３次元グラフィックスパイプラインへの悪影響の低減、（ｄ）場合により他の利点といった、確かな利点がある。
【００１９】
図３は、３次元グラフィックスのための視錐台３００を示す。レンダリングエンジンのためのカメラは、３次元（ｘ，ｙ，ｚ）座標系の原点に位置する。視錐台は、スクリーンに表示されるかもしれないモデル化された世界における３次元ボリューム空間である。視錐台は切り取られた角錐に似ており、６つの平面−切り取られた角錐の４つの側面について４つの平面、角錐の切り取られた上部について１つの平面（ｚ近平面と呼ばれる）、角錐の基部についてもう一つの平面（ｚ遠平面と呼ばれる）から構成される。視錐台の外側のオブジェクトは、レンダリングされずに破棄されてもよい。カメラとの距離にかかわらずオブジェクトをレンダリングすることができるよう、ｚ遠平面は無限遠点に置かれてもよい。この場合、視錐台は、４つの側面について４つの平面と、ｚ近平面によって構成される。
【００２０】
図４は、ビューポート４００に対する種々のプリミティブを示す。ビューポートは、３次元シーンが投影され、視錐台の基部に対応してもよい２次元矩形である。ｚ近平面は、存在するが、図４の２次元表現では示されていない。ガードバンド４１０は、ビューポートに等しいか、ビューポートより大きい矩形である。３次元クリッピングは、ビューポートの代わりにガードバンドに対して実行されてもよい。ガードバンドをより大きくすると、クリッピングされるプリミティブの数はより少なくなる（望ましい）ともに、次のステージにパスする、クリッピングされたプリミティブの数がより多くなる。逆のことが、ガードバンドをより小さくすることに関して当てはまる。
【００２１】
ある設計では、頂点のすべてがビューポートの５つの平面のうちのいずれかの外部である場合、プリミティブは破棄される。いずれかの頂点がガードバンドの５つの平面のうちのいずれかの外部である場合、破棄されないプリミティブは、クリッピングされる。破棄されずクリッピングされない場合、該プリミティブはパスされる。図４に示される例において、プリミティブ１，６，９，１１，１２は破棄される。プリミティブ２，７，８，１０はパスされる。また、プリミティブ３，４，５，１３，１４がクリッピングされる。他の基準に基づいて、プリミティブを破棄し、パスし、クリッピングしてもよい。
【００２２】
３次元クリッピングは、以下のように実行されてもよい。
【００２３】
１．各プリミティブの各頂点についてクリップコードを決定する。
【００２４】
２．各プリミティブについてクリッピング判断を行い、プリミティブのすべての頂点のクリップコードに基づいて、プリミティブをパスするべきか、破棄するべきか、それともクリッピングするべきかどうか決定する。
【００２５】
３．  クリッピングされた各プリミティブについて新たな頂点の座標を計算する。
【００２６】
４．  クリッピングされた各プリミティブの新たな頂点についての属性成分値を計算する。
【００２７】
下記に述べられるように、図２におけるＧＰＵ２００の内のユニット２２０は、（例えばビューポート変換および三角形セットアップを実行する前に）ステップ１、２および３を実行してもよい。プリミティブをクリッピングすると、１つまたは複数のクリッピング平面の交点に、１つまたは複数の新たな頂点をもたらす可能性がある。例えば、ガードバンドに対する図４における三角形４のクリッピングは、上平面に対する２つの新たな頂点および右平面に対する２つの新たな頂点がもたらされることになる。クリッピングされた三角形は、５つの頂点をもつ多角形になり、３つの新たな三角形に分割されることができる。ユニット２２０は、新規のプリミティブに関して頂点座標を計算する。これらの新たなプリミティブは、３次元クリッピングによってパスされるプリミティブと同様に、３次元グラフィックスパイプラインの後のステージに渡されて処理される。
【００２８】
ＧＰＵ２００のユニット２５０は、下記に述べられるようなステップ４を実行してもよい。新たな頂点についての属性成分値の計算は、ユニット２２０、１３０および／または１４０によってリジェクトされるかも知れない頂点についての計算を節約するために、ユニット２５０まで延期されてもよい。パイプライン２００における、ユニット２２０、１３０および１４０は属性について演算しないので、新たな頂点属性計算は延期されてもよい。あるいは、ユニット２２０が、新たな頂点について属性成分値を計算してもよい。
【００２９】
プリミティブはガードバンドに対してクリッピングされてもよく、ｘ，ｙ，ｚ座標に関して３つのガードバンドパラメータＧＢ＿Ｓｃａｌｅ＿Ｘ，ＧＢ＿Ｓｃａｌｅ＿Ｙ，ＧＢ＿Ｓｃａｌｅ＿Ｚによるビューポートにそれぞれ関連して定義されてもよい。ＧＢ＿Ｓｃａｌｅ＿Ｘは、ｘ方向のビューポートサイズに対するガードバンドサイズの比である。ガードバンドサイズがビューポートサイズと同じである場合、ＧＢ＿Ｓｃａｌｅ＿Ｘは１．０に等しく、ガードバンドサイズがビューポートサイズより大きい場合、１．０を越える。ＧＢ＿Ｓｃａｌｅ＿ＹとＧＢ＿Ｓｃａｌｅ＿Ｚは、ｙおよびｚ方向について同様に定義される。
【００３０】
３次元クリッピングについて、クリップコードは、当初は、各プリミティブの各頂点ごとに決定される。頂点は４つの成分ｘ，ｙ，ｚ，ｗによって規定されてもよい。ただし、ｘ，ｙ，ｚは、３次元空間における頂点の位置を規定する。また、ｗは遠近法の深さを規定する。ガードバンドについては、ｚ近平面は−ＧＢ＿Ｓｃａｌｅ＿Ｚ＊ｗとして与えられる。左平面は−ＧＢ＿Ｓｃａｌｅ＿Ｘ＊ｗとして与えられる。右平面はＧＢ＿Ｓｃａｌｅ＿Ｘ＊ｗとして与えられる。底平面はＧＢ＿Ｓｃａｌｅ＿Ｙ＊ｗとして与えられる。また、上平面は−ＧＢ＿Ｓｃａｌｅ＿Ｙ＊ｗとして与えられる。ｚ遠平面でのクリッピングの可能性は低いことから、ｚ遠平面はここでは無視する。ｚ遠平面によるクリッピングは、後のセットアップパイプラインステージによって他の方法で等価的に行われ得ることから、ここでは説明しない。
【００３１】
図５は、１つの頂点についてのクリップコードに使われるビットマップ５００を示す。ビットマップは９つのクリッピング平面に関して９ビットを含み、各クリッピング平面につき１ビットを含む。ビット１はｚ近平面用であり、ビューポートとガードバンドの両方に適用可能である。ビット２，４，６，８は、ビューポートについて、それぞれ左、上、右、底平面用である。ビット３，５，７，９は、ガードバンドについて、それぞれ左、上、右、底平面用である。頂点が、対応するクリッピング平面の外部である場合、ビットマップにおける各ビットは１（「１」）にセットされてもよい。ガードバンドについてクリッピング平面の外部の頂点は、ビューポートについて対応するクリッピング平面の外部でもある。従って、頂点がガードバンドのクリッピング平面の外部にある場合、２ビット（１ビットはガードバンド用、もう一つはビューポート用）がセットされる。頂点が、ビューポートのクリッピング平面と、ガードバンドの対応するクリッピング平面との間にある場合、１ビットのみがセットされる。
【００３２】
頂点についてのクリップコードは、次の擬似コードに基づいて決定されてもよい。
【００３３】
100   If (z < -GB_Scale_Z * w) ClipCode  = 0x2;     // z near plane  
110   If (x < -GB_Scale_X * w) ClipCode |= 0xc;     // guardband left plane  
120          Else if (x < - w) ClipCode |= 0x4;     // viewport left plane  
130   If (y < -GB_Scale_Y * w) ClipCode |= 0x30;   // guardband top plane  
140          Else if (y < - w) ClipCode |= 0x10;   // viewport top plane  
150   If (x > GB_Scale_X * w)  ClipCode |= 0xc0;   // guardband right plane  
160           Else if (x > w)  ClipCode |= 0x40;   // viewport right plane  
170   If (y > GB_Scale_Y * w)  ClipCode |= 0x300;  // guardband bottom plane  
180           Else if (y > w)  ClipCode |= 0x100;  // viewport bottom plane  
擬似コードにおいて、「｜＝」は、該「｜＝」の右項の値との現在値のビットワイズなＯＲ演算を表す。
【００３４】
上記の擬似コードでは、１００行目は、頂点がｚ近平面の背後にある場合、ビットマップのビット１に１（「１」）をセットする。１１０行目は、頂点がガードバンドの左平面の外部（つまり、該左平面の左）である場合、ビット２および３をセットする。１２０行目は、頂点がビューポートの左平面とガードバンドの左平面との間にある場合、ビット２をセットする。１３０行目は、頂点がガードバンドの上平面上にある場合、ビット４および５をセットする。１４０行目は、頂点がビューポートの上平面とガードバンドの上平面との間にある場合、ビット４をセットする。１５０行目は、頂点がガードバンドの右平面の外部（つまり、該右平面の右）の場合、ビット６および７をセットする。１６０行目は、頂点がビューポートの右平面とガードバンドの右平面との間にある場合、ビット６をセットする。１７０行目は、頂点がガードバンドの底平面より下である場合、ビット８および９をセットする。１８０行目は、頂点がビューポートの底平面とガードバンドの底平面との間にある場合、ビット８をセットする。
【００３５】
クリッピング決定は、プリミティブのすべての頂点についてのクリップコードに基づいて、各プリミティブについてなされる。クリッピング決定は、次の擬似コードに基づいて得られてもよい。
【００３６】
200   Clip_And = V0.ClipCode AND V1.ClipCode AND V2.ClipCode;
210   Clip_Or = V0.ClipCode OR V1.ClipCode OR V2.ClipCode;
220   If (Clip_And ≠0) Discard the primitive;
230   Else if (Clip_Or AND 0x2AA) Clip the primitive;
240   Else Pass the primitive;
上記の擬似コードでは、Ｖ０．ＣｌｉｐＣｏｄｅは、プリミティブの第１の頂点のクリップコードを持つビットマップである。Ｖ１．ＣｌｉｐＣｏｄｅは、第２の頂点のクリップコードビットマップである。また、Ｖ２．ＣｌｉｐＣｏｄｅは、第３の頂点のクリップコードビットマップである。プリミティブが線である場合、２つの頂点について、Ｖ０．ＣｌｉｐＣｏｄｅおよびＶ１．ＣｌｉｐＣｏｄｅのみが用いられる。プリミティブが点である場合、１つの頂点についてＶ０．ＣｌｉｐＣｏｄｅのみが用いられる。２００行目は、プリミティブの３つの頂点について、３つのクリップコードビットマップのビットワイズな論理ＡＮＤを実行する。２１０行目は、プリミティブについて、３つのクリップコードビットマップのビットワイズな論理ＯＲを実行する。２２０行目は、ビューポートに関して３つの頂点がすべてクリッピング平面のいずれかの外部にある場合、プリミティブを破棄する。２３０行目は、破棄されず、いずれかの頂点がガードバンドのいずれかのクリッピング平面の外部にある場合、プリミティブをクリッピングする。２４０行目は、破棄されず、またはクリッピングされない場合、そのプリミティブをパスする。
【００３７】
３次元クリッピングについて、プリミティブは、ガードバンドの５つのクリッピング平面に対して一度に１つのクリッピング平面ずつ、クリッピングされてもよい各クリッピング平面ごとに、該クリッピング平面に対してエッジをパスし、破棄し、それともクリッピングするかどうかを決定するために、プリミティブの各エッジは検査されてもよい。クリッピングされる各エッジについては、新たな頂点はそのエッジとクリッピング平面の間の交差について決定され、クリッピング平面の外部にある頂点は、ドロップされ、新たな頂点が追加される。
【００３８】
図６は、１つのクリッピング平面に対する１つの三角形のクリッピングを示す。この三角形は、Ｖ０，Ｖ１，Ｖ２とラベル付けされた３つの頂点を持つ。頂点Ｖ０とＶ１の間のトップエッジがクリッピングされるべきかどうかは以下のように決定されてもよい。頂点Ｖ０とクリッピング平面の間の符号付き距離Ｄ０は、頂点Ｖ０座標とクリッピング平面係数すなわちＤＰ４（Ｃ０，ＣＰ）のドット積によって得られてもよい。ただし、ＤＰ４は４つのエレメントドット積を表す。Ｃ０は、頂点Ｖ０の（ｘ，ｙ，ｚ，ｗ）座標を含んでいる。ＣＰは、クリッピング平面の（ｘ，ｙ，ｚ，ｗ）係数を含んでいる。頂点Ｖ１とクリッピング平面の間の符号付き距離（Ｄ１）が、頂点Ｖ１座標とクリッピング平面係数のドット積によって得られてもよい。頂点がクリッピング平面の内部にある場合、その頂点についての符号付き距離は正であり、頂点がクリッピング平面の外部にある場合、負である。２つの頂点は、（ａ）それらの距離が両方とも正の場合、保持し、（ｂ）それらの距離が両方とも負である場合、破棄し、または、（ｃ）一方の距離が正で、別の距離が負の場合、クリッピングしてもよい。
【００３９】
図６に示されるように頂点Ｖ０がクリッピング平面の内部にあり（Ｄ０正）、頂点Ｖ１がクリッピング平面の外部にある場合（Ｄ１負）、エッジは、補間係数ｔの計算により以下のようにクリッピングされてもよい。
【数１】
2010507875.tif 000003
【００４０】
クリッピング平面とエッジの交点の新たな頂点Ｖ３の座標は、以下のように計算されてもよい。
【数２】
2010507875.tif 000004
【００４１】
ただし、Ｃ０，Ｃ１，Ｃ３は、それぞれ、頂点Ｖ０，Ｖ１，Ｖ３の座標である。クリッピング平面が頂点Ｖ１よりも頂点Ｖ０に対して近づくと、ｔは大きくなり、より大きなウェイトがＣ１よりもＣ０に対して与えられる。クリッピング平面がＶ０よりもＶ１に対して近い場合には、逆のことが当てはまる。
【００４２】
図６には示していないが頂点Ｖ１がクリッピング平面の内部にあり（Ｄ１正）、頂点Ｖ０がクリッピング平面の外部にある場合（Ｄ０負）、補間係数ｔ’が以下のように計算されてもよい。
【数３】
2010507875.tif 000005
【００４３】
次いで、新たな頂点Ｖ３の座標が以下のように計算されてもよい。
【数４】
2010507875.tif 000006
【００４４】
式（１）乃至（４）では、新たな頂点が内部の頂点から外部の頂点まで補間される。補間係数および新たな頂点座標についての式は、どの頂点がクリッピング平面の内部にあって、どの頂点がクリッピング平面の外部にあるかに依存する。
【００４５】
図６における三角形のボトムエッジをトップエッジの場合と同様にクリッピングして、新たな頂点Ｖ４を得ることができる。右エッジの２つの頂点はクリッピング平面の外部にあり、負の距離を持つ。これらの２つの頂点は破棄されることになる。新規の三角形は、既存の頂点Ｖ０ならびに新たな頂点Ｖ３およびＶ４によって構成される。この新規の三角形は、別のクリッピング平面に対してクリッピングされてもよい。
【００４６】
プリミティブ（例えば三角形）の３次元クリッピングが、５つのクリッピング平面に関して５つのクリッピングパスで実行されてもよい。表１は、５つのクリッピング平面、クリッピングが実行されてもよい順序、各クリッピング平面の係数を記載している。この構造では、クリッピングは、ｚ近平面、次に左平面、次に上平面、次に右平面、最後に底平面に対して実行される。クリッピングは、他の順序で実行されてもよい。
【表１】
2010507875.tif 000007
【００４７】
概して、多角形は、（ａ）該多角形のエッジの周囲をトラバースし、（ｂ）クリッピング平面に対して各エッジをクリッピングすることにより、クリッピング平面に対してクリッピングされることができる。各エッジについて、先ず当該エッジがクリッピング平面により交差されているかどうかの判定がなされ、イエスの場合には、交差点について新たな頂点を計算し、クリッピング平面の外部にある頂点と置き換える。頂点の数は、クリッピング平面に対するクリッピングを経て増加するかもしれない。
【００４８】
図７は、プリミティブ、例えば三角形または線の３次元クリッピングに用いられるバッファの構造を示す。３次元クリッピング処理の過程で、プリミティブについて最大で８つの頂点が得られてもよい。頂点バッファ７１０は、クリッピングされるプリミティブについて、頂点座標および属性補間係数を格納する。頂点バッファ７１０は、０乃至８のインデックス付きの９つのロケーションを持つ。頂点バッファロケーションは、それぞれ、１つの頂点について（ｘ，ｙ，ｚ，ｗ）座標および属性補間係数（α，β）を格納することができる。各頂点バッファロケーションは、当該バッファロケーションが有効な頂点を格納しているかどうかを示す有効／無効フラグを持つ。頂点バッファ７１０は、最初のクリッピングパスに先立って初期化され、各クリッピングパスの間、およびその後に更新される。
【００４９】
読み出しインデックスバッファ７２０は、クリッピングパスの始まりにおける、プリミティブ頂点についてのインデックスを格納する。これらインデックスは、頂点が格納される頂点バッファ７１０のロケーションを指す。読み出しインデックスバッファ７２０は、０乃至７のインデックス付きの８つのロケーションを持つ。各読み出しインデックスバッファロケーションは、１つの頂点バッファロケーションについてのポインタ（またはインデックス）を格納できる。読み出しインデックスバッファ７２０は、各クリッピングパスに先立って決定される。
【００５０】
書き込みインデックスバッファ７３０は、クリッピングパス中およびクリッピングパスの後に、プリミティブの頂点に関してインデックスを格納する。書き込みインデックスバッファ７３０は、０乃至７のインデックス付の８つのロケーションを持つ。各書き込みインデックスバッファロケーションは、１つの頂点バッファロケーションについてのポインタ（またはインデックス）を格納することができる。書き込みインデックスバッファ７３０は、各クリッピングパス中およびクリッピングパスの後に更新される。
【００５１】
係数バッファ７４０は、頂点に関して属性補間係数を格納する。係数バッファ７４０は、インデックス０乃至Ｔ−１付きのＴ個のロケーションを含む。ただし、Ｔは任意の数である。各係数バッファロケーションは、１つの頂点について属性補間係数を格納することが可能である。各係数バッファロケーションは、当該バッファロケーションが有効な頂点についての係数を格納しているかどうかを示す、使用／未使用フラグを持つ。全５つのクリッピングパスを経て、頂点バッファ７１０におけるすべての有効な頂点について、属性補間係数は、係数バッファ７４０の未使用のロケーションに保存される。ある頂点が、後に、（例えば、図２における、ラスタライザ１３０または初期深さ／ステンシルテストユニット１４０によって）破棄される場合、その頂点についてのフラグは未使用に設定され、バッファロケーションは別の頂点についての係数を格納するために用いられる。
【００５２】
バッファ７１０，７２０，７３０は、ｚ近平面についての最初のクリッピングパスに先立って初期化される。バッファ７１０は、ロケーション０に頂点Ｖ０の頂点座標Ｃ０および属性補間係数Ａ０を格納し、ロケーション１に頂点Ｖ１の座標Ｃ１および係数Ａ１を格納し、ロケーション２に頂点Ｖ２の座標Ｃ２および係数Ａ２を格納してもよい。Ｃｋは、頂点Ｖｋの座標（ｘ，ｙ，ｚ，ｗ）を含んでいる。また、Ａｋは、ｋ＝０，１，２について、頂点Ｖｋの係数（α，β）を含んでいる。Ａ０は頂点Ｖ０用であり（１．０，０．０）に等しく、Ａ１は頂点Ｖ１用であり（０．０，１．０）に等しく、Ａ２は頂点Ｖ２用であり（０．０，０．０）に等しい。バッファ７１０のロケーション０，１，２は有効にセットされ、ロケーション３乃至８は無効にセットされる。読み出しインデックスバッファ７２０は、（バッファ７１０における、頂点Ｖ０，Ｖ１，Ｖ２，Ｖ０へのポインタである）頂点バッファインデックス０，１，２，０をそれぞれ読み出しインデックスバッファロケーション０，１，２，３に格納する。４つの頂点バッファインデックス０，１，２，０は、クリッピングされるプリミティブ周囲に、１つの完全ループを作る。変数Ｃｏｕｎｔ＿ｏｌｄは、クリッピングパスの始まりにおける頂点の数を示し、三角形の場合では３に初期化される。書き込みインデックスバッファ７３０は、各クリッピングパスの始まりの時点では空である（図７において図示しない）。変数Ｃｏｕｎｔ＿ｎｅｗは、現在のクリッピングパスに関して頂点の数を示し、クリッピングパスの始まりの時点ではゼロに初期化される。
【００５３】
線の場合、２つの頂点Ｖ０およびＶ１のみが存在する。最初のクリッピングパスに先立って、頂点バッファ７１０のロケーション０は第１頂点についてＣ０とＡ０を格納し、ロケーション１は第２頂点についてＣ１とＡ１を格納する。読み出しインデックスバッファ７２０は、最初の２つのロケーションに０と１を格納する。Ｃｏｕｎｔ＿ｏｌｄは１にセットされる。
【００５４】
ｉ＝０，．．．，４について、ガードバンドに関してｉ番目のクリッピング平面に対するプリミティブのクリッピングは、次の擬似コードに基づいて実行されてもよい。
【００５５】
300 If ((Clip_Or AND (2<<(2*i)))==0) Skip clipping for this plane;  
310 Else {  
320   Count_new = 0;  
330   Last_dist = DP4(VB[readIB[0]], plane[i]);  
340   For (k = 1; k ≦ Count_old) {  
350     New_dist = DP4(VB[readIB[k]], plane[i]);  
360     If (Last_dist ≧ 0 AND New_dist ≧ 0)  //V[k-1] & V[k] both inside plane  
370       writeIB[Count_new++] = readIB[k-1]; //accept V[k-1] directly  
380     Else (Last_dist ≧ 0 AND New_dist < 0) { //V[k-1] inside & V[k] outside  
390       writeIB[Count_new++] = readIB[k-1];  //accept V[k-1] directly  
400       t = -New_dist / (Last_dist - New_dist);  //interpolate new vertex  
410       VB[J] = VB[readIB[k-1]] * t + VB[readIB[k]] * (1-t);  
420       writeIB[Count_new++] = J; }  //J is an empty location in VB  
430     Else if (Last_dist < 0 AND New_dist ≧ 0){ // V[k-1] outside & V[k] inside  
440       t = Last_dist / (Last_dist - New_dist);  // interpolate new vertex  
450       VB[J] = VB[readIB[k]] * t + VB[readIB[k-1]] * (1-t);  
460       writeIB[Count_new++] = J; }  
470     Else                                      //V[k-1] & V[k] both outside   
480       do nothing;    
490     Last_dist = New_dist;  } }   
500 If (triangle type) {                        //triangle type  
510   writeIB[Count_new] = writeIB[0];          // may omit for last plane  
520   If (Count_new < 3) Drop the primitive; }  //degenerate triangle now  
530 Else if (New_dist ≧ 0) {                   //line type  
540   writeIB[1] = readIB[1];  }  
550 Else if (Count_new < 1) Drop the primitive;  
560 Else Count_new = 1;  
570 Update VB valid flags with writeIB;  
580 Switch roles of readIB and writeIB;  
590 Count_old = Count_new;  
上記の擬似コードにおいて、３００行目は、頂点のいずれもｉ番目の平面の外部にない場合、ｉ番目の平面についてのクリッピングをスキップする。そうでなければ、３１０〜５９０行目は、ｉ番目の平面に対するクリッピングを実行する。３３０行目は、頂点Ｖ［０］とｉ番目の平面の間の符号付き距離を計算する。ここで「［０］」は、読み出しインデックスバッファのロケーション０に格納された頂点バッファインデックスを示す。３４０行目は、ｋ＝１，．．．，Ｃｏｕｎｔ＿ｏｌｄについて、読み出しインデックスバッファにおける残りの頂点によって繰り返され、基本的に、プリミティブのすべてのエッジをトラバース(traverse)する。３５０〜４９０行目は、必要に応じて、頂点Ｖ［ｋ−１］とＶ［ｋ］の間のｋ番目のエッジについてクリッピングを実行する。３５０行目は、頂点Ｖ［ｋ］とｉ番目の平面の間の符号付き距離を計算する。
【００５６】
３６０行目は、頂点Ｖ［ｋ−１］およびＶ［ｋ］が正の距離を持っており両方ともｉ番目の平面の内部であるかどうかを判定する。そうならば、次いで３７０行目は、書き込みインデックスバッファに頂点ｖ［ｋ−１］を保存する。
【００５７】
３８０行目は、頂点Ｖ［ｋ−１］がｉ番目の平面の内部にあって、頂点Ｖ［ｋ］はｉ番目の平面の外部にあるかどうか判定する。そうならば、次いで３９０行目は、書き込みインデックスバッファに頂点Ｖ［ｋ−１］を保存する。４００行目は、式（１）に示されるような補間係数を計算する。４１０行目は、式（２）に示されるような新たな頂点の座標を計算し、頂点バッファの空のロケーションＪに新たな頂点座標を保存する。新たな頂点座標は、頂点Ｖ［ｋ］座標を超えては保存されず、次のエッジに用いられる。６つの成分ｘ，ｙ，ｚ，ｗ，α，βに関して、ｉ番目の平面の内部から外部まで補間が実行される。４２０行目は、書き込みインデックスバッファに新たな頂点を保存する。
【００５８】
４３０行目は、頂点Ｖ［ｋ−１］がｉ番目の平面の外部にあって、頂点Ｖ［ｋ］はｉ番目の平面の内部にあるかどうか判定する。そうならば、次いで４４０行目は式（３）に示されるような補間係数を計算する。４５０行目は、式（４）に示されるような新たな頂点の座標を計算し、頂点バッファの空のロケーションＪに新たな頂点座標を保存する。４６０行目は、頂点Ｖ［ｋ−１］に代わる新たな頂点を書き込みインデックスバッファに保存する。
【００５９】
頂点Ｖ［ｋ−１］およびＶ［ｋ］が両方ともｉ番目の平面の外部にある場合、４７０行目に達する。この場合、頂点Ｖ［ｋ−１］は保存されない。
【００６０】
最終的にｉ番目の平面に対してすべてのエッジがクリッピングされると、４９０行目は、次のエッジのために、頂点Ｖ［ｋ］についての距離を終わりの距離として保存する。
【００６１】
５００〜５９０行目は、次の平面に対するクリッピングのための準備を実行する。プリミティブが三角形である場合、５１０行目は、最後の頂点として、頂点Ｖ［０］を書き込みインデックスバッファに保存する。これは、多角形の最初の頂点および最後の頂点としての頂点Ｖ［０］付きの閉多角形を構成する。５２０行目は、頂点の数が３未満である場合、プリミティブをドロップする。５３０行目は、プリミティブが線である場合、頂点Ｖ［１］がｉ番目の平面の内部にあるかどうか判定する。そうならば、次いで５４０行目は、頂点Ｖ［１］を書き込みインデックスバッファに保存する。５５０行目は、頂点の数が１未満かどうか判定し、そうならば、プリミティブを破棄する。５７０行目は、無効であるとして書き込みインデックスバッファに含まれないロケーションのすべてをマーキングすることにより、頂点バッファを更新する。
【００６２】
ｉ番目の平面についての読み出しおよび書き込みインデックスバッファの役割は、５８０行目により（ｉ＋１）番目の平面用に切り替えられる。ｉ番目の平面についての書き込みインデックスバッファは、（ｉ＋１）番目の平面についての読み出しインデックスバッファとして用いられ、ｉ番目の平面についての読み出しインデックスバッファは、（ｉ＋１）番目の平面についての書き込みインデックスバッファとして用いられる。ｉ番目の平面に対してクリッピングした後の頂点の数は、５９０行目において、（ｉ＋１）番目の平面についてのクリッピングパスの始まりにおける頂点の数として用いられる。その後、（ｉ＋１）番目の平面についてのクリッピングは、ｉ番目の平面の場合と同じ方法で実行されてもよい。
【００６３】
図６において示される例を参照すると、頂点Ｖ０がクリッピング平面の内部にあり、頂点Ｖ１およびＶ２がクリッピング平面の外部にある場合、頂点バッファ、読み出しインデックスバッファ、クリッピングパスの始まりと終わりの書き込みインデックスバッファの内容は、次のように与えられてもよい。
【表２】
2010507875.tif 000008
【００６４】
ここで「ｘ」は無効エントリを示す。頂点バッファのロケーション１および２は、クリッピング平面内の頂点Ｖ１およびＶ２を格納する。クリッピング平面の終わりのときに、５００行目によって、これらのロケーションは無効のものとしてマーキングされる。プリミティブは、クリッピングを経て、頂点Ｖ０，Ｖ３，Ｖ４で定義される。
【００６５】
頂点Ｖ０がクリッピング平面の外部にあり、頂点Ｖ１およびＶ２はクリッピング平面の内部にある場合、バッファの内容は次のように与えられてもよい。
【表３】
2010507875.tif 000009
【００６６】
プリミティブは、クリッピングを経て４つの頂点Ｖ３，Ｖ１，Ｖ２，Ｖ４で定義される。
【００６７】
５つの平面すべてに対するクリッピングの後、３を超える頂点を持つ多角形が結果として得られるかもしれない。この場合、この多角形について、頂点バッファに格納された有効な頂点の座標を用いて、新規の三角形を構成してもよい。３次元クリッピングによって生成されたすべての三角形は、パイプライン内の次のステージへ送られてもよい。新たな頂点についての属性補間係数は、ユニット２５０による使用のために係数バッファに格納されてもよい。
【００６８】
ユニット２５０は、３次元クリッピングによって生成された新たな頂点についての属性成分値を計算する。ユニット２５０は、属性グラディエントセットアップおよび属性補間を実行する前に、これらの属性成分値を計算してもよい。またユニット２５０は、新たな頂点属性計算を実行するために、属性グラディエントセットアップおよび属性補間に用いられるＡＬＵを借用してもよい。
【００６９】
ユニット２５０は、新たな頂点についての属性成分値を以下のように計算してもよい。一定の属性補間モードが選択されている場合、新たな頂点についての属性成分値は、先行の頂点についての属性成分値にセットされる。そうでなければ、係数バッファ７４０に格納された係数（α，β）を使って以下のように直線補間が実行されてもよい。
【数５】
2010507875.tif 000010
【００７０】
Ｖｋ．ｃｏｍｐ［ｊ］は、頂点Ｖｋ（ｋ＝０，１，２）のｊ番目の成分であり、ｎｅｗＶ．ｃｏｍｐ［ｊ］は新たな頂点のｊ番目の成分である。
【００７１】
式（５）において、頂点Ｖ０，Ｖ１，Ｖ２は、クリッピングされ、結果として新たな頂点を生じたオリジナルのプリミティブの頂点である。新たな頂点についての属性成分値は、頂点Ｖ０，Ｖ１，Ｖ２についての属性成分値（頂点キャッシュ１８０により提供されてもよい）および新たな頂点について計算された（係数バッファ７４０に格納された）補間係数αおよびβに基づいて決定される。式（５）における計算は、各属性成分について実行されてもよい。新たな頂点についての属性成分値は、属性グラディエントセットアップおよび属性補間に渡されてもよい。
【００７２】
ユニット２５０は、まずすべての新頂点のすべての成分について属性成分値を計算し、次に、属性グラディエントセットアップおよび属性補間を実行してもよい。あるいはユニット２５０が、一度に１つまたは少数の成分を処理してもよい。ユニット２５０は、各成分のサブセットごとに、当該成分のサブセットの新たな頂点属性計算を実行してもよい。これには属性グラディエントセットアップおよび属性補間が続く。
【００７３】
図２に示される構造は、他の３次元グラフィック機能に用いられる処理ユニットを用いて、３次元クリッピングを効率的に実行する。クリッピング平面に対するプリミティブのクリッピングは、ユニット２２０におけるビューポート変換に用いられるＡＬＵの借用により実行されてもよい。新頂点属性計算は、ユニット２５０における属性グラディエントセットアップおよび属性補間に用いられるＡＬＵの借用により実行されてもよい。適切なガードバンドサイズが用いられるとき、プリミティブをクリッピングしなければならない可能性は低い（例えば数パーセント）かもしれない。この場合、３次元クリッピングを実行するためにＡＬＵを再使用することが性能に与える影響を最小化できる。
【００７４】
３次元クリッピングをハードウェアでサポートするには、ちょっとした付加的なハードウェアで十分かもしれない。なんらかの小規模のＧＢ＿Ｓｃａｌｅｓとの乗算器、およびなんらかのコンパレータが、クリップコードを生成し、クリッピング決定を行うために用いられてもよい。少数の小規模バッファ７１０，７２０，７３０，７４０が、平面に対するクリッピングの当座の結果を格納し、新たな頂点についての属性補間係数を格納するために用いられてもよい。
【００７５】
図８は、図２におけるＧＰＵ２００の内の３次元クリッピング、三角形セットアップおよび深さグラディエントセットアップユニット２２０の構造のブロック図を示す。クリップコードジェネレータ８１０は、クリッピング空間における頂点の座標（あるいは頂点クリッピング座標）、およびＧＢ＿Ｓｃａｌｅ＿Ｘ，ＧＢ＿Ｓｃａｌｅ＿Ｙ，ＧＢ＿Ｓｃａｌｅ＿Ｚのようなガードバンドパラメータを受信する。ユニット８１０は、例えば擬似コードの１００〜１８０行を用いて上述したように、各頂点についてクリップコードを生成する。ユニット８２０は、頂点についてのクリップコードと、各プリミティブの頂点を示すプリミティブ情報を受信する。ユニット８２０は、例えば、擬似コードの２００〜２４０行を用いて上述したように、プリミティブのすべての頂点のクリップコードに基づいて、各プリミティブについてクリッピング決定を行う。クリッピング実行ユニット８３０は、ユニット８２０により提供されるクリッピング決定に基づいて、各プリミティブをパスするか、破棄するか、クリッピングし、頂点バッファ７１０に頂点座標を提供する。クリッピングされる各プリミティブごとに、ユニット８３０は、例えば擬似コードの３００〜５９０行を用いて上述したように、ガードバンドパラメータおよび頂点座標に基づいてプリミティブをクリッピングする。
【００７６】
ユニット８４０は、ユニット８３０によって提供され、頂点バッファ７１０に格納されたプリミティブについて、ビューポート変換、三角形セットアップ、場合により他のグラフィック機能（例えばシザリングおよび裏面カリング）を実行する。ユニット８５０は、プリミティブについて深さグラディエント係数を計算する。１つまたは複数のＡＬＵ８６０は、三角形セットアップユニット８４０および深さグラディエントセットアップユニット８５０によって用いられる。ＡＬＵ８６０は、クリッピング実行ユニット８３０によって借用され、クリッピング行なうために用いられてもよい。
【００７７】
図９は、図２におけるＧＰＵ２００内の新頂点属性計算、属性グラディエントセットアップおよび属性補間ユニット２５０の構造のブロック図を示す。新頂点属性計算ユニット９１０は、プリミティブ情報、プリミティブの頂点について属性成分値、新たな頂点についての係数（α，β）を受け取る。ユニット９１０は、例えば式（５）に示したように、新たな頂点のそれぞれについて属性成分値を計算する。ユニット９２０は、頂点についての属性成分値に基づいて、属性グラディエントを計算する。ユニット９３０は、当該ピクセルのスクリーン座標および属性グラディエントに基づいて、各プリミティブ内の各ピクセルについて属性成分値を計算する。１つまたは複数のＡＬＵ９４０は、属性グラディエントセットアップユニット９２０および属性補間ユニット９３０によって用いられる。ＡＬＵ９４０は、新頂点属性計算ユニット９１０によって借用され、新たな頂点についての属性成分値を計算するために用いられてもよい。
【００７８】
図８に示される構造では、３次元クリッピングは、ユニット２２０内の三角形セットアップユニット８４０によるビューポート変換に先立って実行される。その後、シザリングおよび裏面カリングはビューポート変換の後にスクリーン空間におけるプリミティブについて、ユニット８４０によって実行されてもよい。別の構造では、３次元クリッピングは延期され、ビューポート変換の後に実行される。いくつかのプリミティブが裏面カリングによって破棄されてもよく、これにより３次元クリッピングのために処理するプリミティブの数を減らすことができる。裏面カリングが完了するまで、プリミティブはバッファ（例えば頂点キャッシュ１８０）に格納されてもよい。また、裏面カリングによって破棄されないプリミティブは、バッファから取り出され３次元クリッピングを受けてもよい。あるいは、裏面カリングをパスするプリミティブは、スクリーン空間からクリッピング空間まで戻されるよう変換され、３次元クリッピングを受けてもよい。
【００７９】
ここで説明された３次元クリッピング技術は、無線通信装置、ハンドヘルド装置、ゲーミング装置、コンピューティング装置、家電装置などに用いられてもよい。無線通信装置技術向けの例示的使用について以下で説明する。
【００８０】
図１０は、無線通信システムにおける無線通信装置１０００の構造のブロック図を示す。無線装置１０００は、コンピュータ、携帯電話、端末、ハンドセット、携帯情報端末（ＰＤＡ）または他の何らかの装置であってもよい。無線通信システムは、符号分割多元接続（ＣＤＭＡ）システム、グローバル移動体通信システム（ＧＳＭ）システムまたは他の何らかのシステムであってもよい。
【００８１】
無線装置１０００は、受信パスおよび送信パスを介した双方向通信を提供することが可能である。受信パスにおいては、基地局によって送信された信号が、アンテナ１０１２によって受け取られ、受信機（ＲＣＶＲ）１０１４に提供される。受信機１０１４は、受信信号を整えてディジタル化し、さらなる処理のためにデジタル部１０２０に対しサンプルを供給する。送信パスについて、送信機（ＴＭＴＲ）１０１６は、デジタル部１０２０から送信されるデータを受け取り、該データを処理して整え、変調された信号を生成する。それは、アンテナ１０１２を通じて基地局に送信される。
【００８２】
デジタル部６２０は、例えばモデムプロセッサ１０２２、ビデオプロセッサ１０２４、コントローラ／プロセッサ１０２６、ディスプレイプロセッサ１０２８、アドバンスＲＳＩＣマシン／デジタル信号プロセッサ（ＡＲＭ／ＤＳＰ）１０３２、ＧＰＵ１０３４、内部メモリ１０３６、外部バスインタフェース（ＥＢＩ）１０３８のような各種処理ユニット、インタフェースユニット、メモリユニットを含む。モデムプロセッサ１０２２は、データ送受信のための処理（例えば符号化、変調、復調および復号）を実行する。ビデオプロセッサ１０２４は、カムコーダー、ビデオプレイバック、ビデオコンファレンシングのようなビデオアプリケーションに関して、ビデオコンテンツ（例えば静止画像、動画像、動画テキスト）の処理を実行する。コントローラ／プロセッサ１０２６は、デジタル部１０２０内の各種処理およびインタフェースユニットの演算を指令してもよい。ディスプレイプロセッサ１０２８は、ディスプレイ装置１０３０上でのビデオ、グラフィックスおよびテキストの表示を容易化するための処理を実行する。ＡＲＭ／ＤＳＰ１０３２は、無線装置１０００向けに種々のタイプの処理を実行してもよい。ＧＰＵ１０３４は、グラフィック処理を行い、図２におけるＧＰＵ２００、図７におけるバッファ７１０乃至７４０、図８におけるユニット２２０、図９などにおけるユニット２５０などを実装してもよい。内部メモリ１０３６は、デジタル部１０２０内の種々のユニットに対するデータおよび／または命令を格納する。ＥＢＩ１０３８は、デジタル部１０２０（例えば内部メモリ１０３６）と主メモリ１０４０の間のデータ転送を容易化する。
【００８３】
デジタル部１０２０は、１つまたは複数のＤＳＰ、マイクロプロセッサ、ＲＩＳＣなどで実装されてもよい。またデジタル部１０２０は、１つまたは複数の特定用途向け集積回路（ＡＳＩＣ）および／または他の何らかのタイプの集積回路（ＩＣ）上に組み立てられても良い。
【００８４】
ここで説明された３次元クリッピング技術は、種々の手段によって実装されてもよい。例えば、これらの技術はハードウェア、ファームウェア、ソフトウェアまたはそれらの組み合わせで実装されてもよい。ハードウェア実装について、３次元クリッピングを実行するために用いられるユニット（例えば、図７におけるバッファ７１０乃至７４０、図８におけるユニット２２０、図９におけるユニット２５０など）は、１つまたは複数のＡＳＩＣ、ＤＳＰ、ディジタル信号処理装置（ＤＳＰＤ）、プログラマブルロジックデバイス（ＰＬＤ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、プロセッサ、コントローラ、マイクロコントローラ、マイクロプロセッサ、電子機器、ここに説明された機能を実行するように設計された他の電子ユニット、またはそれらの組み合わせの範囲内で実装されてもよい。
【００８５】
ここで説明されたＧＰＵおよび他のユニットは、スタンドアロンのユニットであってもよいし、あるデバイスの一部であってもよい。該デバイスは、（ｉ）  グラフィックスＩＣのようなスタンドアロンのＩＣ、（ｉｉ）  データおよび／または命令を格納するためのメモリＩＣを含み得る１つまたは複数のＩＣのセット、（ｉｉｉ）  統合図形処理機能を備えた移動局モデム（ＭＳＭ）のようなＡＳＩＣ（ｉｖ）  他の装置内に組み込まれ得るモジュール、（ｖ）  携帯電話、無線装置、ハンドセットまたは移動ユニット、（ｖｉ）その他であってもよい。
【００８６】
本開示のこれまでの詳細な説明は、あらゆる当業者に対し、本開示をもたらし、本開示を用いて実施可能にするために提供される。本開示への種々の変更は、当業者であれば即座に明白になる。また、ここで定義された一般的な原理は、本開示の精神または範囲から逸脱することなく、他の変形に適用されてもよい。したがって、本開示は、本明細書で説明された例に限定されることは意図されておらず、ここで開示された原理および新規な特徴に相応しい最も広い範囲を与えられることが意図されている。
【図１】
2010507875.tif 000011
【図２】
2010507875.tif 000012
【図３】
2010507875.tif 000013
【図４】
2010507875.tif 000014
【図５】
2010507875.tif 000015
【図６】
2010507875.tif 000016
【図７】
2010507875.tif 000017
【図８】
2010507875.tif 000018
【図９】
2010507875.tif 000019
【図１０】
2010507875.tif 000020
【国際調査報告】
2010507875.tif 000021
2010507875.tif 000022
2010507875.tif 000023