(57)【要約】【課題】プリミティブの処理を高速，かつメモリ消費量を抑制した形で行うことができる画像処理装置を提供することを目的とする。【解決手段】  インデックスバッファ２２０には，プリミティブ列の頂点データの配列が記録され，その先頭にはプリミティブのサイズ長データＳが記録される。このプリミティブ列がジオメトリシェーダ１４０において処理された結果は，キャッシュバッファ１３０に記録され，既にジオメトリシェーダ１４０において処理されたプリミティブを再度処理する場合は，このキャッシュバッファ１３０に記録された出力結果であるプリミティブ出力ＧＳ１が再利用される。【選択図】図１
2012074092.tif 000002
【特許請求の範囲】
【請求項１】
頂点データへの参照値がメモリエレメントに配列として記憶されるインデックスバッファと，前記頂点データから構成されるプリミティブ列の演算処理を少なくとも２ステージ以上の処理で行うジオメトリシェーダとを備え，前記ジオメトリシェーダのステージでは，当該ステージ以前のステージにおける出力結果を再利用することができる画像処理装置であって，
前記インデックスバッファに記録される前記プリミティブ列と同様の前記頂点データから構成されたプリミティブ列が，当該インデックスバッファに既に存在するか否かを判定するプリミティブ判定手段と，
前記プリミティブ判定手段により，前記プリミティブ列が存在しないと判定された場合には，前記インデックスバッファに前記プリミティブ列を構成する頂点データへの参照値を記憶するとともに，当該プリミティブ列の先頭データの直前に，当該プリミティブ列のサイズをＳ値として記憶するプリミティブ記憶手段と，
前記プリミティブ判定手段により，前記プリミティブ列が既に存在すると判定された場合には，当該プリミティブ列が現在位置よりいくつ前のプリミティブ列であるかを示す参照情報を，負の整数にて記憶する参照情報設定手段と，
前記インデックスバッファをフェッチングし，フェッチされた値に，前記Ｓ値又は前記参照情報のどちらが含まれるかを判断するインデックス値判定手段と，
前記インデックス値判定手段により，前記Ｓ値が含まれると判定された場合には，当該Ｓ値の一つ後方の記録要素からＳ個分の前記頂点データを取得して，当該頂点データから構成されるプリミティブ列に対して，演算処理を行うジオメトリシェーダと，
前記ジオメトリシェーダにおける出力情報をキャッシュバッファに追加して記憶するキャッシュ手段と，
前記インデックス値判定手段により，前記参照情報が含まれると判断された場合には，当該参照情報に含まれる参照先のプリミティブ列に対する前記ジオメトリシェーダの前記出力情報を，前記キャッシュバッファからフェッチして利用する再利用手段と，
を備えるプリミティブ列の演算処理を行う画像処理装置。
【請求項２】
頂点データへの参照値がメモリエレメントに配列として記憶されるインデックスバッファと，前記頂点データから構成されるプリミティブ列の演算処理を少なくとも２ステージ以上の処理で行うジオメトリシェーダとを備え，前記ジオメトリシェーダのステージでは，当該ステージ以前のステージにおける出力結果を再利用することができる画像処理装置であって，
前記インデックスバッファに記録される前記プリミティブ列と同様の前記頂点データから構成されたプリミティブ列が，当該インデックスバッファに既に存在するか否かを判定するプリミティブ判定手段と，
前記プリミティブ判定手段により，前記プリミティブ列が存在しないと判定された場合には，前記インデックスバッファに前記プリミティブ列を構成する頂点データを記憶し，当該プリミティブ列の先頭データの直前に，当該プリミティブ列を識別可能なプリミティブＩＤを含む定義コマンドを記録するプリミティブ記憶手段と，
前記プリミティブ判定手段により，前記プリミティブ列が存在すると判定された場合には，前記定義コマンドへの参照コマンドを記録するとともに，前記インデックスバッファに記録された前記定義コマンドに含まれる前記プリミティブＩＤにより定義されるプリミティブ列の情報を取り除くプリミティブ参照情報設定手段と，
前記インデックスバッファをフェッチングし，フェッチされた値に，前記定義コマンド又は前記参照コマンドのどちらが含まれるかを判断するインデックス値判定手段と，
前記インデックス値判定手段により，前記定義コマンドが含まれると判断された場合に，前記プリミティブ記憶手段により定義された前記プリミティブ列の頂点データを取得し，当該プリミティブ列に対して演算処理を行うジオメトリシェーダと，
キャッシュバッファに前記定義コマンドと同様の識別子が存在する場合にはこれを取り除き，前記ジオメトリシェーダにおける出力情報を，当該キャッシュバッファに，前記定義コマンドと関連付けて記憶するキャッシュ手段と，
前記インデックス値判定手段により，前記参照コマンドが含まれると判断された場合には，当該参照コマンドによって前記定義コマンドを参照し，当該定義コマンドと関連付けられた前記プリミティブ列に対する前記ジオメトリシェーダの処理の出力情報を，前記キャッシュバッファからフェッチして利用する再利用手段と，
を備えるプリミティブ列の演算処理を行う画像処理装置。
【請求項３】
請求項２に記載のプリミティブ列の演算処理を行う画像処理装置において，
前記プリミティブ列は可変サイズのプリミティブであり，
前記プリミティブ記憶手段は，前記定義コマンドとともに，当該定義コマンドによって宣言されたプリミティブ列の頂点数を同じメモリエレメントに記憶する
プリミティブ列の演算処理を行う画像処理装置。
【請求項４】
請求項１〜３のいずれか一項に記載のプリミティブ列の演算処理を行う画像処理装置において，
前記ジオメトリシェーダの出力情報を再びジオメトリシェーダへの入力情報として送信し，前記出力情報に含まれる前記プリミティブ列の処理結果を利用した処理を行う
プリミティブ列の演算処理を行う画像処理装置。
【請求項５】
請求項４に記載のプリミティブ列の演算処理を行う画像処理装置において，
前記ジオメトリシェーダからの出力情報を再度前記ジオメトリシェーダへの入力情報として渡すまでの間に，複数のプリミティブ列を統合または分割し，新たなプリミティブ列として前記キャッシュバッファに記録するプリミティブ再設定手段
を備えるプリミティブ列の演算処理を行う画像処理装置。
【請求項６】
請求項１〜５のいずれか一項に記載のプリミティブ列の演算処理を行う画像処理装置において，
前記キャッシュバッファに対して前記ジオメトリシェーダの出力情報を記録させる場合は，当該キャッシュバッファに対し，ＦＩＦＯにて，前記出力情報が記憶される
プリミティブ列の演算処理を行う画像処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は可変サイズ，又は固定サイズのプリミティブの演算処理を行う画像処理装置に関する。
【背景技術】
【０００２】
従来から，３Ｄコンピュータ図形は，複雑な幾何学的な形に近似するように，ポイント，線，および三角形のような簡単な幾何学的なプリミティブを使用して表現されている。既存のコンピュータグラフィックスハードウェアは，このような簡単なプリミティブ，特に三角形のメッシュの処理を高速化できるように最適化されている。このため，既存のコンピュータグラフィックスハードウェアは，様々な三角形，線，およびポイントを用いることで複雑な形に近似させることができる。【０００３】
通常，３Ｄコンピュータ図形を処理するためのＧＰＵ（グラフィック・プロセシング・ユニット）には，頂点データを記録した頂点バッファに加えて，各頂点データへの参照値をプリミティブ毎に記録したインデックスバッファが設けられている。このインデックスバッファを設けることにより，処理の高速化を図ることができる。このインデックバッファに記録された頂点データ若しくはプリミティブは，バーテックスシェーダ，ジオメトリシェーダ，又はピクセルシェーダといった各シェーダパイプラインに入力情報として渡されて，画像処理が行われる。このような一般的なＧＰＵの構成は，例えば特許文献１などに例示されている。【０００４】
このような構成を有するＧＰＵにおいて，様々なデータ長のプリミティブ（すなわち，三角形以外のプリミティブ）をまとめて取り扱う場合は，そのデータの取り扱いに一層の注意が必要となる。その理由は，インデックスバッファに記録する際のプリミティブのサイズが異なるため，各プリミティブを構成する値が，記録領域のどの部分に相当するかを把握する必要があるからである。そのため，例えばプリミティブ毎のサイズ長をデータ列の先頭に配置し，この先頭の値を確認することで，プリミティブの単位を判別するといった手法が採用されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−１５２７０２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら，様々なデータ長のプリミティブを処理するパイプラインにおいては，シェーダ，特にジオメトリシェーダにおいて，プリミティブ単位での処理が重複する頂点データを利用するアルゴリズムが発生する。また，ジオメトリシェーダでの処理を二回以上行う場合もあるが，このような場合であっても，一回目のジオメトリシェーダのステージでの出力結果を，二回目のステージで再利用するといった状況が発生しうる。例えば，一回目のジオメトリシェーダのステージにおいて出力されたプリミティブを個別に二回目のステージで処理するではなく，複数のプリミティブを一つにまとめて，一つのプリミティブとして，ジオメトリシェーダにおいて再び演算を行いたい場合などである。このような場合，既に処理を行ったプリミティブに対して，同様の処理を繰り返し行うことなり，処理の速度の観点や，メモリ容量の抑制という観点においても好ましくない。【０００７】
そこで，本発明は，プリミティブを処理するためのパイプラインを有する画像処理装置において，計算コストの抑制と処理の高速化を達成することを目的とする。
【課題を解決するための手段】
【０００８】
このような課題を解決するために，本発明においては，次のような手段を採用することができる。第一の手段としては，この画像処理装置は，頂点データへの参照値がメモリエレメントに配列として記憶されるインデックスバッファと，頂点データから構成されるプリミティブ列の演算処理を行う少なくとも２ステージ以上の処理が行われるジオメトリシェーダとを備え，前記ジオメトリシェーダのステージではその以前のステージにおける出力結果を再利用する構成が採られている。そして，インデックスバッファにおいて記録される前記プリミティブ列と同様の前記頂点データから構成されたプリミティブ列が既に存在するか否かを判定するプリミティブ判定手段とを備えている。
ここで，プリミティブ判定手段により，前記プリミティブ列が存在しないと判定された場合には，前記インデックスバッファに前記プリミティブ列を構成する頂点データへの参照値を記憶するとともに，記録した前記プリミティブ列の先頭データの直前に同プリミティブ列のサイズをＳ値として記憶するプリミティブ記憶手段による処理が実行される。
一方，前記プリミティブ判定手段により，前記プリミティブ列が存在すると判定された場合には，前記インデックスバッファに既に記憶されたプリミティブ列が現在位置よりいくつ前のプリミティブ列であるかを示す参照情報を負の整数にて記憶する参照情報設定手段による処理が実行される。
この処理の後に，前記インデックスバッファをフェッチングし，フェッチされた値に前記Ｓ値，あるいは前記参照情報のいずれが含まれるかを判断するインデックス値判定手段が実行される。
この前記インデックス値判定手段により，前記Ｓ値が含まれると判定される場合には，同Ｓ値の一つ後方の記録要素からＳ個分の前記頂点データを取得して，同頂点データから構成されるプリミティブ列に対して演算処理を行うジオメトリシェーダと，前記ジオメトリシェーダにおける出力情報をキャッシュバッファに追加して記憶するキャッシュ手段とによる処理が実行される。
一方，前記インデックス値判定手段により，前記参照情報が含まれると判断される場合には，同参照情報に含まれる参照先のプリミティブ列の前記ジオメトリシェーダでの処理の前記出力情報を前記キャッシュバッファからフェッチして利用する再利用手段とが実行される。【０００９】
また，第２の解決手段として，次のような構成を採ることもできる。すなわち，前記プリミティブ判定手段により，前記プリミティブ列が存在しないと判定された場合には，前記インデックスバッファに前記プリミティブ列を構成する頂点データを記憶し，記録した前記プリミティブ列の先頭データの直前にプリミティブ列を識別可能なプリミティブＩＤを含む定義コマンドを記録するプリミティブ記憶手段とによる処理が実行される。
一方，前記プリミティブ判定手段により，前記プリミティブ列が存在することと判定された場合には，前記定義コマンドを参照する参照コマンドを記録するとともに，前記インデックスバッファに記録されている前記定義コマンドに含まれる前記プリミティブＩＤにより定義される前記プリミティブ列の情報を取り除くプリミティブ参照情報設定手段による処理が実行される。
そして，前記インデックスバッファをフェッチングし，フェッチされた値に定義コマンド，あるいは前記参照コマンドのいずれが含まれるかを判断するインデックス値判定手段により判定が行われ，このインデックス値判定手段により，前記定義コマンドが含まれると判断される場合には，前記プリミティブ記憶手段により定義された前記プリミティブ列の頂点データを取得し，当該プリミティブ列に対して演算処理を行うジオメトリシェーダと，キャッシュバッファより前記定義コマンドと同様の識別子が存在する場合にはこれを取り除き，前記ジオメトリシェーダにおける出力情報を当該キャッシュバッファに前記定義コマンドと関連付して記憶するキャッシュ手段とによる処理が実行される。
一方，前記インデックス値判定手段により，前記参照コマンドが含まれると判断される場合には，同参照コマンドによって参照される前記定義コマンドによって関連づけられた前記プリミティブ列の前記ジオメトリシェーダにおける処理の出力情報を前記キャッシュバッファからフェッチして利用する再利用手段とによる処理が実行される。
また，この第２の解決手段の場合において，前記プリミティブ列は可変サイズのプリミティブであり，前記プリミティブ記憶手段は，前記定義コマンドとともに，同定義コマンドによって宣言されたプリミティブ列の頂点数を同じメモリエレメントに記憶する構成の場合もある。
更には，前記ジオメトリシェーダの出力情報を再度ジオメトリシェーダへの入力情報として送信し，再び処理を実行しても良い。
また，前記ジオメトリシェーダからの出力情報を再度ジオメトリシェーダへの入力情報として渡すまでの間に，複数のプリミティブ列を統合，または分割して新たにプリミティブ列として前記キャッシュバッファに記録するプリミティブ再設定手段を備えても良い。
また，前記プリミティブキャッシュに対して前記ジオメトリシェーダの出力情報を記録させる場合は，当該キャッシュバッファに対してＦＩＦＯにて前記出力情報が記憶されるようにしてもよい。
【発明の効果】
【００１０】
本発明によれば，プリミティブを処理するためのパイプラインを有する画像処理装置において，計算コストの抑制と処理の高速化とを行うことができるようになる。
【図面の簡単な説明】
【００１１】
【図１】図１は，画像処理装置の概略構成を示すブロック図である。
【図２】図２は，インデックスバッファと頂点バッファの概略構成を示すブロック図である。
【図３】図３は，第１の実施例においてインデックスバッファに頂点情報を記録する手順を示すフロー図である。
【図４】図４は，第１の実施例においてジオメトリシェーダを通じた処理の流れを示したフロー図である。
【図５】図５（ａ）は，多角形からなるメッシュを示し，図５（ｂ）は，このメッシュを分割したプリミティブとその近隣のプリミティブとを示し，図５（ｃ）は，このプリミティブをインデックスバッファ上で示した概略図である。
【図６】図６は，キャッシュバッファの概略図を示す。
【図７】図７は，第２の実施例においてインデックスバッファに頂点情報を記録する手順を示すフロー図である。
【図８】図８は，第２の実施例においてジオメトリシェーダを通じた処理の流れを示したフロー図である。
【図９】図９は，第２の実施例のプリミティブをインデックスバッファ上で示した概略図である。
【図１０】図１０は，第２の実施例のプリミティブをキャッシュバッファ上で示した概略図である。
【発明を実施するための形態】
【実施例１】
【００１２】
以下，発明を実施するための形態について説明する。本発明は，以下に説明する実施態
様に限定されるものではない。本発明は，以下に説明する実施態様から当業者に自明な範
囲で適宜修正される範囲を含む。【００１３】
本発明における３Ｄ画像は，プリミティブを用いて表現されるものである。プリミティブはジオメトリの基本単位であり，３Ｄグラフィックスの場合，プリミティブはポリゴン（典型的には三角形），法線ベクトル，点などを含むことが通常である。プリミティブが三角形の場合，各三角形は３つの頂点によって画定され，各線は２つの頂点によって画定される。各頂点が有するデータは，様々な属性，例えば，空間座標，明度，又はテクスチャ座標と関連付けられている。【００１４】
本明細書において，「シェーダ」は，一般に，シェーディングを実行するＧＰＵのハードウェアサブユニットを参照するために使用されるものである。また，「シェーダ」は，シェーディングを実行するために使用されるメモリ（例えばレジスタ記憶装置）にロードされ，ＧＰＵにダウンロードされる命令セット，又はトークンを参照するために使用され得る。「シェーダプログラム」は，一般に，グラフィックスパイプラインに存在し実行するプログラム又はプロセスを参照することができ，画面上の最終的な画像の表面特性，又は３次元画面環境におけるオブジェクトの決定／定義を支援するために使用される。「シェーダ」は，それらの特定のタスクを実行するために，毎秒十億以上の計算を実行可能である。【００１５】
図１は，画像処理装置であるＧＰＵ１００に関して３次元グラフィックスパイプラインのブロック図を示す。頂点シェーダ１１０は，三角形や線のようなプリミティブを包含する形状データについて，頂点処理を実行する。例えば，頂点シェーダ１１０は，頂点に対する明るさなどを計算し，形状に関してブレンディングを実行することができる。また，頂点シェーダ１１０は，各頂点の座標と属性の成分値（例えばｘ，ｙ，ｚ，ｗ）を決定し，三角形セットアップ，及び深さ・グラディエントセットアップユニット１２０に頂点座標を提供し，キャッシュバッファ１３０に頂点属性成分値を提供するものであってもよい。キャッシュバッファ１３０は，頂点とプリミティブについて，属性成分値やその他のデータを格納する。【００１６】
ジオメトリシェーダ１４０は，頂点シェーダ１１０で処理された頂点データから構成されるプリミティブ全体または隣接したプリミティブの情報を持つプリミティブを，入力情報として受け取り，頂点データの増減や頂点データから新たなプリミティブを生成するといったプリミティブ単位での処理を行う部位である。また，このジオメトリシェーダ１４０は，２以上のステージに分割されて処理が行われる場合が存在する。例えば，複数のプリミティブを加工して，その出力結果を一つのプリミティブとしてまとめて取り扱い，ジオメトリシェーダにおいて再度の加工を行いたい場合などである。このような処理が行われる場合，ジオメトリシェーダ１４０の出力情報は，一度キャッシュバッファ１３０に記録され，このキャッシュバッファ１３０に記録された出力情報が，再び，ジオメトリシェーダ１４０の次のステージへの入力情報となる。本実施形態は，特にこのような場合において，有効な技術である。詳細については後述する。ラスタライザ１５０は，各プリミティブをピクセルに分解し，各ピクセルについて，スクリーン座標を生成する。【００１７】
初期深さ／ステンシルテストユニット１６０は，ピクセルがレンダリングされるか破棄されるべきかどうか決定するために，ピクセルに関してステンシルテストを行なってもよい。初期深さ／ステンシルテストユニット１６０は，ピクセルについてのステンシルバッファ（図１においては示されない）に格納されたステンシル値を基準値と比較し，その比較結果に基づいて，ピクセルをパスするか破棄するかを決定する。初期深さ／ステンシルテストユニット１６０は，適用可能な場合，ピクセルがレンダリングされるべきか破棄されるべきかどうかを決定するために，ピクセルごとに深さテスト（ｚテストとも称される）を行なってもよい。例えば，初期深さ／ステンシルテストユニット１６０は，ピクセルに対するｚ値（現在のｚ値）をｚバッファにおいて対応するｚ値（格納されたｚ値）と比較する。そして，現在のｚ値が，格納されたｚ値に対してより近いならば，ピクセルをパスし，ｚバッファやステンシルバッファを更新する。一方，初期深さ／ステンシルテストユニット１６０は，現在のｚ値が，格納されたｚ値よりさらに後方であるならば，ピクセルを破棄する。【００１８】
属性グラディエントセットアップおよび属性補間ユニット１７０は，プリミティブ内のピクセルについて属性成分値を得るために，プリミティブの頂点について属性成分値を補間する。属性グラディエントセットアップおよび属性補間ユニット１７０は，最初に，頂点の属性成分値に基づいて，属性補間のためのパラメータを計算してもよい。これらのパラメータは，属性補間のための一次方程式の属性グラディエントまたは係数であってもよい。その後，属性グラディエントセットアップおよび属性補間ユニット１７０は，そのピクセルのスクリーン座標および補間パラメータに基づいて，各プリミティブ内の各ピクセルについて属性成分値を計算することができる。【００１９】
ピクセル／フラグメントシェーダ１８０は，ピクセルとフラグメントについて種々のグラフィックス処理を実行してもよい。フラグメントは，ピクセルと，その関連情報である。例えば，ピクセル／フラグメントシェーダ１８０は，可能であるならば，ピクセルにテクスチャを適用するテクスチャマッピングを実行してもよい。テクスチャ化は，そのピクセルのテクスチャ座標によって示された位置におけるテクスチャ画像のカラーでピクセルのカラーを修正することにより実現される。ポストプロセッサ１９０は，各フラグメントについて，アルファテスト，フォグブレンディング，アルファブレンディング，論理演算，又はディザリング演算のような他のグラフィックス処理を実行してもよい。ポストプロセッサ１７０は，ディスプレイデバイス上での提示のためのカラーバッファ（両方とも図１には示されない）に出力ピクセルを提供する。【００２０】
また，本実施形態のＧＰＵ１００においては，ジオメトリシェーダ１４０による処理結果も，キャッシュバッファ１３０に記録される。これは前述したジオメトリシェーダ１４０が複数のステージを有しており，前段階のステージでの処理結果を再度利用するときなどに有効な手段である。このキャッシュバッファ１３０は，ＦＩＦＯ（ファーストイン・ファーストアウト）方式が採用されており，そのキャッシュ可能なシーケンスの数は，例えば４つに設定されている。なお，このシーケンス数は，適宜変更することも可能である。【００２１】
図２は，プリミティブ（例えば三角形または線の頂点データや配列情報）が，記録されるバッファの構造を示す。頂点バッファ２１０は，プリミティブについて，頂点座標および属性補間係数を格納する。頂点バッファロケーションは，それぞれ，１つの頂点について（ｘ，ｙ，ｚ，ｗ）座標，および属性補間係数（α，β）を格納することができる。各頂点バッファロケーションは，当該バッファロケーションが有効な頂点を格納しているかどうかを示す有効／無効フラグを持つ。【００２２】
インデックスバッファ２２０は，プリミティブ頂点についてのインデックスを格納する。これらインデックスは，頂点が格納される頂点バッファ２１０のロケーションを指す。インデックスバッファ２２０の各メモリエレメントは，１つの頂点バッファロケーションについてのポインタ（またはインデックス）を格納できる。【００２３】
このインデックスバッファ２２０には，プリミティブの先頭の前には，プリミティブのサイズ長，すなわちプリミティブ列を構成する頂点データの数が，記録されるロケーションが確保されている。インデックスバッファ２２０は，連続したストレージの領域を形成しているが，このサイズ長のデータを起点として，その値分のロケーションに存在するデータが，ある特定のプリミティブ列を構成する頂点データとして認識され，その次の領域には，隣接するプリミティブ列のサイズ長データＳが，位置するという構成となっている。また，本実施形態においては，インデックスバッファ２２０における領域を節約するための工夫として，既出のプリミティブ列についてはそのプリミティブ列を構成する頂点バッファロケーションへのポイント等を格納するのではなく，マイナスの値によって表される参照情報Ｎを，インデックスバッファ２２０に格納している。この参照情報Ｎは，インデックスバッファ２２０上のＮ個前のプリミティブと同じ頂点の配列を有するプリミティブが繰り返されているということを意味している。また，このようなサイズ長データＳは，可変サイズのプリミティブを扱う時には必要であるが，固定サイズの決まったプリミティブを扱う場合にはこれを省略した構成を採ることもできる。【００２４】
次に，このインデックスバッファ２２０へ頂点データ等をインプットするアルゴリズムについて図３を参照に解説する。
この頂点データの値をインプットする工程は，通常であれば頂点シェーダ１１０における処理の前段階で行われるが，本実施形態では可変サイズのプリミティブを取り扱うため，シェーダプログラムの過程において適宜実施されても良い。
まず始めに，あるプリミティブを対象にこのプリミティブが既，にインデックスバッファに記録されているかを判定するステップ３０１を実施する。
具体的な判定方法としては，プリミティブの頂点の配列を取得して，この配列と同じ値がインデックスバッファ２２０上に存在するか否かにより判定する方法を採ることができる。【００２５】
次いで，ステップ３０１における判定によって，プリミティブが存在しないと判定される場合（Ｎｏである場合）は，ステップ３０２に移行する。ステップ３０２では，インデックスバッファ２２０に，頂点バッファ２１０上の頂点データへの参照を配列として入力するとともに，その先頭の領域に，このプリミティブのサイズ，すなわちこのプリミティブを構成する配列数を，サイズ長データＳとして記録する。【００２６】
また，ステップ３０１における判定によって，プリミティブが存在すると判定された場合（Ｙｅｓである場合）は，ステップ３０３に移行する。ステップ３０３では，頂点データのメモリ上の位置情報を配列として記録する代わりに，既存のプリミティブへの参照情報Ｎをオフセット値（既存のプリミティブが現在の位置からいくつ前のプリミティブかを示すマイナス値）の形式で記録する。このオフセット値の設定の方法としては，前述したステップ３０１におけるプリミティブの検査時に，インデックスバッファ２２０の先頭から検索を開始して，ヒットした時点でカウンターの値を１にセットし，その後に，サイズ長データＳ又は参照情報Ｎのいずれかにヒットするごとにカウンターを１ずつ増加させ，最後尾に到達した際に，このカウンターの値にマイナスをつけて参照情報Ｎとしてセットするといった方法がとり得る。【００２７】
前述したように，ジオメトリシェーダ１４０の複数のステージに亘って処理を行うよう場合が存在しているが，本実施形態は，この場合に，処理を高速化するための工夫がされている。具体的には，図４に示されるアルゴリズムを用いて説明する。
図４は，ジオメトリシェーダ１４０の処理結果を，プリミティブ単位で，キャッシュバッファ１９０に記録していく処理の流れを示している。まず，ステップ４０１において，インデックスバッファ２２０のメモリエレメントに記録されたインデックス値を，順次フェッチしていき，フェッチされたインデックス値に，上述したサイズ長データＳ又は参照情報Ｎのいずれが含まれるかを判定する。【００２８】
ステップ４０１の判定で，サイズ長データＳが含まれるとされた場合には，ステップ４０２において，インデックスバッファ２２０よってＳ個分の頂点データへの位置情報を配列として取得し，この配列によって表されるプリミティブに対して，ジオメトリシェーダ１４０で演算処理が実行される。ここでは，このプリミティブに対して行われた一回目のジオメトリシェーダ１４０の処理結果を，プリミティブ出力ＧＳ１と示す。【００２９】
次にステップ４０３において，このジオメトリシェーダ１４０により行われたプリミティブ出力ＧＳ１を，キャッシュバッファ１３０に追加して記録させる。この値は，ステップ４０４において，ジオメトリシェーダ１４０の次のステージの入力値として送信される。【００３０】
一方，ステップ４０１における判定の結果，参照情報Ｎが含まれると判定される場合，このプリミティブは，既にジオメトリシェーダ１４０において処理がされていることから，キャッシュバッファ１３０上には，プリミティブ出力ＧＳ１が存在しているといえる。したがって，ステップ４０５において，このプリミティブ出力ＧＳ１を取得し，これを再利用する。そして，次のステップ４０６にて，プリミティブ出力ＧＳ１を，ジオメトリシェーダ１４０の次のステージへの入力値として送信する。
この処理を，各インデックスバッファ２２０上のプリミティブに対し，繰り返し行うことで，ジオメトリシェーダ１４０の次のステージでは，キャッシュバッファ１３０上にキャッシュ化された各プリミティブが，再利用される。したがって，プリミティブに対して，再度演算処理をする必要が無くなるため，処理の高速化や記憶領域の抑制を図ることができるようになる。また，ジオメトリシェーダ１４０によって行われる２回目以降のステージでの処理においても，このプリミティブ出力ＧＳ１を再利用することにより，処理の高速化を図ることができる。【００３１】
本発明の画像処理装置において，実際に画像を処理する場合と，どのような動作をするかについて，図５を用いて説明する。
図５（ａ）で示される多角形メッシュ５００は，２２の頂点から構成されるメッシュである。本実施形態では，この多角形メッシュ５００に対し,Catmull-Clark subdivision法を用いて，頂点９−１４−１５−１０からなる四角形５０１，及び頂点１０−１１−１６−１５からなる四角形５０２に対して処理を行う。この処理方法においては，ジオメトリシェーダ１４０に対しては，各頂点をその隣接する頂点を含めたプリミティブをジオメトリシェーダ１４０の入力として取り扱われる。すなわち，四角形５０１の処理にあっては，９，１４，１５，１０を中心とする４つのプリミティブを用いた処理が行われ，四角形５０２の処理にあっては，１０，１１，１６，１５を中心とする４つのプリミティブを用いた処理が行われる。【００３２】
図５（ｂ）は，多角形メッシュ５００を，上記の処理に則して，ジオメトリシェーダ１４０で処理が行われる単位であるプリミティブに分解したものであり，ＳＥＴ０〜ＳＥＴ４として示されている。また，図５（ｃ）は，このＳＥＴ０〜ＳＥＴ４のプリミティブが記録されたインデックスバッファ２２０の状態を示している。【００３３】
図５（ｂ）及び（ｃ）に示されるように，ＳＥＴ０は，９−３−２−１−８−１３−１４−１５−１０−５−４の１１の頂点からなるプリミティブである。このため，インデックスバッファ２２０には，このプリミティブのサイズを表すサイズ長データＳとして，「１１」が記録されている。このＳｅｔ０に隣接するインデックスバッファ２２０上には，Ｓｅｔ１が記録されている。Ｓｅｔ１は，１４−９−８−１３−１８−１９−２０−１５−１０からなるプリミティブであり，この先頭には，サイズ長データＳとして，「９」が記録されている。同様に，Ｓｅｔ２は，先頭に，Ｓ値として「９」が記憶され，１５−１０−９−１４−１９−２０−２１―１６−１１の順に記録されている。Ｓｅｔ３は，先頭に，サイズ長データＳとして「９」が記憶され，１０−５−４−９−１４−１５−１６−１１−６の順に記録されている。続いて，Ｓｅｔ３及びＳｅｔ２が繰り返し用いられるが，インデックスバッファ２２０においては，これらのプリミティブは既に存在していることから，再び頂点データへの参照値が記録される代わりに，前述したオフセット値の値で示される参照情報Ｎが記憶される。ここで，Ｓｅｔ３の位置は，一つ前であるため参照情報Ｎには−１が記憶され，続いてＳｅｔ２の参照情報Ｎには−３が記憶されている。さらに，Ｓｅｔ４として，頂点１６−１１−１０−１５−２０−２１−２２−１７−１２の順番のプリミティブがインデックスバッファ２２０に記録され，先頭に，サイズ長データＳの「９」が記録されている。最後に，Ｓｅｔ５として，１１−６−５−１０−１５−１６−１７−１２−７の順番のプリミティブがインデックスバッファ２２０に記憶され，先頭に，サイズ長データＳの「９」が記録されている。【００３４】
次に，この多角形メッシュ５００において，ジオメトリシェーダ１４０の処理結果をキャッシュバッファ１３０に記録する動作について，図６を用いて説明する。図６は，キャッシュバッファ１３０のうち，ジオメトリシェーダ１４０の出力であるプリミティブＧＳ１を記録する領域の構成を示したブロック図である【００３５】
図６に示されるように，キャッシュバッファ１３０は，４つのメモリエレメントを備えている。このキャッシュバッファ１３０には，ジオメトリシェーダ１４０での処理が行われるごとに，プリミティブごとの出力情報が記憶されている。この処理については，前述した図４におけるステップ４０３が相当する。【００３６】
まず，Ｓｅｔ０〜Ｓｅｔ３の処理がおこなわれる際には，キャッシュバッファ１３０の先頭から順に，それぞれのプリミティブ出力ＧＳ１が入力される。ここでは，各出力値をＳｅｔ０〜Ｓｅｔ３として示している。Ｓｅｔ３の出力結果が記憶された際，このキャッシュバッファ１３０のメモリエレメントは，全て埋まってしまう。続く，Ｓｅｔ３（参照情報Ｎの−１）の出力情報を記録する際には，最初に記録されたＳｅｔ０の情報を削除し，Ｓｅｔ１〜Ｓｅｔ３の情報を先頭側に一つずつずらして移動させ，空きとなった４つめのメモリエレメントに，新たにＳｅｔ３の出力結果を記憶させる。以降のＳｅｔ２への参照を行う際や，Ｓｅｔ４，Ｓｅｔ５の記録をする際にも，同様の手順で処理が行われる。
【実施例２】
【００３７】
次に，本発明の異なる実施例について説明する。実施例２においては，インデックスバッファ２２０における参照情報の記録の仕方が，実施例１とは異なっている。
図７は，実施例２におけるインデックスバッファ２２０にプリミティブを記録するアルゴリズムを示している。まず始めに，あるプリミティブを対象にこのプリミティブが既にインデックスバッファ２２０に記録されているかを判定するステップ７０１を実施する。
具体的な判定方法としては，プリミティブの頂点情報を取得して，この頂点から構成されるプリミティブの配列と同じ値が，インデックスバッファ２２０上に存在するか否かにより，判定することができる。【００３８】
ステップ７０１における判定により，プリミティブが存在しないと判定された場合（Ｎｏである場合），ステップ７０２において，インデックスバッファ２２０の最後尾にプリミティブを構成する頂点データの位置情報を配列として記録する。また，このプリミティブの先頭データの直前に，プリミティブの配列情報の定義を宣言して，定義コマンドＤが記録される。また，この定義コマンドＤは，このプリミティブのジオメトリシェーダ１４０での処理結果である出力情報であって，キャッシュバッファ１３０に記録されたプリミティブ出力ＧＳ１のキャッシュバッファ１３０のアドレスにも関連付けられている。また，この定義コマンドＤの宣言の際には，プリミティブ列を特定するためのプリミティブＩＤがその宣言の中で関連づけられる。
また，定義コマンドＤは，これと関連付けされたプリミティブのサイズ長データＳと共に同一のメモリエレメントに記録することもできる。この定義コマンドＤは，既にその識別情報が使用されているのであれば，これを消去しそこに新しい定義コマンドＤによって定義されるプリミティブの配列情報と，そのキャッシュバッファ１３０上に記憶された処理結果であるジオメトリシェーダＧＳ１を上書きする。本実施形態においては，この定義コマンドＤとして宣言可能な個数は，キャッシュバッファ１３０の記録領域の領域数に相当す。本実施例において，定義コマンドＤとして宣言可能な個数は４であり，Ｄ０〜Ｄ３を選択可能である。【００３９】
一方，ステップ７０１における判定により，プリミティブが存在することと判定された場合（Ｙｅｓである場合）には，定義コマンドＤへの参照コマンドＲを記録するとともに，インデックスバッファ２２０に記録されているプリミティブの情報を削除する。ここでプリミティブの情報を削除する理由は，この時すでにこのインデックスバッファ２２０上のプリミティブに対する処理は完了し，その結果がキャッシュバッファ１３０に記録されていることから，こプリミティブの情報を削除することで，記録領域の解放を行うためである。【００４０】
次に，図８を用いて本実施例における，ジオメトリシェーダ１４０における処理の流れを説明する。
最初に，ステップ８０１において，インデックスバッファ２２０からインデックス値をフェッチングしていき，フェッチされたインデックス値に定義コマンドＤ，あるいは参照コマンドＲのどちらが含まれるかを判定する。
ステップ８０１における判定において，定義コマンドＤが含まれている判定される場合には，ステップ８０２において，記録されているプリミティブのサイズ情報を取得し，プリミティブに対してジオメトリシェーダ１４０において演算処理を行う。また，プリミティブのサイズが固定の場合であれば，サイズを取得しなくともこの処理は実行可能である。
次いで，ステップ８０３において，キャッシュバッファ１３０より定義コマンドＤに含まれるプリミティブＩＤと同じ識別子で事前に定義されたプリミティブの出力情報が存在する場合にはこれを取り除き，ジオメトリシェーダ１４０における出力情報をキャッシュバッファ１３０に同定義コマンドＤと関連付して記憶する。すなわち，既にこの定義コマンドＤと同じ識別情報が存在する場合には上書きが行われ，存在しない場合には新たに定義コマンドＤが設定されている。
そして，ステップ８０４において，このジオメトリシェーダ１４０におけるプリミティブ出力ＧＳ１を次のジオメトリシェーダ１４０のステージに対しての入力値として送信する。【００４１】
一方，ステップ８０１における判定において，参照コマンドＲが含まれていると判定される場合には，ステップ８０５においてキャッシュバッファ１３０から同参照コマンドＲによって参照される定義コマンドＤに含まれるプリミティブＩＤによって既に定義済みのプリミティブのジオメトリシェーダ１４０での処理の出力をフェッチして利用する。
そして，ステップ８０６において，このフェッチされたプリミティブ出力ＧＳ１をジオメトリシェーダ１４０の次のステージへの入力値として送信する。【００４２】
次に，この実施例において実施例１で例示した多角形メッシュ５００がどのようにインデックスバッファ２２０上に記憶されているかについて，図９を用いて説明する。
図９に示されるようにＳＥＴ０は，９−３−２−１−８−１３−１４−１５−１０−５−４の１１の頂点からなるプリミティブであり，インデックスバッファ２２０には，このプリミティブのサイズを表すデータサイズ長Ｓとして，「１１」と，定義コマンドＤ０が記録されている。このＳｅｔ０に隣接するインデックスバッファ２２０上には，Ｓｅｔ１が記録されている。Ｓｅｔ１は，１４−９−８−１３−１８−１９−２０−１５−１０からなるプリミティブであり，この先頭にはサイズ長データＳとして。「９」と，プリミティブ定義コマンドＤ１が記録されている。同様に，Ｓｅｔ２は先頭にデータサイズ長サイズ長データＳとして。「９」と，定義コマンドＤ２が記憶され，１５−１０−９−１４−１９−２０−２１―１６−１１の順に記録されている。Ｓｅｔ３は，先頭にサイズ長データＳとして，「９」と，定義コマンドＤ３が記憶され，１０−５−４−９−１４−１５−１６−１１−６の順に記録されている。続いてＳｅｔ３，Ｓｅｔ２が繰り返し用いられるが，インデックスバッファ２２０においては，これらのプリミティブは既に存在していることから，再び頂点データへの参照値が記録される代わりに，プリミティブへの参照コマンドＲが記憶される。したがって，参照コマンドＲ３，Ｒ２が。順次記録される。続いて，Ｓｅｔ４として頂点１６−１１−１０−１５−２０−２１−２２−１７−１２の順番のプリミティブが，インデックスバッファ２２０に記録され，先頭にデータサイズ長Ｓとして，「９」と，定義コマンドＤ０が記録されている。この時，既にＤ０〜Ｄ３の全てのコマンドが定義されてしまっていることから，最初に宣言されたＤ０のコマンドに新たな定義が上書きされている。最後に，Ｓｅｔ５として１１−６−５−１０−１５−１６−１７−１２−７の順番のプリミティブがインデックスバッファ２２０に記憶され，先頭にサイズ長データＳとして。「９」と，定義コマンドＤ１が記録されている。【００４３】
次に，この多角形メッシュ５００によってジオメタリシェーダ１４０における処理結果をキャッシュバッファ１３０に記録していく動作について，図１０を用いて説明する。図１０は，キャッシュバッファ１３０の構成を示したブロック図である【００４４】
まず，Ｓｅｔ０〜Ｓｅｔ３に対する処理がおこなわれる際には，キャッシュバッファ１３０の先頭から順に，それぞれの出力結果であるプリミティブ出力ＧＳ１が，入力される。Ｓｅｔ３の出力結果が記憶された際，このキャッシュバッファ１３０の記憶領域，は全て埋まってしまう。続く，参照コマンドＲ３，Ｒ２が宣言される際には，キャッシュバッファ１３０には変更が加えられず，既に記録されているＳｅｔ３，Ｓｅｔ２のプリミティブ出力ＧＳ１が再利用される。続いて，Ｓｅｔ４が記録される際には，既にＤ０〜Ｄ３が使用されていることから，このうち最初に記憶されたＤ０に対してコマンド定義がされる。したがって，Ｓｅｔ０が記憶されていた場所に，Ｓｅｔ４のプリミティブ出力ＧＳ１が記録される。次のＳｅｔ５の記憶においても，同様にＤ１に対してコマンド定義がなされ，Ｓｅｔ１が記録されていた場所に，Ｓｅｔ５のプリミティブ出力ＧＳ１が記録される。【００４５】
以上のことから，この第２の実施形態の画像処理装置においても，キャッシュバッファ１３０上に記録されたプリミティブのジオメトリシェーダ１４０での処理結果が，プリミティブ出力ＧＳ１として記録され，しかも，この処理結果を定義コマンドＤ及び参照コマンドＲとして再利用可能である。このため，第２の実施形態の画像処理装置は，プリミティブの処理結果を効率よく再利用でき，処理の高速化を図ることができる。
【符号の説明】
【００４６】
１００  ＧＰＵ
１１０  頂点シェーダ
１２０  グラディエントセットアップユニット
１３０  キャッシュバッファ
１４０  ジオメトリシェーダ
１５０  ラスタライザ
１６０  初期深さ／ステンシルテストユニット
１７０  属性グラディエントセットアップ
属性補間ユニット 
１８０  ピクセル／フラグメントシェーダ
１９０  ポストプロセッサ 
２１０  頂点バッファ
２２０  インデックスバッファ
５００  多角形メッシュ
５０１  四角形
５０２  四角形
【図１】
2012074092.tif 000003
【図２】
2012074092.tif 000004
【図３】
2012074092.tif 000005
【図４】
2012074092.tif 000006
【図５】
2012074092.tif 000007
【図６】
2012074092.tif 000008
【図７】
2012074092.tif 000009
【図８】
2012074092.tif 000010
【図９】
2012074092.tif 000011
【図１０】
2012074092.tif 000012
【国際調査報告】
2012074092.tif 000013
2012074092.tif 000014
2012074092.tif 000015