オブジェクトを描画するためのモデルデータを有する中間的な描画コマンドである中間コマンドを生成する中間コマンド生成部と、生成された中間コマンドをグラフィックスプロセッサに実行させるためのグラフィックスコマンド列に変換するグラフィックスコマンド変換部とを含み、前記グラフィックスコマンド変換部は、前記中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であるかどうかを判定する同一性判定部と、前記同一性判定部により、ステートが同一でないと判定されたグラフィックスコマンドを生成し、ステートが同一であると判定されたグラフィックスコマンドは冗長なコマンドであるとして生成しないグラフィックスコマンド生成部とを含むことを特徴とするグラフィックスコマンド生成装置。前記グラフィックスコマンド変換部は、前記グラフィックスコマンド生成部により生成されたグラフィックスコマンドのステートをキャッシュするステートキャッシュをさらに含み、前記同一性判定部は、前記中間コマンドから生成されるべきグラフィックスコマンドのステートについて前記ステートキャッシュを参照し、キャッシュヒットした場合は、前記中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であると判定し、キャッシュヒットしない場合は、前記中間コマンドから生成されるべきグラフィックスコマンドのステートによってキャッシュを更新することを特徴とする請求項1に記載のグラフィックスコマンド生成装置。オブジェクトを描画するためのモデルデータを変更することによってグラフィックス演算に係るハードウェアが受ける負荷を表す遷移コストを計算する遷移コスト計算部と、前記遷移コストにもとづいてモデルデータを遷移させる順序を決定し、その遷移順序にしたがって各モデルデータにソートキーを付与するソートキー付与部と、前記中間コマンド生成部により生成された複数の中間コマンドの実行順序を各中間コマンドのモデルデータに付与されたソートキーにもとづいて入れ替えるソーティング部とをさらに含み、前記グラフィックスコマンド変換部は、前記ソーティング部により実行順序が入れ替えられた複数の中間コマンドのそれぞれをグラフィックスコマンド列に変換することを特徴とする請求項1または2に記載のグラフィックスコマンド生成装置。前記ソートキー付与部は、ある一つのモデルデータから開始して、前記遷移コストの小さい順にモデルデータを巡回することにより、モデルデータを遷移させる順序を決定することを特徴とする請求項3に記載のグラフィックスコマンド生成装置。前記ソーティング部は、表示される画面領域を最も占有するモデルデータを先頭にして、前記遷移コストの小さい順にモデルデータを巡回することにより、モデルデータを遷移させる順序を決定することを特徴とする請求項3に記載のグラフィックスコマンド生成装置。オブジェクトを描画するためのモデルデータを有する中間的な描画コマンドである中間コマンドを生成する中間コマンド生成ステップと、生成された中間コマンドをグラフィックスプロセッサに実行させるためのグラフィックスコマンド列に変換するグラフィックスコマンド変換ステップとを含み、前記グラフィックスコマンド変換ステップは、前記中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であるかどうかを判定する同一性判定ステップと、前記同一性判定ステップにより、ステートが同一でないと判定されたグラフィックスコマンドを生成し、ステートが同一であると判定されたグラフィックスコマンドは冗長なコマンドであるとして生成しないグラフィックスコマンド生成ステップとを含むことを特徴とするグラフィックスコマンド生成方法。オブジェクトを描画するためのモデルデータを有する中間的な描画コマンドである中間コマンドを生成する中間コマンド生成機能と、生成された中間コマンドをグラフィックスプロセッサに実行させるためのグラフィックスコマンド列に変換するグラフィックスコマンド変換機能とをコンピュータに実現させ、前記グラフィックスコマンド変換機能は、前記中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であるかどうかを判定する同一性判定機能と、前記同一性判定機能により、ステートが同一でないと判定されたグラフィックスコマンドを生成し、ステートが同一であると判定されたグラフィックスコマンドは冗長なコマンドであるとして生成しないグラフィックスコマンド生成機能とを含むことを特徴とするグラフィックスコマンド生成プログラム。しかしながら、複数の中間コマンドをグラフィックスコマンドに変換すると、生成されたグラフィックスコマンドのシーケンスでは、ステートが変更されていないにもかかわらず同じグラフィックスコマンドが繰り返し実行されることがあり、その冗長性のゆえに、実行効率が低下する。本発明はこうした課題に鑑みてなされたものであり、その目的は、中間コマンドから生成されるグラフィックスコマンドの実行効率を向上させることのできる技術を提供することにある。上記課題を解決するために、本発明のある態様のグラフィックスコマンド生成装置は、オブジェクトを描画するためのモデルデータを有する中間的な描画コマンドである中間コマンドを生成する中間コマンド生成部と、生成された中間コマンドをグラフィックスプロセッサに実行させるためのグラフィックスコマンド列に変換するグラフィックスコマンド変換部とを含む。前記グラフィックスコマンド変換部は、前記中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であるかどうかを判定する同一性判定部と、前記同一性判定部により、ステートが同一でないと判定されたグラフィックスコマンドを生成し、ステートが同一であると判定されたグラフィックスコマンドは冗長なコマンドであるとして生成しないグラフィックスコマンド生成部とを含む。本発明の別の態様は、グラフィックスコマンド生成方法である。この方法は、オブジェクトを描画するためのモデルデータを有する中間的な描画コマンドである中間コマンドを生成する中間コマンド生成ステップと、生成された中間コマンドをグラフィックスプロセッサに実行させるためのグラフィックスコマンド列に変換するグラフィックスコマンド変換ステップとを含む。前記グラフィックスコマンド変換ステップは、前記中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であるかどうかを判定する同一性判定ステップと、前記同一性判定ステップにより、ステートが同一でないと判定されたグラフィックスコマンドを生成し、ステートが同一であると判定されたグラフィックスコマンドは冗長なコマンドであるとして生成しないグラフィックスコマンド生成ステップとを含む。なお、以上の構成要素の任意の組合せ、本発明の表現を方法、装置、システム、コンピュータプログラム、データ構造、記録媒体などの間で変換したものもまた、本発明の態様として有効である。本発明によれば、中間コマンドから生成されるグラフィックスコマンドの実行効率を向上させることができる。図1は、実施の形態に係るグラフィックス処理システムの構成図である。このグラフィックス処理システムは、メインプロセッシングユニット100と、グラフィックスプロセッシングユニット140と、システムメモリ180と、ローカルメモリ160とを含む。メインプロセッシングユニット100は、単一のメインプロセッサであってもよく、複数のプロセッサを含むマルチプロセッサシステムであってもよく、あるいは、複数のプロセッサコアを1個のパッケージに集積したマルチコアプロセッサであってもよい。ここでは、一例として、メインプロセッシングユニット100は、メインプロセッサ101と複数のサブプロセッサ110とを含むヘテロジニアスHeterogeneous異種混合マルチコアプロセッサである。メインプロセッサ101と複数のサブプロセッサ110はバス120に接続されており、バス120にはメモリインタフェース170を介してシステムメモリ180が接続されている。メインプロセッサ101と複数のサブプロセッサ110はバス120を介してシステムメモリ180に対してデータを読み書きすることができる。バス120には入出力インタフェース以下、IOIFと呼ぶ130を介して外部デバイス190が接続されている。ここでは、一例であり、これに限定するものではないが、外部デバイス190は、グラフィックスプロセッシングユニット140とローカルメモリ160を含む。グラフィックスプロセッシングユニット以下、単にGPUという140は、グラフィックプロセッサコアを搭載したグラフィックチップであり、ローカルバス150を介してローカルメモリ160に対してデータを読み書きすることができる。メインプロセッシングユニット100とGPU140は、IOIF130で接続されており、メインプロセッシングユニット100とGPU140は互いにIOIF130を介してデータをやりとりすることができる。メインプロセッシングユニット100は、オブジェクトを描画するための描画コマンドを生成し、システムメモリ180内に設けられたコマンドバッファにキューイングする。GPU140は、コマンドバッファに蓄積された描画コマンドを順次読み出して処理する。メインプロセッシングユニット100は、オブジェクトの3次元モデルにもとづいて、ポリゴンの頂点座標値、頂点カラー、法線ベクトル、UV値などのジオメトリデータを生成し、システムメモリ180に格納する。また、メインプロセッシングユニット100は、ポリゴン表面にマッピングするためのテクスチャをシステムメモリ180に格納する。さらに、メインプロセッシングユニット100は、ハードディスクなどの記録媒体からシェーダプログラムを読み込み、システムメモリ180に格納する。システムメモリ180のメモリ領域はI/Oアドレス空間にメモリマッピングされており、GPU140は、I/Oアドレス空間にメモリマップされたシステムメモリ180のメモリ領域をIOIF130経由で読み取ることができる。ジオメトリデータ、テクスチャおよびシェーダプログラムが格納されたシステムメモリ180内のメモリ領域は、IOIF130のコントローラに設けられたメモリ内のI/Oアドレス空間にメモリマッピングされる。GPU140は、IOIF130を介して、I/Oアドレス空間にメモリマッピングされたジオメトリデータ、テクスチャおよびシェーダプログラムを読み出す。GPU140は、システムメモリ180から読み出したジオメトリデータ、テクスチャなどグラフィックス演算に必要なデータをローカルメモリ160に格納することができる。GPU140は、シェーダプログラムにしたがって、ジオメトリデータを用いてポリゴンのラスタライズデータを生成し、ピクセルデータをローカルメモリ160内のフレームバッファに書き込む。さらに、GPU140は、ポリゴン表面にテクスチャをマッピングし、テクスチャマッピング後のピクセルデータをフレームバッファに書き込む。図2は、グラフィックスコマンド生成装置200の構成図である。グラフィックスコマンド生成装置200は、メインプロセッシングユニット100に実現される機能構成である。メインプロセッシングユニット100がマルチコアプロセッサである場合、メインプロセッサ101または少なくとも一つのサブプロセッサ110上のスレッドにより、グラフィックスコマンド生成装置200の各機能構成が実行される。グラフィックスコマンド生成装置200は、遷移コスト計算部10、ソートキー付与部20、中間コマンド生成部30、モデルデータ記憶部32、ワークデータ記憶部34、ソーティング部40、およびグラフィックスコマンド変換部50を含み、グラフィックスコマンド変換部50は、同一性判定部60、グラフィックスコマンド生成部70、およびステートキャッシュ80を含む。中間コマンドは、オブジェクトをレンダリングするためのデータとしてモデルデータとワークデータを有する。モデルデータは、ジオメトリデータ、テクスチャ、シェーダプログラムなどフレーム間で更新されない情報であり、モデルデータ記憶部32に記憶される。ワークデータは、オブジェクトの位置姿勢などフレームごとに更新される情報であり、ワークデータ記憶部34に記憶される。遷移コスト計算部10は、モデルデータ記憶部32からモデルデータを読み出し、二つの中間コマンド間でモデルデータが遷移する際の遷移コストを計算し、遷移コストをモデルデータ記憶部32に格納する。ソートキー付与部20は、遷移コストにもとづいてモデルデータを遷移させる順序を決定し、その遷移順序にしたがってモデルデータにソートキーを付与し、モデルデータ記憶部32に記憶する。ソートキー付与部20は、ある一つのモデルデータ、たとえば、表示される画面領域を最も占有するモデルデータから開始して、遷移コストの小さい順にモデルデータを巡回することにより、モデルデータを遷移させる順序を決定し、その遷移順序にしたがってモデルデータにソートキーを付与する。中間コマンド生成部30は、レンダリングするオブジェクトの情報を含むシーングラフから、フレームごとに、モデルデータ記憶部32からモデルデータを、ワークデータ記憶部34からワークデータを読み出し、モデルデータとワークデータを有する中間コマンドを生成する。ソーティング部40は、中間コマンド生成部30により生成された複数の中間コマンドの実行順序を各中間コマンドのモデルデータに付与されたソートキーにもとづいて入れ替える。グラフィックスコマンド変換部50は、ソーティング部40により実行順序が入れ替えられた複数の中間コマンドのそれぞれをグラフィックスプロセッサに実行させるためのグラフィックスコマンド列に変換する。グラフィックスコマンド変換部50において、同一性判定部60は、中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であるかどうかを判定する。グラフィックスコマンド生成部70は、同一性判定部60により、ステートが同一でないと判定されたグラフィックスコマンドを生成するが、ステートが同一であると判定されたグラフィックスコマンドは冗長なコマンドであるとして生成しない。より具体的には、グラフィックスコマンド生成部70により生成されたグラフィックスコマンドのステートはステートキャッシュ80にキャッシュされる。同一性判定部60は、中間コマンドから生成されるべきグラフィックスコマンドのステートにもとづいてステートキャッシュ80を参照し、キャッシュヒットした場合は、中間コマンドから生成されるべきグラフィックスコマンドのステートが以前に生成されたグラフィックスコマンドのステートと同一であると判定し、キャッシュヒットしない場合は、中間コマンドから生成されるべきグラフィックスコマンドのステート値によってステートキャッシュ80にキャッシュされたステート値を更新する。グラフィックスコマンド生成部70は、キャッシュヒットした場合は、そのグラフィックスコマンドは冗長なコマンドであるとして生成しないが、キャッシュヒットしない場合は、グラフィックスコマンドを生成する。グラフィックスコマンド生成部70により生成されたグラフィックスコマンドは、GPU140に渡され、GPU140のハードウェア機能を用いて実行され、オブジェクトがレンダリングされる。図3a~dは、中間コマンドからグラフィックスコマンドが生成される様子を説明する図である。図3aは、中間コマンド生成部30により生成された中間コマンド列を示す。ここでは、中間コマンドとしてDrawPacket1、DrawPacket2、DrawPacket3がこの順で生成されている。図3bは、ソーティング部40によりソートされた中間コマンド列を示す。ここでは、ソーティングの結果、2つの中間コマンドDrawPacket1、DrawPacket2の実行順序が入れ替わり、中間コマンドの実行順序はDrawPacket2、DrawPacket1、DrawPacket3の順になる。ソーティング部40によって生成される中間コマンドの実行順序で中間コマンドを実行すると、中間コマンド生成部30によって生成された実行順序で中間コマンドを実行した場合よりもモデルデータの遷移コストが小さくなる。図3cおよび図3dは、グラフィックスコマンド変換部50が中間コマンドからグラフィックスコマンドへ変換する様子を示す。まず、比較のために、図3cを参照して、同一性判定部60を動作させなかった場合に中間コマンドから変換されるグラフィックスコマンド列を説明する。グラフィックスコマンド生成部70が、ソーティング部40によりソートされた中間コマンド列において最初の中間コマンドDrawPacket2をグラフィックスコマンド列に変換すると、SetTextureSetVertexShaderSetFragmentShaderDrawIndexArrayとなる。これを第1グラフィックスコマンド列と呼ぶ。ここで、SetTextureはテクスチャを設定するグラフィックスコマンド、SetVertexShaderは頂点シェーダプログラムを設定するグラフィックスコマンド、SetFragmentShaderはフラグメントシェーダを設定するグラフィックスコマンドであり、DrawIndexArrayは設定されたパラメータやプログラムにもとづいてレンダリングを実行するグラフィックスコマンドである。括弧内のA、P、X、Jはステートである。たとえば、関数SetTextureの引数AはテクスチャID、SetVertexShaderの引数PはシェーダIDまたはメモリ上のプログラムのアドレスである。次に、グラフィックスコマンド生成部70が、ソーティング部40によりソートされた中間コマンド列において2番目の中間コマンドDrawPacket1をグラフィックスコマンド列に変換すると、SetTextureSetVertexShaderSetFragmentShaderDrawIndexArrayとなる。これを第2グラフィックスコマンド列と呼ぶ。さらに、グラフィックスコマンド生成部70が、ソーティング部40によりソートされた中間コマンド列において3番目の中間コマンドDrawPacket3をグラフィックスコマンド列に変換すると、SetTextureSetVertexShaderSetFragmentShaderDrawIndexArrayとなる。これを第3グラフィックスコマンド列と呼ぶ。次に、図3dを参照して、同一性判定部60を動作させた場合に中間コマンドから変換されるグラフィックスコマンド列を説明する。同一性判定部60は、第1グラフィックスコマンド列と第2グラフィックスコマンド列を比較し、同じステート値で同じグラフィックスコマンドが繰り返し生成されているかどうかを判定する。第2グラフィックスコマンド列におけるSetTextureは、第1グラフィックスコマンド列におけるSetTextureと同じグラフィックスコマンドであるが、ステート値が異なるB≠A。第2グラフィックスコマンド列におけるSetVertexShaderは、第1グラフィックスコマンド列におけるSetVertexShaderと同じグラフィックスコマンドであり、ステート値も同じであるどちらもP。第2グラフィックスコマンド列におけるSetFragmentShaderは、第1グラフィックスコマンド列におけるSetFragmentShaderと同じグラフィックスコマンドであるが、ステート値が異なるY≠X。第2グラフィックスコマンド列におけるDrawIndexArrayは、第1グラフィックスコマンド列におけるDrawIndexArrayと同じグラフィックスコマンドであるが、ステート値が異なるK≠J。第2グラフィックスコマンド列におけるSetVertexShaderは、第1グラフィックスコマンド列におけるSetVertexShaderと同一ステートの同一コマンドであるから、冗長なコマンドであり、実行する必要がない。そこで、グラフィックスコマンド生成部70は、同一性判定部60の判定結果にもとづき、第2グラフィックスコマンド列におけるSetVertexShaderは生成せず、残りのSetTexture、SetFragmentShader、DrawIndexArrayを生成する。すなわち、同一性判定部60が動作する場合、グラフィックスコマンド生成部70が生成する第2グラフィックスコマンド列は以下のようになる。SetTextureSetFragmentShaderDrawIndexArray同様に、同一性判定部60は、第2グラフィックスコマンド列と第3グラフィックスコマンド列を比較し、同じステート値で同じグラフィックスコマンドが繰り返し生成されているかどうかを判定する。第3グラフィックスコマンド列におけるSetTextureは、第2グラフィックスコマンド列におけるSetTextureと同じグラフィックスコマンドであり、ステート値も同じであるどちらもB。第3グラフィックスコマンド列におけるSetVertexShaderは、第2グラフィックスコマンド列におけるSetVertexShaderと同じグラフィックスコマンドであり、ステート値も同じであるどちらもP。第3グラフィックスコマンド列におけるSetFragmentShaderは、第2グラフィックスコマンド列におけるSetFragmentShaderと同じグラフィックスコマンドであり、ステート値も同じであるどちらもY。第3グラフィックスコマンド列におけるDrawIndexArrayは、第2グラフィックスコマンド列におけるDrawIndexArrayと同じグラフィックスコマンドであるが、ステート値が異なるL≠K。第3グラフィックスコマンド列におけるSetTexture、SetVertexShader、SetFragmentShaderは、第2グラフィックスコマンド列におけるSetTexture、SetVertexShader、SetFragmentShaderと同一ステートの同一コマンドであるから、冗長なコマンドであり、実行する必要がない。そこで、グラフィックスコマンド生成部70は、同一性判定部60の判定結果にもとづき、第3グラフィックスコマンド列におけるSetTexture、SetVertexShader、SetFragmentShaderは生成せず、残りのDrawIndexArrayを生成する。すなわち、同一性判定部60が動作する場合、グラフィックスコマンド生成部70が生成する第3グラフィックスコマンド列は以下のようになる。DrawIndexArray以上をまとめると、本実施の形態のグラフィックスコマンド変換部50によれば、同一性判定部60がグラフィックスコマンドのステートの同一性を判定し、グラフィックスコマンド生成部70は同一性判定結果にもとづいて、ソーティング部40によってソートされた中間コマンド列から、冗長性を削除した以下のグラフィックスコマンド列を生成する。SetTextureSetVertexShaderSetFragmentShaderDrawIndexArraySetTextureSetFragmentShaderDrawIndexArrayDrawIndexArray図3cの同一性判定部60が動作しなかった場合と比べれば、生成されるグラフィックスコマンドの数は12から8に減っており、処理効率が向上する。ここで、ソーティング部40が、図3aに示した中間コマンド生成部30が生成した中間コマンド列を図3bに示すようにソーティングすることの意義を説明する。仮にソーティング部40によるソーティングが行われなかったとすると、図3aの中間コマンド列の順序でグラフィックコマンド列が生成される。その場合、同一性判定部60が動作しないとすると、中間コマンド列は以下のグラフィックコマンド列に変換されることになる。SetTextureSetVertexShaderSetFragmentShaderDrawIndexArraySetTextureSetVertexShaderSetFragmentShaderDrawIndexArraySetTextureSetVertexShaderSetFragmentShaderDrawIndexArrayここで、同一性判定部60が動作すると、上記のグラフィックスコマンド列の6番目のSetVertexShaderはそれより前に実行される2番目のSetVertexShaderと同一ステートであり、10番目のSetVertexShaderはそれより前に実行される6番目のSetVertexShaderと同一ステートであるから冗長であるとして削除することができる。しかし、他のグラフィックスコマンドは、それより前に実行される同一のグラフィックスコマンドとステートが異なるから、冗長ではない。たとえば、5番目のSetTextureはそれより前に実行される1番目のSetTextureとステートが異なり、9番目のSetTextureはそれより前に実行される5番目のSetTextureとステートが異なるため、それぞれ実行を省くことはできないものである。したがって、同一性判定部60の同一判定の結果、冗長であるとして削除できるグラフィックスコマンドは2つだけであり、グラフィックスコマンド生成部70により生成される冗長性を削除したグラフィックスコマンド列は以下のようにグラフィックスコマンドの数が10になる。SetTextureSetVertexShaderSetFragmentShaderDrawIndexArraySetTextureSetFragmentShaderDrawIndexArraySetTextureSetFragmentShaderDrawIndexArrayこのように、ソーティング部40によって中間コマンド列の実行順序をソーティングすることによって、同一性判定部60が冗長であると判定するグラフィックスコマンドの数を増やすことができ、グラフィックスコマンド生成部70によって冗長性を削除して最適化したグラフィックスコマンド列を生成して、グラフィックス処理の効率を高めることができる。以下、遷移コストにもとづく中間コマンド列のソーティング処理について、詳しく説明する。図4aは、遷移コスト計算部10によるモデルデータの遷移コストの計算方法を説明する図であり、図4bは、ソートキー付与部20によるモデルデータへのソートキーの付与方法とを説明する図である。遷移コスト計算部10は、あるモデルデータから別のモデルデータへ遷移した場合、グラフィックス演算に係るハードウェアが受ける処理負荷を示す遷移コストを計算する。たとえば、モデルデータが遷移することにより、テクスチャが変更される場合、遷移コストを10ポイントとし、フラグメントシェーダが変更される場合、遷移コストを30ポイントとし、頂点シェーダが変更される場合、遷移コストを20ポイントとする。これらのポイントは、グラフィックスハードウェアにおいて、テクスチャ、フラグメントシェーダ、頂点シェーダを変更する際の負荷を相対的に表したものである。たとえば、モデルデータAからモデルデータBに遷移するとき、テクスチャが3枚、フラグメントシェーダが1個変更になるとすると、遷移コストは合計すると、10×330=60ポイントとなる。遷移コスト計算部10は、各フレームでレンダリングされるすべてのオブジェクトのモデルデータについて、2つのモデルデータ間を遷移するときの遷移コストを計算する。図4aは、4つのモデルデータA~Dについて、任意の2つのモデルデータ間の遷移コストを計算した例を示す。モデルデータAからモデルデータBへの遷移コストは10、モデルデータAからモデルデータCへの遷移コストは30、モデルデータAからモデルデータDへの遷移コストは50、モデルデータBからモデルデータCへの遷移コストは40、モデルデータBからモデルデータDへの遷移コストは20、モデルデータCからモデルデータDへの遷移コストは10である。ソートキー付与部20は、表示される画面領域を最も占有するモデルデータ、たとえば、画面の中心を占めるであろうモデルデータを開始点として、遷移コストが最も小さいモデルデータを次に選択することを繰り返すことにより、すべてのモデルデータを巡回する。これにより、モデルデータを遷移させる順序を決定し、その遷移順序にしたがってモデルデータにソートキーを付与する。画面の中心を占めるであろうモデルデータから始めるのは、そのモデルデータを最初に描画することで、後続する中間コマンドの生成するピクセルがその後ろに隠れ、カリングにより処理をスキップできる可能性が高まり、処理効率が向上するからである。ここでは、モデルデータAが画面の中心を占めると想定し、モデルデータAから開始する。図4bに示すように、モデルデータAを起点として、モデルデータBに遷移すると遷移コストは10ポイント、モデルデータCに遷移すると遷移コストは30ポイント、モデルデータDに遷移すると遷移コストは50ポイントであるから、3つのモデルデータB、C、Dの中から遷移コストが最小であるモデルデータBを2番目として選択する。同様に、モデルデータBから、モデルデータCに遷移すると遷移コストは40ポイント、モデルデータDに遷移すると遷移コストは20ポイントであるから、残り2つのモデルデータC、Dの中から遷移コストが最小であるモデルデータDを3番目として選択する。最後に、モデルデータDから残りのモデルデータCに遷移する。4番目のモデルデータCへの遷移コストは10である。このようにして、ソートキー付与部20は、モデルデータ間の遷移コストにもとづいてモデルデータA、B、D、Cの順にモデルデータを遷移させる順序を決定し、この順にモデルデータA、B、D、Cにそれぞれソートキー0、1、2、3を割り当てる。ここでは、任意の2つのモデルデータ間の遷移コストを計算して、あるモデルデータを起点として、最小遷移コストを探索することにより、モデルデータの遷移順序を決定し、ソートキーを付与したが、遷移コストにもとづいて別の探索アルゴリズムを用いてモデルデータの遷移順序を決定してもよい。また、任意の2つのモデルデータ間の遷移コストをすべて計算することが処理負荷になる場合は、モデルデータの一部の組み合わせについて遷移コストを求め、モデルデータを巡回するパスを遷移コストを求めた範囲に限定してもよい。中間コマンド生成部30がモデルデータとワークデータを有する中間コマンドを生成するとき、モデルデータにはソートキーが割り当てられており、ソーティング部40はソートキーの順に中間コマンド生成部30が生成した中間コマンド列をソーティングする。これにより、モデルデータが似ている中間コマンドがクラスタリングされて連続して実行されるようになる。モデルデータの遷移コストが小さい順にモデルデータを遷移させると、中間コマンド列からグラフィックスコマンド列を生成したとき、繰り返し実行されるグラフィックスコマンドのステートが一致することが多くなる。たとえば、遷移コストが小さいということは、テクスチャやシェーダの変更が少ないということであり、グラフィックスコマンドのステートが変更されることも少なくなる。そのため、モデルデータの遷移コストが小さい順に中間コマンド列をソーティングした上で、中間コマンド列をグラフィックスコマンド列に変更すると、同一性判定によって削除できるグラフィックスコマンドの数を増やすことができる。図5は、実施の形態に係るグラフィックスコマンド生成装置200によるグラフィックコマンド生成処理の手順を示すフローチャートである。レンダリングされるすべてのオブジェクトのモデルデータを生成するS10。遷移コスト計算部10は、モデルデータ間を遷移するときの遷移コストを計算するS20。ソートキー付与部20は、遷移コストにもとづいてモデルデータを遷移する順序を決定し、その順序にしたがってモデルデータにソートキーを付与するS30。ステップS10~S30の処理はオフラインで実行され、モデルデータ記憶部32にはソートキー付きのモデルデータが記憶される。各フレームについて、以下のステップS40~S70が繰り返し実行される。まず、中間コマンド生成部30は、モデルデータとワークデータを有する中間コマンドを生成するS40。ソーティング部40は、モデルデータに付与されたソートキーの順に中間コマンド生成部30が生成した中間コマンドをソーティングするS50。グラフィックスコマンド変換部50は、ソーティング後の中間コマンドをグラフィックスコマンドに変換するS60。次のフレームのレンダリングをする場合S70のYは、ステップS40に戻ってステップS40~S60の処理を繰り返し、現フレームでレンダリングを終える場合S70のN、グラフィックスコマンド生成処理を終了する。図6は、グラフィックスコマンド変換部50によって実行されるステップS60のグラフィックスコマンドへの変換処理の詳細な手順を示すフローチャートである。グラフィックスコマンド変換部50において、同一性判定部60は、中間コマンドからこれから生成されようとしているグラフィックスコマンドのステートとその設定値にもとづいてステートキャッシュ80を参照し、当該ステート値がキャッシュされているかどうかを調べるS80。ステートキャッシュ80において当該ステート値がキャッシュヒットした場合S82のY、既に同一のステート値のグラフィックスコマンドが実行されていることから、同一性判定部60は、中間コマンドから生成されようとしているグラフィックスコマンドが冗長であると判定し、グラフィックスコマンド生成部70は、このグラフィックスコマンドを生成しないで終了する。一方、ステートキャッシュ80において当該ステート値がキャッシュヒットしなかった場合S82のN、中間コマンドからこれから生成されようとしているグラフィックスコマンドが以前は異なるステート値で実行されていたか、そのグラフィックスコマンドはまだ実行されたことがない。この場合、同一性判定部60は、中間コマンドから生成されようとしているグラフィックスコマンドは冗長ではないと判定し、当該ステート値によってステートキャッシュ80を更新しS84、グラフィックスコマンド生成部70は、中間コマンドからグラフィックスコマンドを生成するS86。同一性判定部60とグラフィックスコマンド生成部70は、ステートキャッシュ80を用いて、ステップS80~S86の処理を繰り返し、中間コマンド列をグラフィックスコマンド列に変換する。これにより、同一の設定を行う冗長なグラフィックスコマンドを削除したグラフィックスコマンド列が生成される。以下、ステートキャッシュ80にキャッシュされるステートの種類の具体例を挙げる。1フラグメントシェーダ/頂点シェーダのプログラムIDフラグメントシェーダ/頂点シェーダのプログラムの生成時に、ユニークIDをふっておき、ステートキャッシュ80にそのIDを保持し、同一性判定部60は、同一のIDの場合はプログラム設定コマンドは冗長であると判定し、グラフィックスコマンド生成部70はそのプログラム設定コマンドの生成をスキップする。このIDは、シェーダが一つの論理アドレス空間内に存在する場合はその先頭アドレスでもよい。2テクスチャIDテクスチャ生成時に、ユニークIDをふっておき、ステートキャッシュ80にそのIDをテクスチャユニット毎に保持する。同一性判定部60は、レンダリング時にテクスチャユニットのIDをチェックし同一であれば、テクスチャ設定コマンドは冗長であると判定し、グラフィックスコマンド生成部70は、そのテクスチャ設定コマンドの生成をスキップする。このIDは、テクスチャ一つの論理アドレス空間内に存在する場合はその先頭アドレスでもよい。3デプステスト/ブレンド/ステンシルテストの設定値デプステスト、ブレンド、ステンシルテストを行うか行わないかenabledisableの設定をBool値でステートキャッシュ80に保持し、同一性判定部60は、設定値が同一の場合はこれらの処理を行うか行わないかを設定するコマンドは冗長であると判定し、グラフィックスコマンド生成部70はその設定コマンドの生成をスキップする。4デプステスト関数/ブレンド関数/ステンシルテストオペレータ設定した各関数を意味する定数をステートキャッシュ80にキャッシュする。デプステスト関数であれば、そのデプス関数がイコール=、lessthan<、greaterthan>のいずれであるかを識別する定数、ブレンド関数であれば、ブレンド比率を識別する定数、ステンシルテストオペレータであれば、インクリメント/デクリメントのいずれであるかを識別する定数がステートキャッシュ80に保持される。同一性判定部60は、各関数を識別する定数が同一の場合はこれらの関数の設定コマンドは冗長であると判定し、グラフィックスコマンド生成部70はその設定コマンドの生成をスキップする。5各種行列各種行列にIDをふっておき、ステートキャッシュ80にそのIDを保持する。同一性判定部60は、同一のIDの場合は、行列の設定コマンドは冗長であると判定し、グラフィックスコマンド生成部70はその行列の設定コマンドの生成をスキップする。たとえば、View行列やProjection行列は、レンダリングを通して切り替わるのはシャドウマップレンダリング時と通常レンダリングの時ぐらいでおおよそ変わらないから、多くの場合、行列の設定コマンドの生成はスキップすることができる。ステートキャッシュ80にキャッシュされるステートをまとめると、以下のようになる。ViewMatrixIDProjectionMatrixIDModelMatrixIDFragmentShaderIDVertexShaderIDTextureIDDepthTestDepthTestFunctionStencilTestStencilTestFunctionBlendBlendFunction以上述べたように、本実施の形態のグラフィックスコマンド生成装置200によれば、モデルデータの遷移コストにもとづいてソートされた中間コマンドを順次グラフィックスコマンドに変換する。グラフィックスコマンドに変換する際、グラフィックスコマンドによって設定したステートの値をキャッシュしておき、ステートの設定値が変化した場合のみグラフィックスコマンドを生成することで、生成されるグラフィックスコマンドの数を減らすことができ、処理効率を高めることができる。GPUハードウェアは深いパイプライン動作を行うようになっており、一部のステートが変化する場合、パイプラインの上段でストールしてステートの更新を待つことになるが、本実施の形態では、GPUハードウェア内部のコンテキスト切り替えに伴う性能低下を抑えることができるため、より多くのデータをレンダリング可能である。図7~図9を参照して、実施の形態のグラフィックスコマンド生成装置200の応用例をいくつか説明する。図7は、複数のプロセスによりレンダリングの中間コマンド列が生成され、一つのレンダリングプロセスでソーティングと冗長性削除が行われるシステムを説明する図である。複数のプロセスA~Cが並列にレンダリングの中間コマンド列を生成するが、テクスチャ、シェーダなどの各種リソースに対してIDをふって管理するユニーク管理プロセスが存在し、システム全体でリソースのIDがユニークになるように管理する。各プロセスA~Cは、ユニークID管理プロセスに各種リソースのIDを問い合わせ、モデルデータにソートキーを付与する。各プロセスA~Cが生成した中間コマンド列は一つのレンダリングプロセスに渡され、最終的にレンダリングプロセスがソートキーによる中間コマンド列のソーティング、中間コマンド列からグラフィックコマンド列への変換、ステートにもとづく同一性判定による冗長性削除を行う。この場合、グラフィックスコマンド生成装置200の遷移コスト計算部10、ソートキー付与部20、中間コマンド生成部30の機能は、各プロセスA~Cに実装されるが、ソーティング部40、同一性判定部60、グラフィックスコマンド生成部70の各機能は、1つのレンダリングプロセスに実装される。この応用例では、複数のプロセスを用いて処理を分散化し、処理効率を上げることができるという効果を奏する。図8は、複数のサーバによりレンダリングの中間コマンド列が生成され、サーバと通信するクライアントでソーティングと冗長性削除が行われるシステムを説明する図である。サービス提供者側でテクスチャ、シェーダなどの各種リソースに対してIDをふって管理し、各サーバA~Cが並列にレンダリングの中間コマンド列を生成し、モデルデータのソートキーをコンテンツとともにクライアントのアプリケーションに配信することで、クライアントは中間コマンドをソートし、冗長性を削除したグラフィックスコマンドを生成することができる。この場合、グラフィックスコマンド生成装置200の遷移コスト計算部10、ソートキー付与部20、中間コマンド生成部30の機能は、各サーバA~Cに実装されるが、ソーティング部40、同一性判定部60、グラフィックスコマンド生成部70の各機能は、クライアントに実装される。この応用例では、クライアントの描画負荷を削減でき、クライアントの描画効率を高められ、また、クライアントの消費電力を削減することができるという効果を奏する。図9は、複数のクライアントによりレンダリングの中間コマンド列が生成され、複数のクライアントと通信するサーバでソーティングと冗長性削除が行われるシステムを説明する図である。クライアントは、サービス提供側が事前に作成したモデルデータを組み合わせたモデルを作成し、レンダリング中間コマンドをサーバへ送付する。サーバは、複数のクライアントA~Cが作成した中間コマンドを受けつけ、それらを一つの画面にレンダリングする。たとえば、大きな画像をレンダリングする場合、複数のクライアントが並列に中間コマンドを生成し、サーバが複数のクライアントA~Cから中間コマンドを受信して、レンダリングをすることがある。サーバは、複数のクライアントA~Cから受信した中間コマンドのソーティングを行い、グラフィックスコマンド列に変換する際、冗長なグラフィックスコマンドを削減してレンダリングを行う。最後に、サーバはレンダリングした画像を各クライアントA~Cに配信する。この画像には、他クライアントが送信したモデルデータが含まれている。この場合、グラフィックスコマンド生成装置200の遷移コスト計算部10、ソートキー付与部20、中間コマンド生成部30の機能は、各クライアントA~Cに実装されるが、ソーティング部40、同一性判定部60、グラフィックスコマンド生成部70の各機能は、サーバに実装される。この応用例では、サーバーの消費電力、計算資源を削減することができる。以上、本発明を実施の形態をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。