以下、本実施形態について説明する。なお、以下に説明する本実施形態は、特許請求の範囲に記載された本発明の内容を不当に限定するものではない。また本実施形態で説明される構成の全てが、本発明の必須構成要件であるとは限らない。
1.構成
図1に本実施形態の画像生成システム(ゲームシステム)のブロック図の例を示す。なお本実施形態の画像生成システムは図1の構成要素(各部)の一部を省略した構成としてもよい。
操作部160は、プレーヤが操作データを入力するためのものであり、その機能は、方向キー、操作ボタン、アナログスティック、レバー、ステアリング、アクセル、ブレーキ、マイク、或いはタッチパネル型ディスプレイなどにより実現できる。
記憶部170は、処理部100や通信部196などのワーク領域となるもので、その機能はRAM(DRAM、VRAM)などにより実現できる。この記憶部170は、電源を切るとデータが消えてしまう揮発性のメモリにより構成できるが、補助記憶装置194よりも高速な記憶装置になっている。そしてゲームプログラムや、ゲームプログラムの実行に必要なゲームデータは、この記憶部170に保持される。
情報記憶媒体180(コンピュータにより読み取り可能な媒体)は、プログラムやデータなどを格納するものであり、その機能は、光ディスク(CD、DVD)、HDD(ハードディスクドライブ)、或いはメモリ(ROM等)などにより実現できる。処理部100は、情報記憶媒体180に格納されるプログラム(データ)に基づいて本実施形態の種々の処理を行う。即ち情報記憶媒体180には、本実施形態の各部としてコンピュータ(操作部、処理部、記憶部、出力部を備える装置)を機能させるためのプログラム(各部の処理をコンピュータに実行させるためのプログラム)が記憶される。
表示部190は、本実施形態により生成された画像を出力するものであり、その機能は、CRT、LCD、タッチパネル型ディスプレイ、或いはHMD(ヘッドマウントディスプレイ)などにより実現できる。音出力部192は、本実施形態により生成された音を出力するものであり、その機能は、スピーカ、或いはヘッドフォンなどにより実現できる。
補助記憶装置194(補助メモリ、2次メモリ)は、記憶部170の容量を補うために使用される大容量の記憶装置であり、SDメモリーカード、マルチメディアカードなどのメモリーカードや、HDDなどにより実現できる。この補助記憶装置194は脱着自在になっているが、内蔵されるものであってもよい。この補助記憶装置194は、ゲームの途中結果などのセーブデータや、プレーヤ(ユーザ)の個人的な画像データや音楽データなどを保存するために使用される。
通信部196は、有線や無線のネットワークを介して外部(例えば他の画像生成システム、サーバ、ホスト装置)との間で通信を行うものであり、その機能は、通信用ASIC又は通信用プロセッサなどのハードウェアや、通信用ファームウェアにより実現できる。
なお本実施形態の各部としてコンピュータを機能させるためのプログラム(データ)は、サーバ(ホスト装置)が有する情報記憶媒体からネットワーク及び通信部196を介して情報記憶媒体180(あるいは記憶部170、補助記憶装置194)に配信してもよい。このようなサーバ(ホスト装置)による情報記憶媒体の使用も本発明の範囲内に含めることができる。
処理部100(プロセッサ)は、操作部160からの操作データやプログラムなどに基づいて、ゲーム処理、画像生成処理、或いは音生成処理などを行う。処理部100は記憶部170(主記憶部172)をワーク領域として各種処理を行う。この処理部100の機能は、各種プロセッサ(CPU、GPU等)、ASIC(ゲートアレイ等)などのハードウェアや、プログラムにより実現できる。
処理部100は、ゲーム演算部102、オブジェクト空間設定部104、移動体演算部106、仮想カメラ制御部108、コマンド生成部110、コマンド実行部118を含む。コマンド実行部118は描画部120、音生成部130を含む。なおこれらの一部を省略する構成としてもよい。
ゲーム演算部102はゲーム演算処理を行う。ここでゲーム演算としては、ゲーム開始条件が満たされた場合にゲームを開始する処理、ゲームを進行させる処理、ゲーム結果を演算する処理、或いはゲーム終了条件が満たされた場合にゲームを終了する処理などがある。
オブジェクト空間設定部104は、モデルオブジェクト(車、戦闘機、人、ロボット、ミサイル、弾等の移動体)、マップ(地形)、建物、コース(道路)、樹木、壁などの表示物を表す各種オブジェクト(ポリゴン、自由曲面又はサブディビジョンサーフェイスなどのプリミティブ面で構成されるオブジェクト)をオブジェクト空間に配置設定する処理を行う。即ちワールド座標系でのオブジェクトの位置や回転角度(向き、方向と同義)を決定し、その位置(X、Y、Z)にその回転角度(X、Y、Z軸回りでの回転角度)でオブジェクトを配置する。具体的には、記憶部170のモデルデータ記憶部MSには、オブジェクトの位置、回転角度、移動速度、移動方向等のデータであるオブジェクトデータがオブジェクト番号に対応づけて記憶される。そしてこのオブジェクトデータは、移動体演算部106の移動体演算処理等により順次更新される。
オブジェクト空間設定部104はカリング処理部105を含む。このカリング処理部105は例えばソフトウェアによるカリング処理を行う。具体的には、オブジェクトデータのオブジェクトリストの中から、当該フレームにおいて表示されることがないオブジェクトを削除する処理を行う。例えば当該フレームにおいて仮想カメラの視野範囲内に存在せず、表示処理を行う必要がないオブジェクトを予め削除する。このようにすれば、削除されたオブジェクトを構成するポリゴンについては頂点データ等を作成しなくても済むため、処理負荷を大幅に軽減できる。
移動体演算部(移動体制御部)106は、移動体(移動体オブジェクト)を移動させるための演算を行う。また移動体を動作させるための演算も行う。即ち操作部160によりプレーヤが入力した操作データや、プログラム(移動・動作アルゴリズム)や、各種データ(モーションデータ)などに基づいて、移動体(オブジェクト、モデルオブジェクト)をオブジェクト空間内で移動させたり、移動体を動作(モーション、アニメーション)させる処理を行う。具体的には、移動体の移動情報(位置、回転角度、速度、或いは加速度)や動作情報(パーツオブジェクトの位置、或いは回転角度)を、1フレーム(1/60秒)毎に順次求めるシミュレーション処理を行う。なおフレームは、移動体の移動・動作処理(シミュレーション処理)や画像生成処理を行う時間の単位である。
より具体的には、移動体演算部106は、モーションデータ記憶部MTSに記憶されるモーションデータに基づいて、オブジェクトのモーションを再生する処理を行う。即ち、オブジェクト(スケルトン)を構成する各パーツオブジェクト(スケルトンを構成する骨)の位置又は回転角度(方向)等を含むモーションデータを、モーションデータ記憶部MTSから読み出す。そして、オブジェクトの各パーツオブジェクト(骨)を動かすことで(スケルトン形状を変形させることで)、オブジェクトのモーションを再生する。
仮想カメラ制御部108は、オブジェクト空間内の所与(任意)の視点から見える画像を生成するための仮想カメラ(視点)の制御処理を行う。具体的には、仮想カメラの位置(X、Y、Z)又は回転角度(X、Y、Z軸回りでの回転角度)を制御する処理(視点位置、視線方向あるいは画角を制御する処理)を行う。
例えば仮想カメラにより車、キャラクタ、戦闘機などの移動体を後方から撮影する場合には、移動体の位置又は回転の変化に仮想カメラが追従するように、仮想カメラの位置又は回転角度(仮想カメラの向き)を制御する。この場合には、移動体演算部106で得られた移動体の位置、回転角度又は速度などの情報に基づいて、仮想カメラを制御できる。或いは、仮想カメラを、予め決められた回転角度で回転させたり、予め決められた移動経路で移動させる制御を行ってもよい。この場合には、仮想カメラの位置(移動経路)又は回転角度を特定するための仮想カメラデータに基づいて仮想カメラを制御する。
なお本実施形態では仮想カメラ制御部108は、多眼立体視画像を生成するために、複数の視点の仮想カメラの制御を行う。具体的には第1の視点用(例えば右目用)の仮想カメラと第2の視点用(例えば左目用)の仮想カメラを制御して、プレーヤに立体感を感じさせるための両眼視差等を実現する。
コマンド生成部110は、コマンド実行部118(描画プロセッサ、GPU)により実行される各種のコマンドを生成する。
具体的には、記憶部170には、多眼立体視の第1の視点用(例えば右目用)のコマンドが書き込まれる第1の視点用のコマンドバッファCBRや、多眼立体視の第2の視点用(例えば左目用)のコマンドが書き込まれる第2の視点用のコマンドバッファCBLや、共通コマンド(メインコマンド、第1、第2の視点に非依存のコマンド)が書き込まれる共通コマンドバッファCBMが確保(用意)される。例えばn眼立体視(n≧2)の場合には、第1〜第nの視点用のコマンドバッファが確保される。
そしてコマンド生成部110は、第1の視点用コマンド、第2の視点用コマンド、或いは共通コマンドを生成する。そして生成した各々のコマンドを、第1の視点用のコマンドバッファCBR、第2の視点用のコマンドバッファCBL、共通コマンドバッファCBMに書き込む。
例えばコマンド生成部110は、コマンド実行部118により実行される各処理のうち、第1、第2の視点用コマンドが必要な処理(例えば第1、第2の視点画像の生成に使用されるコマンド)については、第1、第2の視点用コマンドを生成して、第1、第2の視点用のコマンドバッファCBR、CBLに書き込む。具体的には、コマンド実行部118により実行される各処理のうち、多眼立体視の第1、第2の視点で内容が異なる処理については、異なる内容の第1、第2の視点用コマンドを生成して、コマンドバッファCBR、CBLに書き込み、第1、第2の視点で内容が同じになる処理については、同じ内容の第1、第2の視点用コマンドを生成して、コマンドバッファCBR、CBLに書き込む。
一方、コマンド生成部110は、第1、第2の視点用コマンドが必要ではない処理(例えば第1、第2の視点画像の生成に使用されないコマンド)については、共通コマンドを生成して、共通コマンドバッファCBMに書き込む。
ここで、共通コマンドとしては、例えば描画処理を行うハードウェアの制御コマンドや、ハードウェアでサポートされる影の生成処理用のコマンドなどを想定できる。
また、異なる内容の第1、第2の視点用コマンドとしては、カメラ依存パラメータ(カメラの視点、視線方向等に依存するパラメータ)の設定コマンドを想定でき、同じ内容の第1、第2の視点用コマンドとしては、カメラ非依存パラメータ(カメラの視点、視線方向等に依存しないパラメータ)の設定コマンドを想定できる。またこれらのカメラ依存パラメータやカメラ非依存パラメータは、例えばシェーダ(ピクセルシェーダや頂点シェーダのプログラム)に対して設定され、シェーダはこれらのパラメータに基づいてピクセルシェーダや頂点シェーダの処理を行う。
コマンド実行部118(処理部100のハードウェア部分)は、コマンド生成部110により生成されたコマンドを実行する。具体的には、コマンド生成部110により生成されてコマンドバッファCBR、CBL、CBMに書き込まれたコマンドを実行する。
この場合にコマンド実行部118は、コマンドバッファCBRに書き込まれた第1の視点用コマンドを実行した後に、コマンドバッファCBLに書き込まれた第2の視点用コマンドを実行する。そしてその後に、共通コマンドバッファに書き込まれた共通コマンドを実行する。
第1、第2の視点用コマンドの実行後に実行される共通コマンドとしては、例えば、多眼立体視画像の第1の視点画像と第2の視点画像の合成コマンド(描画バッファへの書き戻しコマンド)や、バックバッファとフロントバッファの切り替えコマンドなどを想定できる。
またコマンド実行部118は、第1、第2の視点用コマンドの実行前に、コマンドバッファCBMに書き込まれた共通コマンドを実行するようにしてもよい。この場合に、第1、第2の視点用コマンドの実行前に実行されるコマンドとしては、例えば、ハードウェア制御コマンドや、影生成処理用コマンドなどを想定できる。
なおカリング処理部105が、多眼立体視の第1の視点と第2の視点とで共通のカリング処理を行う場合に、コマンド生成部110は、共通のカリング処理により得られる頂点データ(ポリゴンデータ)の設定コマンドを、同じ内容の第1、第2の視点用コマンドとして生成する。具体的には、共通のカリング処理により得られる頂点データの設定コマンドを、同じ内容の第1、第2の視点用コマンドとして生成して、コマンドバッファCBR、CBLに書き込む。そしてコマンド実行部118は、生成された第1、第2の視点用コマンドを実行する。
コマンド実行部118は、描画部120(描画プロセッサ)や音生成部130(サウンドプロセッサ)を含むことができる。例えばコマンド実行部118は、ハードウェアによる専用の処理を行うプロセッサ(メインの処理を行うCPU以外のプロセッサ)により実現できる。
コマンド実行部118が含む描画部120(画像生成部)は、処理部100で行われる種々の処理(ゲーム処理、シミュレーション処理)の結果に基づいて描画処理を行い、これにより画像を生成し、表示部190に出力する。いわゆる3次元ゲーム画像を生成する場合には、まずモデル(オブジェクト)の各頂点の頂点データ(頂点の位置座標、テクスチャ座標、色データ、法線ベクトル或いはα値等)が生成され、これらのデータに基づいて、頂点処理(頂点シェーダによるシェーディング)が行われる。なお頂点処理を行うに際して、必要に応じてポリゴンを再分割するための頂点生成処理(テッセレーション、曲面分割、ポリゴン分割)を行うようにしてもよい。
頂点処理(頂点シェーダ処理)では、頂点処理プログラム(頂点シェーダプログラム、第1のシェーダプログラム)に従って、頂点の移動処理や、座標変換(ワールド座標変換、カメラ座標変換)、クリッピング処理、あるいは透視変換等のジオメトリ処理が行われ、その処理結果に基づいて、オブジェクトを構成する頂点群について与えられた頂点データを変更(更新、調整)する。そして、頂点処理後の頂点データに基づいてラスタライズ(走査変換)が行われ、ポリゴン(プリミティブ)の面とピクセルとが対応づけられる。そしてラスタライズに続いて、画像を構成するピクセル(表示画面を構成するフラグメント)を描画するピクセル処理(ピクセルシェーダによるシェーディング、フラグメント処理)が行われる。
ピクセル処理(ピクセルシェーダ処理)では、ピクセル処理プログラム(ピクセルシェーダプログラム、第2のシェーダプログラム)に従って、テクスチャの読出し(テクスチャマッピング)、色データの設定/変更、半透明合成、アンチエイリアス等の各種処理を行って、画像を構成するピクセルの最終的な描画色を決定し、透視変換されたモデルの描画色を描画バッファDB(ピクセル単位で画像情報を記憶できるバッファ。VRAM、レンダリングターゲット、フレームバッファ)に出力(描画)する。即ち、ピクセル処理では、画像情報(色、法線、輝度、α値等)をピクセル単位で設定あるいは変更するパーピクセル処理を行う。これにより、オブジェクト空間内において仮想カメラ(所与の視点)から見える画像が生成される。
なお頂点処理やピクセル処理は、シェーディング言語によって記述されたシェーダプログラムによって、ポリゴン(プリミティブ)の描画処理をプログラム可能にするハードウェア、いわゆるプログラマブルシェーダ(頂点シェーダやピクセルシェーダ)により実現される。プログラマブルシェーダでは、頂点単位の処理やピクセル単位の処理がプログラム可能になることで描画処理内容の自由度が高く、従来のハードウェアによる固定的な描画処理に比べて表現力を大幅に向上させることができる。
描画部120は、ライティング処理部122、テクスチャマッピング部124を含む。なおこれらの一部を省略する構成としてもよい。
ライティング処理部122は、照明モデル等に基づくライティング処理(シェーディング処理)を行う。具体的にはこのライティング処理は、光源情報(光源ベクトル、光源色、明るさ、光源タイプ等)、仮想カメラ(視点)の視線ベクトル、オブジェクト(半透明オブジェクト)の法線ベクトル、オブジェクトのマテリアル(色、材質)などを用いて行われる。なお照明モデルとしては、アンビエント光とディフューズ光だけを考慮したランバードの拡散照明モデルや、アンビエント光、ディフューズ光に加えてスペキュラ光も考慮するフォンの照明モデルやブリン・フォンの照明モデルなどがある。
テクスチャマッピング部124は、オブジェクト(ポリゴン)にテクスチャをマッピングする処理を行う。ここでテクスチャマッピング処理は、テクスチャ記憶部TSに記憶されるテクスチャ(テクセル値)をオブジェクトにマッピングする処理である。具体的には、オブジェクト(プリミティブ面)の頂点やピクセルに設定(付与)されるテクスチャ座標等を用いてテクスチャ記憶部TSからテクスチャ(色、α値などの表面プロパティ)を読み出す。そして2次元の画像又はパターンであるテクスチャをオブジェクトにマッピングする。この場合に、ピクセルとテクセルとを対応づける処理やバイリニア補間(広義にはテクセル補間)などを行う。
そして本実施形態では描画部120は、多眼立体視画像(n眼立体視画像。n≧2)を生成するための描画処理を行う。具体的には描画部120は、多眼立体視(2眼立体視)の第1の視点画像(例えば右目用画像)を高さ方向(縦方向)において例えば1/2に圧縮(縮小)して、バッファTBの第1の領域AR1(例えば左半分側の領域)に書き込む。また多眼立体視の第2の視点画像(例えば左目用画像)を高さ方向(縦方向)において例えば1/2に圧縮(縮小)して、バッファTBの第2の領域AR2(例えば右半分側の領域)に書き込む。そしてバッファTBから画像(AR1、AR2の画像)を読み出すことで、第1の領域AR1に書き込まれた第1の視点画像のピクセル画像(R、G、B、α)と第2の領域AR2に書き込まれた第2の視点画像のピクセル画像とが、ライン毎(例えば走査ライン毎、ビットマップライン毎)に交互に表示される多眼立体視画像を生成する。
更に具体的には、第1、第2の領域AR1、AR2は、幅がWピクセル(例えば1920ピクセル)であり高さがH/2ピクセル(例えば1080/2=540ピクセル)の領域になっている。
そして画像の書き込み時には、バッファTBのメモリピッチを2Nバイト(例えば2×4バイト×2048ピクセル=16384バイト)に設定する。ここでメモリピッチ(ピッチサイズ)は、ビットマップラインの先頭を表すアドレスと、次のラインの先頭を表すアドレスとのバイト単位の距離である。描画部120は、このように設定されたバッファTBにおいて、幅がWピクセルであり高さがHピクセルである第1の視点画像を、第1の領域AR1に書き込む。また幅がWピクセルであり高さがHピクセルである第2の視点画像を、第2の領域AR2に書き込む。例えば第1の視点画像を描画バッファDB(DB1又はDB2)に描画し、描画された第1の視点画像を高さ方向において圧縮してバッファTBの第1の領域AR1にコピーする。また第2の視点画像を描画バッファDB(DB1又はDB2)に描画し、描画された第2の視点画像を高さ方向において圧縮してバッファTBの第2の領域AR2にコピーする。この場合のコピー処理は、第1、第2の領域AR1、AR2のサイズのポリゴン(画面に表示されない仮想的なポリゴン)に対して、第1又は第2の視点画像をテクスチャとしてマッピングし、当該ポリゴンを第1又は第2の領域AR1、AR2に描画することで実現できる。
一方、画像の読み出し時には、バッファTBのメモリピッチをNバイトに設定する。描画部120は、このように設定されたバッファTBから画像を読み出すことで、多眼立体視画像を生成する。例えば第1、第2の視点画像が第1、第2の領域AR1、AR2にコピーされた後に、バッファTBの画像を描画バッファDB(DB1又はDB2)に書き戻す(ライトバックする)。この場合の書き戻し処理は、バッファTBの画像を、描画バッファDB(DB1又はDB2)のサイズのポリゴンにテクスチャマッピングし、当該ポリゴンを描画バッファDBに描画することなどで実現できる。
コマンド実行部118が含む音生成部130は、処理部100で行われる種々の処理の結果に基づいて音処理を行い、BGM、効果音、又は音声などのゲーム音を生成し、音出力部192に出力する。
なお、本実施形態の画像生成システムは、1人のプレーヤのみがプレイできるシングルプレーヤモード専用のシステムにしてもよいし、複数のプレーヤがプレイできるマルチプレーヤモードも備えるシステムにしてもよい。また複数のプレーヤがプレイする場合に、これらの複数のプレーヤに提供するゲーム画像やゲーム音を、1つの端末を用いて生成してもよいし、ネットワーク(伝送ライン、通信回線)などで接続された複数の端末(ゲーム機、携帯電話)を用いて分散処理により生成してもよい。
2.本実施形態の手法
2.1 立体視方式
まず、図2、図3を用いて、本実施形態において採用される立体視方式の一例について説明する。
図2の画像生成システム300(例えばゲーム装置)により生成された多眼立体視画像は、表示装置310(例えばハイビジョン対応テレビ)の表示画面に表示される。表示画面には、右目用偏光フィルタと左目用偏光フィルタが走査ライン毎に交互に配列されたフィルム312が貼られている。プレーヤは、これらの偏光フィルタに対応する偏光眼鏡320を掛けて表示画面を見ることで、立体視映像を鑑賞する。
具体的には表示装置310の表示画面には、走査ライン毎に右目用画像と左目用画像とが交互に表示される。プレーヤは、偏光眼鏡320の右目部分322に設けられた偏光フィルタを介して、フィルム312の右目用偏光フィルタにより偏光された各走査ラインの右目用画像を見る。また偏光眼鏡320の左目部分324を介して、フィルム312の左目用偏光フィルタにより偏光された各走査ラインの左目用画像を見る。
図2の立体視方式によれば、プレーヤは、右目用画像及び左目用画像を偏光眼鏡320の右目部分322及び左目部分324を介して同時に見ることができる。従って、右目用画像と左目用画像がフレーム毎に交互に表示される従来の立体視方式に比べて、チラツキが少なく疲れにくい理想的な立体視表示を実現できる。特に3次元ゲーム映像のように、動きの速い映像では、従来の立体視方式では立体感が失われたり、眼の疲労が大きくなるなどの欠点があるが、図2の立体視方式によれば、このような欠点を解消できる。
図3に右目用画像IR、左目用画像IR、多眼立体視画像ISを概念的に示す。図3の多眼立体視画像ISでは、奇数番目の走査ラインには右目用画像IRのピクセル画像が表示され、偶数番目の走査ラインには左目用画像ILのピクセル画像が表示される。プレーヤは、奇数番目の走査ラインのピクセル画像を偏光眼鏡320の右目部分322を介して見ると共に、偶数番目の走査ラインのピクセル画像を左目部分324を介して見ることで、立体感のある映像を楽しむことができる。
図4(A)、図4(B)、図5に、本実施形態の画像生成システムにより生成される右目用画像IR、左目用画像IL、多眼立体視画像ISの一例を示す。これらは3次元レースゲームに本実施形態の手法を適用した場合の画像例である。
図4(A)、図4(B)では、全ての走査ラインについて右目用画像IR、左目用画像ILのピクセル画像が生成されている。例えばフルハイビジョン対応の場合には、1080本の全ての走査ラインについてピクセル画像が生成される。そして図5の多眼立体視画像ISは、これらのフルハイビジョン対応の右目用画像IR、左目用画像ILを合成することで生成される。従って、フルハイビジョンの解像度で立体視ゲーム映像を表示できるため、プレーヤの仮想現実感を飛躍的に向上できる。即ち従来の立体視方式では、立体視画像にすることで、解像度が落ちたり、フレームレートが低下するため、画像品質が低下してしまうという問題があったが、図4(A)〜図5の手法によればこのような問題を解消できる。
2.2 コマンド生成・実行
次に本実施形態のコマンド生成・実行手法について説明する。なお本実施形態のコマンド生成・実行手法を適用できる立体視方式は図2、図3の方式に限定されるものではなく、例えば右目用画像と左目用画像をフレーム毎に交互に表示する立体視方式であっても、本実施形態の手法は適用できる。また以下では、第1の視点画像が右目用画像であり、第2の視点画像が左目用画像である場合を例にとり説明するが、本実施形態はこれに限定されない。例えば第1の視点画像が左目用画像等であり、第2の視点画像が右目用画像等であってもよい。また、以下では、2眼立体視を例にとり説明するが、本実施形態はこれに限定されない。例えばn≧3となるn眼立体視にも本実施形態の手法は適用できる。
図6に示すように本実施形態では、右目用のコマンドバッファCBR、左目用のコマンドバッファCBL、共通のコマンドバッファCBMが別個独立に用意されている。即ち、これまでの画像生成システムに用意されていたメインのコマンドバッファCBMに加えて、コマンドバッファCBR、CBLが追加されている。
コマンド生成部110は、コマンド実行部118に実行させる各処理のうち、右目用、左目用の処理として別個に必要な処理については、右目用のコマンドCR、左目用のコマンドCLを生成(作成)して、コマンドバッファCBR、CBLに書き込む。この場合、コマンド生成にあたって、右目用、左目用に共通に必要な処理(例えばモデル単位でのカリング処理、モーション用行列の計算)については、右目用、左目用の共通な処理として1回だけ行うようにする。これにより、これらの処理を重複して行わなくても済むようになるため、処理負荷を大幅に軽減できる。また右目と左目で内容が同じ処理については、同じコマンドを生成して、コマンドCR、CLとしてコマンドバッファCBR、CBLに書き込む。これにより、コマンドの生成処理や書き込み処理を重複して行わなくても済むようになるため、処理負荷を軽減できる。
またコマンド生成部110は、コマンド実行部118に実行させる各処理のうち、右目用、左目用として別個な処理が必要ではない処理については、共通コマンドCMを生成して、共通のコマンドバッファCBMに書き込む。例えばハードウェア制御コマンドや影生成処理用コマンドなど、右目や左目の視点情報が無くても実行可能なコマンドについては、共通のコマンドバッファCBMに書き込む。これにより、重複したコマンドの作成が不要になるため、処理負荷を軽減できる。
次に図7を用いて、右目用コマンドCR、左目用コマンドCL、共通コマンドCMの具体的な生成、書き込み処理について説明する。
図7では、まずコマンド生成部110は、シェーダ設定コマンドCSSTを生成して、コマンドバッファCBR、CBLの両方に書き込む。なお図7等において、コマンドバッファCBR、CBL、CBMはFIFO構成のバッファになっている。
ここでシェーダ設定コマンドCSSTは、例えばピクセルシェーダや頂点シェーダのプログラムを特定するためのID情報(アドレス情報)を含む。即ち、ハードウェアであるコマンド実行部118(描画プロセッサ)に対して、右目用画像、左目用画像の生成に使用するシェーダ(シェーダプログラム)を指定するための情報を含む。
この場合にシェーダの設定処理は、右目と左目(広義には第1、第2の視点)で同じシェーダを使用するため、右目と左目で内容が同じ処理になる。従ってコマンド生成部110は、同じ内容のシェーダ設定コマンドCSSTを生成して、右目用、左目用のコマンドCR、CLとしてコマンドバッファCBR、CBLに対して例えば同じタイミングで書き込む。
次にコマンド生成部110は、カメラ依存パラメータ(右目用パラメータ)の設定コマンドCCDRを生成して、右目用のコマンドバッファCBRに書き込む。またカメラ依存パラメータ(左目用パラメータ)の設定コマンドCCDLを生成して、左目用のコマンドバッファCBLに書き込む。
ここでカメラ依存パラメータ設定コマンドCCDR、CCDLは、右目用、左目用の仮想カメラの視点位置、視線方向等に依存するパラメータを設定するためのコマンドである。具体的には、例えば前述のシェーダ設定コマンドCSSTで指定されるシェーダに対して、その処理に必要なカメラ依存パラメータを設定するためのコマンドである。
この場合にカメラ依存パラメータ設定処理は、右目と左目(第1、第2の視点)でパラメータの値が異なるため、右目と左目で内容が異なる処理になる。従ってコマンド生成部110は、異なる内容のカメラ依存パラメータの設定コマンドCCDR、CCDLを生成して、右目用、左目用のコマンドCR、CLとしてコマンドバッファCBR、CBLに書き込む。
次にコマンド生成部110は、カメラ非依存パラメータの設定コマンドCCNDを生成して、右目用、左目用のコマンドバッファCBR、CBLの両方に書き込む。
ここでカメラ非依存パラメータ設定コマンドCCNDは、右目用、左目用の仮想カメラの視点位置、視線方向等に依存しないパラメータを、シェーダ設定コマンドCSSTで指定されるシェーダに対して設定するコマンドである。
この場合にカメラ非依存パラメータ設定処理は、右目と左目でパラメータの値が同じになるため、右目と左目で内容が同じ処理になる。従ってコマンド生成部110は、同じ内容のカメラ依存パラメータ設定コマンドCCNDを生成して、右目用、左目用のコマンドCR、CLとしてコマンドバッファCBR、CBLに例えば同じタイミングで書き込む。
次にコマンド生成部110は、シェーダ実行コマンドCSEXを生成して、右目用、左目用のコマンドバッファCBR、CBLの両方に書き込む。
ここでシェーダ実行コマンドCSEXは、シェーダ設定コマンドCSSTで指定されるシェーダに対して、シェーダ処理の実行を指示するコマンドである。
この場合にシェーダの実行を指示する処理は、右目と左目で内容が同じ処理になる。従ってコマンド生成部110は、同じ内容のシェーダ実行コマンドCSEXを生成して、右目用、左目用のコマンドCR、CLとしてコマンドバッファCBR、CBLに例えば同じタイミングで書き込む。
次にコマンド生成部110は、右目用画像と左目用画像の合成コマンドCSYNを生成して、共通のコマンドバッファCBMに書き込む。
ここで合成コマンドCSYNは、右目用画像と左目用画像を合成するためのコマンドであり、例えば後述するように、バッファTBから描画バッファDB(DB1又はDB2)への画像の書き戻しコマンドなどである。
次にコマンド生成部110は、バックバッファとフロントバッファの切り替えコマンドCSWを生成して、共通のコマンドバッファCBMに書き込む。
ここで切り替えコマンドCSWは、例えば第1、第2の描画バッファDB1、DB2の一方のバッファをバックバッファからフロントバッファに切り替え、他方のバッファをフロントバッファからバックバッファに切り替えるためのコマンドである。この切り替え処理は、右目用画像、左目用画像の生成には無関係であり、右目用、左目用コマンドは不要な処理であるため、切り替えコマンドCSWは、共通のコマンドバッファCBMに書き込まれる。
例えば本実施形態の比較例の手法として、右目用、左目用のコマンドバッファCBR、CBLを用意せずに、共通(メイン)のコマンドバッファCBMのみを用いる手法が考えられる。この手法では、まず右目用画像を生成するためのコマンドを生成して、コマンドバッファCBMに書き込む。次に、左目用画像を生成するためのコマンドを生成して、コマンドバッファCBMに書き込む。その後、合成コマンドや切り替えコマンドを生成して、コマンドバッファCBMに書き込む。
しかしながら、この比較例の手法では、例えばカメラ非依存パラメータ設定コマンド等の生成や書き込みが、異なるタイミングで行われる。従って、パラメータの生成処理(例えばモーション用行列のパラメータの生成処理)が、本来は1回だけの処理で済むのに、重複して行われてしまい、処理に無駄が生じる。このため、例えば1フレーム期間内に行う必要がある他の処理を圧迫してしまい、処理が間に合わなくなってしまうという問題が生じる。特に、立体視画像の生成では、右目用画像の描画処理と左目用画像の描画処理を1フレーム期間内に行う必要があり、処理時間に余裕がないため、この問題は深刻となる。
この点、図6、図7の本実施形態の手法によれば、右目用、左目用のコマンドCR、CLの生成処理や書き込み処理が、同じタイミングで行われる。従って、パラメータ(例えばモーション用行列)の生成処理等が重複して行われてしまう事態を防止でき、処理を大幅に効率化できる。従って、1フレーム期間内に行う必要がある処理が間に合わなくなってしまうという問題を解消でき、立体視画像の生成に好適なコマンド生成・書き込み手法を提供できる。
2.3 共通コマンド、カメラ依存パラメータ、カメラ非依存パラメータ
次に図7の共通コマンド、カメラ依存パラメータ、カメラ非依存パラメータの具体例について図8(A)〜図8(C)を用いて説明する。
図8(A)は共通コマンドの例である。影生成処理用コマンドは、例えば影生成処理がハードウェアによりサポートされている場合に、影生成処理用のシェーダやパラメータを設定するためのコマンドである。
このような影生成処理としては、例えばシャドウマップによる影生成処理がある。例えばシャドウマップによる影生成処理では、影生成のシェーダ(シェーダプログラム)の設定コマンドや、影生成のための光源位置や影の色などの影生成処理用のパラメータの設定コマンドが、影生成処理用コマンドになる。そして、このような影生成処理用コマンドは、右目、左目の視点位置に無関係であるため、共通コマンドCMとして共通コマンドバッファCBMに書き込まれる。
図8(A)のハードウェア制御コマンドは、ハードウェアの制御のために共通に使用されるコマンドである。このようなハードウェア制御コマンドとしては、例えばシェーディング方法、カリング(ハードウエア・カリング)方法、αブレンディング、デプステスト、ステンシルテスト等の設定コマンドや、バックバッファとフロントバッファの切り替えコマンドや、描画バッファのクリアコマンドなどがある。
例えばシェーディング方法の設定コマンドでは、グーローシェーディングやフラットシェーディングの指定を行う。カリング方法の設定コマンドでは、ハードウェア(描画プロセッサ)によるカリング(クリッピング)のオン・オフの指定や裏面・表面のカリングの指定などを行う。αブレンディングの設定コマンドでは、αブレンディングのオン・オフの指定やαブレンディングの方法(式)の指定などを行う。デプステストやステンシルテストの設定コマンドでは、デプステスト、ステンシルテストのオン・オフの指定やその設定を行う。バックバッファとフロントバッファの切り替えコマンドは、図7で説明した切り替えコマンドCSWである。描画バッファDBのクリアコマンドは、描画バッファDBに画像を描画する前などに、描画バッファDBの画像をクリアするためのコマンドである。
これらのハードウェア制御コマンドは、右目、左目の視点位置に無関係に、共通の制御コマンドとして使用されるものであるため、共通コマンドCMとして共通コマンドバッファCBMに書き込まれる。
図8(B)のカメラ依存パラメータとしては、ワールドビュー行列のパラメータ、ワールドビュープロジェクション行列のパラメータ、或いはカメラの位置ベクトルなどを想定できる。
ここでワールドビュー行列は、ワールド座標系からカメラ座標系(視点座標系)への変換行列であり、ワールドビュープロジェクション行列はワールド座標系から射影座標系への変換行列である。右目用の仮想カメラと左目用の仮想カメラとでは、その視点位置や視線方向が異なるため、ワールドビュー行列やワールドビュープロジェクション行列のパラメータ(行列要素)も異なる。従って、これらの行列のパラメータを設定するコマンドは、カメラ依存パラメータ設定コマンドとして、右目用と左目用で異なる内容のコマンドが生成されてコマンドバッファCBR、CBLに書き込まれる。
カメラの位置ベクトルは、例えばオブジェクトのサーフェスの鏡面反射処理などを行う場合に使用される。即ちフォンの照明モデル等では、反射ベクトルは、オブジェクトの法線ベクトルとカメラの位置ベクトルにより決定され、この反射ベクトルと光源ベクトルと鏡面反射指数(ハイライト係数)により、スペキュラ光の輝度が求められる。従って、このような処理を行うためにはカメラの位置ベクトルが必要であり、この位置ベクトルは右目用の仮想カメラと左目用の仮想カメラで異なる。従って、このカメラの位置ベクトルの設定コマンドは、カメラ依存パラメータ設定コマンドとして、右目用と左目用で異なる内容のコマンドが生成されてコマンドバッファCBR、CBLに書き込まれる。
図8(C)のカメラ非依存パラメータとしては、ワールド行列のパラメータ、モーション用行列のパラメータ、ライトの位置ベクトル、環境色、スペキュラ色、フォグ色、頂点データ、或いはテクスチャデータなどを想定できる。
ここでワールド行列はローカル座標系(モデル座標系)からワールド座標系(絶対座標系)への変換行列である。このワールド行列は、右目用、左目用の仮想カメラの視点位置や視線方向に無関係である。従って、ワールド行列のパラメータの設定コマンドは、カメラ非依存パラメータ設定コマンドとして、右目用と左目用で同じ内容のコマンドが生成されてコマンドバッファCBR、CBLに書き込まれる。
モーション用行列のパラメータは、例えば、モデルオブジェクトのスケルトンを構成する骨の位置又は回転角度(親の骨に対する子の骨の相対的な方向)等を含むモーションデータに基づいて各フレーム毎に計算される。このモーション用行列のパラメータは、右目、左目の視点に依存しないパラメータであり、このパラメータの生成処理が重複して行われると、処理が無駄になる。この点、本実施形態の手法によれば、モーション用行列のパラメータの計算は、各フレーム毎に1回だけ実行され、それにより得られたパラメータの設定コマンドが、カメラ非依存パラメータ設定コマンドとして、右目用と左目用で同じ内容のコマンドが生成されてコマンドバッファCBR、CBLに書き込まれる。従って、処理負荷を大幅に軽減できる。
ライトの位置ベクトル、環境色、スペキュラ色は、照明モデルを用いたライティング処理に用いられるパラメータである。またフォグ色はフォグの生成処理に用いられるパラメータである。これらのパラメータは、右目用、左目用の仮想カメラの視点位置や視線方向に無関係であるため、カメラ非依存パラメータ設定コマンドとして、右目用と左目用で同じ内容のコマンドが生成されてコマンドバッファCBR、CBLに書き込まれる。
頂点データは、例えば法線、接線、頂点色、テクスチャ座標、頂点座標などである。テクスチャデータは、デカールテクスチャ、法線マップなどである。この頂点データ、テクスチャデータは、右目、左目の視点位置等に無関係であるため、カメラ非依存パラメータ設定コマンドとして、右目用と左目用で同じ内容のコマンドが生成されてコマンドバッファCBR、CBLに書き込まれる。
2.4 コマンドの実行
次に図9(A)、図9(B)、図10を用いて、コマンド実行部118の動作について説明する。
図9(A)に示すようにコマンド実行部118は、右目用のコマンドバッファCBRに書き込まれた右目用のコマンドCSST、CCDR、CCND、CSEX等を、順次読み出して実行する。即ち図7等の手法でコマンド生成部110が生成してコマンドバッファCBRに書き込んだコマンドを実行する。具体的には、コマンドCSSTにより、使用するシェーダを設定し、コマンドCCDRにより右目用のカメラ依存パラメータをシェーダに設定し、コマンドCCNDによりカメラ非依存パラメータをシェーダに設定する。そしてコマンドCSEXによりシェーダの実行を開始する。このようなコマンドCSST、CCDR、CCND、CSEXの実行により、図4(A)に例示されるような右目用画像IRが生成される。
次に図9(B)に示すようにコマンド実行部118は、左目用のコマンドバッファCBLに書き込まれた左目用のコマンドCSST、CCDL、CCND、CSEX等を、順次読み出して実行する。即ち図7等の手法でコマンド生成部110が生成してコマンドバッファCBLに書き込んだコマンドを実行する。具体的には、コマンドCSSTにより、使用するシェーダを設定し、コマンドCCDLにより左目用のカメラ依存パラメータをシェーダに設定し、コマンドCCNDによりカメラ非依存パラメータをシェーダに設定する。そしてコマンドCSEXによりシェーダの実行を開始する。このようなコマンドCSST、CCDL、CCND、CSEXの実行により、図4(B)に例示されるような左目用画像ILが生成される。
このような右目用コマンド、左目用コマンドの実行後に、図10に示すようにコマンド実行部118は、共通のコマンドバッファCBMに書き込まれた共通コマンドCSYN、CSW等を実行する。即ち図7等の手法でコマンド生成部110が生成してコマンドバッファCBMに書き込んだコマンドを実行する。具体的には、図9(A)、図9(B)で生成された右目用画像IR、左目用画像ILを、コマンドCSYNにより合成して、多眼立体視画像ISを生成して、例えば第1の描画バッファDB1(第1、第2の描画バッファの一方のバッファ)に書き込む。そしてコマンドCSWにより、第1の描画バッファDB1をバックバッファからフロントバッファに切り替える。また第2の描画バッファDB2(第1、第2の描画バッファの他方のバッファ)をフロントバッファからバックバッファに切り替える。これにより、表示装置の画面上に、図5に例示されるような多眼立体視画像ISが表示されるようになる。
なおコマンド実行部118は、右目用、左目用コマンドの実行前に、共通のコマンドバッファCBMに書き込まれた共通コマンドを実行するようにしてもよい。この場合に実行される共通コマンドとしては、図8(A)に例示したようなハードウェア制御コマンドや影生成処理用コマンドなどを想定できる。
図9(A)〜図10に示すようなシーケンスでコマンドを実行すれば、コマンド生成部110により同じタイミング(ほぼ同じタイミング)で書き込まれた右目用、左目用のコマンドを、別のタイミングで実行して、右目用画像IR、左目用画像ILを生成することが可能になる。また右目用、左目用コマンドの実行後に、必要なハードウェア制御等を適正に実行できるようになる。
2.5 ジャンプ処理
本実施形態では図9(A)〜図10に示すようなシーケンスのコマンド実行を実現するために、ジャンプコマンドを用意して、コマンドバッファCBR、CBL等に書き込んでいる。
例えば図11に示すようにコマンド生成部110は、右目用(第1の視点用)のコマンドバッファCBRから左目用(第2の視点用)のコマンドバッファCBLに対して、コマンド実行部118の処理をジャンプさせるためのコマンドJPRLを、コマンドバッファCBRに書き込む。具体的には、右目用画像の生成に必要なコマンドCSST、CCDR、CCND、CSEX等を書き込んだ後、最後にジャンプコマンドJPRLをコマンドバッファCBRに書き込む。
またコマンド生成部110は、左目用のコマンドバッファCBLから共通のコマンドバッファCBMに対して、コマンド実行部118の処理をジャンプさせるためのコマンドJPLMを、コマンドバッファCBLに書き込む。具体的には、左目用画像の生成に必要なコマンドCSST、CCDL、CCND、CSEX等を書き込んだ後、最後にジャンプコマンドJPLMをコマンドバッファCBLに書き込む。
図12のようにすれば、コマンド実行部118は、右目用のコマンドCSST、CCDR、CCND、CSEX等をコマンドバッファCBRから読み出して実行した後に、ジャンプコマンドJPRLを実行することで、コマンドバッファCBLの例えば先頭アドレスにジャンプする。そしてコマンドバッファCBLのコマンドの読み出しを開始する。
次にコマンド実行部118は、左目用のコマンドCSST、CCDL、CCND、CSEX等をコマンドバッファCBLから読み出して実行した後に、ジャンプコマンドJPLMを実行することで、コマンドバッファCBMの例えば先頭アドレスにジャンプする。そして、コマンドバッファCBMのコマンドの読み出しを開始する。次に、コマンド実行部118は、コマンドバッファCBMのコマンドCSYN、CSWを実行する。
図11の本実施形態のジャンプ手法によれば、コマンド生成部110がジャンプコマンドJPRL、JPLMを生成してコマンドバッファCBR、CBLに書き込むだけで、図9(A)〜図10で説明したようなシーケンスのコマンド実行を実現できるため、処理の簡素化、効率化を図れる。
なお図12に示すようにコマンド生成部110は、共通のコマンドバッファCBMから右目用のコマンドバッファCBRに対して、コマンド実行部118の処理をジャンプさせるためのコマンドJPMRを、共通コマンドバッファCBMに書き込むようにしてもよい。具体的には、右目用画像、左目画像の生成前に実行する必要がある共通コマンドCHCN、CSHAをコマンドバッファCBMに書き込んだ後に、ジャンプコマンドJPMRをコマンドバッファCBMに書き込む。
このようにすれば、コマンド実行部118は、共通コマンドCHCN、CSHAをコマンドバッファCBMから読み出して実行した後に、ジャンプコマンドJPMRを実行することで、コマンドバッファCBRの例えば先頭アドレスにジャンプする。そしてコマンドバッファCBRのコマンドの読み出しを開始して、コマンドCSST、CCDR、CCND、CSEX等を実行する。
図12の手法によれば、ジャンプコマンドJPMRを生成してコマンドバッファCBMに書き込むだけで、右目用画像、左目用画像の生成前に、ハードウェア制御コマンドなどのコマンドを実行できるようになり、効率的なコマンド実行のシーケンス制御を簡素な処理で実現できる。
2.6 カリング処理
本実施形態では、多眼立体視の右目(第1の視点)と左目(第2の視点)とで共通のカリング処理を行うようにしている。このカリング処理は、いわゆるハードウェアによる裏面ポリゴン等のカリング処理ではなく、その前段階に行うソフトウェアによるオブジェクト(モデルオブジェクト)のカリング処理(削除処理、クリッピング処理)である。
例えば図13において、右目用仮想カメラVCRのビューボリュームVVR内に存在しないオブジェクトは、右目用画像の生成に不要なオブジェクトである。また左目用仮想カメラVCLのビューボリュームVVL内に存在しないオブジェクトは、左目用画像の生成に不要なオブジェクトである。
この場合に比較例の手法として、例えば右目用画像の生成処理の際に、右目用のビューボリュームVVR内に存在し得ないオブジェクトをオブジェクトデータのオブジェクトリストから削除すると共に、左目用画像の生成処理の際に、左目用のビューボリュームVVL内に存在し得ないオブジェクトをオブジェクトリストから削除する手法も考えられる。
しかしながら、この比較例の手法では、ソフトウェアによるオブジェクトのカリング処理を、2回行う必要があり、処理に無駄があった。特に、オブジェクト空間内に配置されるオブジェクトの数が多い場合には、この2回のカリング処理の負荷は非常に重い。従って、比較例の手法を採用すると、1フレームに行う必要がある他の処理を圧迫してしまう。
この点、図13のカリング手法では、多眼立体視の右目と左目とで共通のカリング処理を行っている。具体的には、右目用、左目用に共通のカリング処理用ボリュームARCL(非カリング範囲)を設定する。このカリング処理用ボリュームARCLは、右目用のビューボリュームVVR及び左目用のビューボリュームVVLを内包するものである。そして、共通のカリング処理の際には、このカリング処理用ボリュームARCL内に存在し得ないオブジェクトを削除する。
そしてコマンド生成部110は、このような共通のカリング処理を行うことで取得される頂点データの設定コマンドを、同じ内容の右目用、左目用コマンドとして生成して、コマンドバッファCBR、CBLに書き込む。具体的には、カリング処理用ボリュームARCL内に存在し得ないオブジェクトを削除したオブジェクトリストに基づいて、頂点データを生成する。そして、生成された頂点データを設定するためのコマンドであるカメラ非依存パラメータ設定コマンドCCNDを、図7に示すようにコマンドバッファCBR、CBLに書き込む。
このようにすれば、図13のカリング処理を、右目用、左目用に重複して行う必要がなくなり、1回で済むようになるため、処理負荷を軽減できる。特に、オブジェクト空間に設定されるオブジェクトの数が多い場合には、比較例の手法に比べて大幅に処理負荷を軽減できる。
なお図11のカリング処理用ボリュームARCLとして、例えば右目用、左目用ではない元の仮想カメラのカリング処理用ボリュームを使用してもよい。例えば立体視ではない既存のゲームプログラムが存在する場合には、そのゲームプログラムで使用される元の仮想カメラの視点位置や視線方向等のカメラ情報に基づいて、右目用、左目用の仮想カメラVCR、VCLのカメラ情報を設定する。このようにすれば、これまでのゲームプログラムの資産を有効活用して、立体視のゲームを開発できるため、開発期間を短縮できる。そして、この場合に元のゲームプログラムで使用されていた仮想カメラのカリング処理用ボリュームが、十分に広い範囲をカバーしており、右目用、左目用のビューボリュームVVR、VVLを内包するものである場合には、その元のカリング処理用ボリュームを、右目用、左目用の共通のカリング処理用ボリュームARCLとして使用すればよい。
なお図13のように共通のカリング処理を行う手法では、図6〜図12等で説明したコマンドバッファCBR、CBL、CBMを使用せずにコマンドの生成、実行処理を行うようにしてもよい。
2.7 立体視画像の生成手法
次に、本実施形態の立体視画像の生成手法の一例について説明する。但し、本実施形態の立体視画像の生成手法は以下に説明する手法に限定されるものではない。
図14では、バッファTBに第1、第2の領域AR1、AR2を確保している。そして図4(A)に例示されるような右目用画像IR(広義には第1の視点画像)を生成し、この右目用画像IRを高さ方向(縦方向)において圧縮(縮小)して、バッファTBの第1の領域AR1に書き込む。また図4(B)に例示されるような左目用画像IL(広義には第2の視点画像)を生成し、この左目用画像ILを高さ方向において圧縮して、バッファTBの第2の領域AR2に書き込む。
そして、このバッファTBから画像を読み出すことで、図5に例示されるような多眼立体視画像ISを生成(合成)する。即ち領域AR1の右目用のピクセル画像と領域AR2の左目用のピクセル画像とが、ライン毎(走査ライン毎、ビットマップライン毎)に交互に表示される多眼立体視画像ISを生成する。
具体的には右目用画像IR、左目用画像ILは、幅がWピクセル、高さがHピクセルの画像になっている。フルハイビジョン対応の場合には例えばW=1920、H=1080になる。一方、領域AR1、AR2は、幅がWピクセル、高さがH/2ピクセルの領域になっている。
バッファTBへの画像の書き込み時においては、バッファTBのメモリピッチ(ラインの先頭アドレスから次のラインの先頭アドレスまでのバイト単位の距離)は2Nバイトに設定される。例えば1ピクセル(R、G、B、α)が4バイトである場合には、フルハイビジョン対応では例えば2Nバイト=2×4×2048バイトになる。そして図14では、幅がWピクセル、高さがHピクセルである右目用画像IRが、高さ方向において1/2に圧縮されて、領域AR1に書き込まれ、幅がWピクセルであり高さがHピクセルである左目用画像ILが、高さ方向において1/2に圧縮されて、領域AR2に書き込まれる。
一方、バッファTBからの画像の読み出し時においては、バッファTBのメモリピッチはNバイトに設定される。そしてこのように設定されたバッファTBから右目用画像IR、左目用画像ILを読み出すことで、図5に例示されるような多眼立体視画像ISが合成される。
具体的には、書き込み時に2Nバイトに設定されたメモリピッチ(ピッチサイズ)を、読み出し時にNバイトに設定することで、領域AR1の第1のラインの右目用ピクセル画像が、多眼立体視画像ISの第1のラインに表示され、領域AR2の第1のラインの左目用ピクセル画像が、多眼立体視画像ISの第2のラインに表示されるようになる。また領域AR1の第2のラインの右目用ピクセル画像が、多眼立体視画像ISの第3のラインに表示され、領域AR2の第2のラインの左目用ピクセル画像が、多眼立体視画像ISの第4のラインに表示されるようになる。即ち右目用ピクセル画像と左目用ピクセル画像がライン毎に交互に表示されるようになる。
2.8 描画バッファの利用
レンダリングにより生成された右目用画像IR、左目用画像ILは、直接にバッファTBの領域AR1、AR2に描画してもよいが、図15(A)、図15(B)に示すように、描画バッファDBに描画した後に、領域AR1、AR2にコピーするようにしてもよい。
即ち図15(A)では、右目用画像IRを描画バッファDBに描画し、描画された右目用画像IRを高さ方向において圧縮して、テンポラリバッファ(ワークバッファ)として機能するバッファTBの領域AR1にコピーする。また図15(B)では、左目用画像ILを描画バッファDBに描画し、描画された左目用画像ILを高さ方向において圧縮して、バッファTBの領域AR2にコピーする。
このようにすれば、高さ方向での画像の圧縮(平均化、間引き、縮小)は、描画バッファDBから領域AR1、AR2へのコピー処理の際に行えばよく、画像圧縮と右目用・左目用画像の生成を同時に行わなくても済むため、処理の簡素化、効率化を図れる。
この場合に図15(A)、図15(B)のコピー処理は、例えばテクスチャマッピングを利用して実現できる。
具体的には図16(A)に示すように、描画バッファDBに描画された右目用画像IRを、領域AR1のサイズのポリゴンPL(画面に表示されない仮想的なプリミティブ面)にテクスチャマッピングする。この場合に、テクスチャマッピングは、ポイントサンプリング方式ではなく例えばテクセル補間方式(狭義にはバイリニアフィルタモード)に設定する。そしてこのように右目用画像IRがテクスチャとしてマッピングされたポリゴンPLを領域AR1に描画することで、図15(A)のコピー処理を実現する。
また図16(B)に示すように、描画バッファDBに描画された左目用画像ILを、領域AR2のサイズのポリゴンPLにテクスチャマッピングする。この場合に、テクスチャマッピングはテクセル補間方式に設定する。また高さ方向にテクスチャ座標(UV空間の例えばV座標)を例えば1テクセル分だけシフトしてテクスチャマッピングを行う。そしてこのように左目用画像ILがテクスチャとしてマッピングされたポリゴンPLを領域AR2に描画することで、図15(B)のコピー処理を実現する。
図16(A)、図16(B)のようにテクスチャマッピングによりコピー処理を実現すれば、ポリゴンPLのサイズの設定だけで高さ方向の画像圧縮を実現できるため、処理の簡素化、効率化を図れる。また、後述するような隣り合うラインのピクセル画像の平均化処理を、テクスチャマッピングのテクセル補間方式(バイリニアフィルタ)を利用して実現できるため、更に処理を効率化できる。
なお図15(A)、図15(B)のように右目用画像IR、左目用画像ILが領域AR1、AR2にコピーされた後に、バッファTBの画像は描画バッファDBに書き戻される。具体的にはバッファTBのメモリピッチを2NバイトからNバイトに変更して、バッファTBの画像を描画バッファDBに書き戻し、図5に例示されるような多眼立体視画像ISを生成する。
このようにすれば、描画バッファDBを利用した既存の描画アルゴリズムに対して、テンポラリバッファであるバッファTBやコピー・書き戻しアルゴリズム等を追加するだけで、右目用画像IR、左目用画像ILのテンポラリバッファTBへのコピー処理を実現して、多眼立体視画像ISを生成できるようになる。
なお描画バッファDBへの画像の書き戻し(ライトバック)は、図16(A)、図16(B)と同様にテクスチャマッピングを利用した手法により実現できる。具体的には、バッファTBのピッチサイズを2NバイトからNバイトに変更する。そしてバッファTBの画像(TBの全体の画像)を、描画バッファDB(DB1又はDB2)のサイズのポリゴンにテクスチャマッピングする。そして、バッファTBの画像がテクスチャマッピングされたポリゴンを描画バッファDBに描画することで、バッファTBの画像を描画バッファDBに書き戻す。
2.9 ダブルバッファ方式
描画バッファDBとしてダブルバッファ方式(或いはトリプルバッファ等の複数バッファ方式)を採用する場合には、図17(A)、図17(B)に示す手法を採用することが望ましい。
例えば図17(A)では、描画バッファDBとして、第1、第2の描画バッファDB1、DB2が用意(確保)されている。また図17(A)の期間では、第1の描画バッファDB1がバックバッファ(描画用バッファ)に設定され、第2の描画バッファDB2がフロントバッファ(表示用バッファ)に設定されている。なおトリプルバッファ等の複数バッファ方式では、第1、第2の描画バッファDB1、DB2を含む3個以上の描画バッファを用意(確保)すればよい。
そして図17(A)では、描画バッファDB1(広義には、第1、第2の描画バッファの一方の描画バッファ)からバッファTBに対して、図15(A)、図15(B)で説明した画像のコピー処理が行われる。またバッファTBから描画バッファDB1への画像の書き戻し処理が行われる。これにより、描画バッファDB1には、次のフレームに表示すべき多眼立体視画像ISが生成される。
このように多眼立体視画像ISが描画バッファDB1に生成された後に、図17(B)に示すように、描画バッファDB1をバックバッファからフロントバッファに切り替える(フリップする)。これにより、描画バッファDB1の多眼立体視画像ISが表示装置の画面に表示される。またこの時に、描画バッファDB2(広義には、一方とは異なる他方の描画バッファ)は、フロントバッファからバックバッファに切り替えられる。
そして図17(B)では、描画バッファDB2からバッファTBに対して、図15(A)、図15(B)で説明した画像のコピー処理が行われる。またバッファTBから描画バッファDB2への画像の書き戻し処理が行われる。これにより、描画バッファDB2には、次のフレームに表示すべき多眼立体視画像ISが生成される。
以上の図17(A)、図17(B)の手法によれば、ダブルバッファ方式の既存の描画アルゴリズムに対して、テンポラリバッファであるバッファTBやコピー・書き戻しアルゴリズム等を追加するだけで、ダブルバッファ方式と本実施形態による多眼立体視画像ISの生成手法を両立できるようになる。
なお図14に示すように高さ方向(走査ラインの並ぶ方向)での圧縮処理を行う場合には、隣り合うラインのピクセル画像の平均化処理(補間処理)を行うことが望ましい。
具体的には、右目用画像IR(第1の視点画像)を高さ方向において圧縮して領域AR1に書き込む際に、右目用画像の第i(iは自然数)のラインのピクセル画像と次の第i+1のラインのピクセル画像の平均化処理を行う。同様に、左目用画像IL(第2の視点画像)を高さ方向において圧縮して領域AR2に書き込む際に、左目用画像の第iのラインのピクセル画像と次の第i+1のラインのピクセル画像の平均化処理を行う。
例えば、右目用画像IRの第1、第2、第3、第4のラインのピクセル画像(ライン中の特定ピクセルのRGB画像)をR1、R2、R3、R4とする。この場合には、領域AR1の第1のラインのピクセル画像は、R1とR2の平均化処理により(R1+R2)/2になり、第2のラインのピクセル画像は、R3とR4の平均化処理により(R3+R4)/2になる。右目用画像IRの他のラインや、左目用画像ILについても同様である。
このような平均化処理を行えば、多眼立体視画像において右目用ピクセル画像と左目用ピクセル画像がライン毎に交互に表示される場合にも、例えばハイビジョン等に対応した高精細な解像度を維持した立体視画像の表示が可能になる。また、ジャギーやエイリアシングの発生を低減でき、高品位な立体視画像を生成できる。
なおこのような平均化処理は、図16(A)、図16(B)で説明したように、テクスチャのマッピングモードをテクセル補間方式(バイリニアフィルタモード)に設定して、高さ方向にテクスチャを圧縮したテクスチャマッピングを行うことで、自動的に実行できる。具体的には、右目用画像IR、左目用画像ILを、領域AR1、AR2のサイズのポリゴンにテクセル補間方式でテクスチャマッピングして領域AR1、AR2に描画することで、第iのラインのピクセル画像と第i+1のラインのピクセル画像の平均化処理を実現する。
なお平均化処理を行う場合には、多眼立体視画像ISの第m(mは自然数)のラインについては、右目用画像IR(第1の視点画像)の第j(jは自然数)のラインのピクセル画像と次の第j+1のラインのピクセル画像の平均化を行うことが望ましい。また多眼立体視画像ISの第m+1のラインについては、左目用画像IL(第2の視点画像)の第j+1のラインのピクセル画像と次の第j+2のラインのピクセル画像の平均化を行うことが望ましい。これは図16(B)で説明したテクスチャ座標の1テクセル分のシフトにより実現できる。
このような手法を採用すれば、多眼立体視画像ISにおいて適正な位置に適正な右目用ピクセル画像又は左目用ピクセル画像が表示されるようになるため、ジャギーやアンチエイリアシングを効果的に低減できる。
2.10 詳細な処理例
次に本実施形態の詳細な処理例を図18〜図20のフローチャートを用いて説明する。
まず、右目用(第1の視点用)のコマンドバッファCBR、左目用(第2の視点用)のコマンドバッファCBL、共通のコマンドバッファCBMを記憶部170に確保する(ステップS21)。
次に、各種設定のためのハードウェア制御コマンド(図8(A)参照)を生成して、コマンドバッファCBMに書き込む(ステップS22)。また、必要であれば、影生成処理用コマンドを生成して、コマンドバッファCBMに書き込む(ステップS23)。そして図12で説明したように、コマンドバッファCBRへのジャンプコマンドJPMRを生成して、コマンドバッファCBMに書き込む(ステップS24)。
次に、背景の描画処理を行う(ステップS25)。具体的には、図7で説明したように背景を描画するためのシェーダの設定コマンドCSSTを生成して、コマンドバッファCBR、CBLに書き込む(ステップS26)。次に、図8(B)に示すようなカメラ依存(右目用仮想カメラ)の背景用パラメータをシェーダに設定するコマンドCCDRを生成して、コマンドバッファCBRに書き込む(ステップS27)。また、カメラ依存(左目用仮想カメラ)の背景用パラメータをシェーダに設定するコマンドCCDLを生成して、コマンドバッファCBLに書き込む(ステップS28)。
次に、図8(C)に示すようなカメラ非依存の背景用パラメータをシェーダに設定するコマンドCCNDを生成して、コマンドバッファCBR、CBLに書き込む(ステップS29)。最後に、シェーダを実行するためのコマンドCSEXを生成して、コマンドバッファCBR、CBLに書き込む(ステップS30)。
次に、車(モデルオブジェクト)の描画処理を行う(ステップS31)。具体的には、車を描画するためのシェーダの設定コマンドCSSTを生成して、コマンドバッファCBR、CBLに書き込む(ステップS32)。次に、カメラ依存(右目用仮想カメラ)の車用パラメータをシェーダに設定するコマンドCCDRを生成して、コマンドバッファCBRに書き込む(ステップS33)。またカメラ依存(左目用仮想カメラ)の車用パラメータをシェーダに設定するコマンドCCDLを生成して、コマンドバッファCBLに書き込む(ステップS34)。
次に、カメラ非依存の車用パラメータをシェーダに設定するコマンドCCNDを生成して、コマンドバッファCBR、CBLに書き込む(ステップS35)。最後に、シェーダを実行するためのコマンドCSEXを生成して、コマンドバッファCBR、CBLに書き込む(ステップS36)。
次に、必要であれば、その他の表示物(ZDパネル等)の描画処理を行う(ステップS37)。
次に、図15(A)で説明したように、描画バッファDB(DB1又はDB2)からバッファTBの第1の領域AR1に右目用画像IRをコピーするコマンドを生成して、コマンドバッファCBRに書き込む(ステップS38)。また図15(B)で説明したように、描画バッファDB(DB1又はDB2)からバッファTBの第2の領域AR2に左目用画像ILをコピーするコマンドを生成して、コマンドバッファCBLに書き込む(ステップS39)。
次に、図11で説明したように、コマンドバッファCBLへのジャンプコマンドJPRLを生成して、コマンドバッファCBRに書き込む(ステップS40)。またコマンドバッファCBMへのジャンプコマンドJPLMを生成して、コマンドバッファCBLに書き込む(ステップS41)。
次に、図17(A)、図17(B)で説明したように、バッファTBから描画バッファDB(DB1又はDB2)に画像を書き戻すコマンドを生成して、コマンドバッファCBMに書き込む(ステップS42)。そして、VSYNC(フレーム更新タイミング)をウエイトするコマンドを生成して、コマンドバッファCBMに書き込む(ステップS43)。更に、バックバッファとフロントバッファの切り替えコマンドを生成して、コマンドバッファCBMに書き込む(ステップS44)。最後に、バッファ切り替えをウエイトするコマンドを生成して、コマンドバッファCBMに書き込む(ステップS45)。
3.ハードウェア構成
図21(A)に本実施形態を実現できるハードウェアの構成例を示す。
CPU900(メインプロセッサ)は、複数のCPUコア1、CPUコア2、CPUコア3を含むマルチコアプロセッサである。またCPU900は図示しないキャッシュメモリを含む。CPUコア1、2、3の各々にはベクタ演算器等が設けられている。そしてCPUコア1、2、3の各々は、例えば2つのH/Wスレッド処理をコンテクストスイッチをすることなしに並列実行でき、マルチスレッド機能がハードウェアでサポートされている。そして3つのCPUコア1、2、3の合計で、6つのH/Wスレッド処理を並列実行できる。
GPU910(描画プロセッサ)は、頂点処理やピクセル処理を行って、描画(レンダリング)処理を実現する。具体的には、シェーダプログラムに従って、頂点データの作成・変更やピクセル(フラグメント)の描画色の決定を行う。1フレーム分の画像がVRAM920(フレームバッファ)に書き込まれると、その画像はビデオ出力を介してTVなどのディスプレイに表示される。なおメインメモリ930はCPU900やGPU910のワークメモリとして機能する。またGPU910では、複数の頂点スレッド、複数のピクセルスレッドが並列実行され、描画処理のマルチスレッド機能がハードウェアでサポートされている。またGPU910にはハードウェアのテッセレータも備えられている。またGPU910は、頂点シェーダとピクセルシェーダとがハードウェア的に区別されていないユニファイド・シェーダ・タイプとなっている。
ブリッジ回路940(サウスブリッジ)は、システム内部の情報流通を制御する回路であり、USBコントローラ(シリアルインターフェース)、ネットワークの通信コントローラ、IDEコントローラ、或いはDMAコントローラなどのコントローラを内蔵する。そしてこのブリッジ回路940により、ゲームコントローラ942、メモリーカード944、HDD946、DVDドライブ948との間のインターフェース機能が実現される。
なお本実施形態を実現できるハードウェア構成は図21(A)に限定されず、例えば図21(B)のような構成であってもよい。
図21(B)ではCPU902が、プロセッサエレメントPPと8つのプロセッサエレメントPE1〜PE8を含む。プロセッサエレメントPPは汎用的なプロセッサコアであり、プロセッサエレメントPE1〜PE8は比較的シンプルな構成のプロセッサコアである。そしてプロセッサエレメントPPとプロセッサエレメントPE1〜PE8のアーキテクチャは異なっており、プロセッサエレメントPE1〜PE8は、複数のデータに対して1命令で同じ処理を同時にできるSIMD型のプロセッサコアとなっている。これによりストリーミング処理などのマルチメディア処理を効率的に実行できる。プロセッサエレメントPPは、2つのH/Wスレッド処理を並列実行でき、プロセッサエレメントPE1〜PE8の各々は、1つのH/Wスレッド処理を実行できる。従って、CPU902では、合計で10個のH/Wスレッド処理の並列実行が可能になる。
図21(B)では、GPU912とCPU902の連携が密になっており、GPU912は、CPU902側のメインメモリ930に直接にレンダリング処理を行うことができる。また例えばCPU902がジオメトリ処理を行って、頂点データを転送したり、GPU912からCPU902にデータを戻すことも容易にできる。またCPU902が、レンダリングのプリプロセッシング処理やポストプロセッシング処理を行うことも容易であり、テッセレーション(平面分割)やドットフィルをCPU902が実行できる。例えば抽象度の高い処理はCPU902が行い、抽象度が低い細かな処理はGPU912が行うというような役割分担が可能である。
なお本実施形態の各部の処理をハードウェアとプログラムにより実現する場合には、情報記憶媒体には、ハードウェア(コンピュータ)を本実施形態の各部として機能させるためのプログラムが格納される。より具体的には、上記プログラムが、ハードウェアであるプロセッサ(CPU、GPU)に処理を指示すると共に、必要であればデータを渡す。そして、プロセッサは、その指示と渡されたデータとに基づいて本発明の各部の処理を実現する。
なお、上記のように本実施形態について詳細に説明したが、本発明の新規事項および効果から実体的に逸脱しない多くの変形が可能であることは当業者には容易に理解できるであろう。従って、このような変形例はすべて本発明の範囲に含まれるものとする。例えば、明細書又は図面において、少なくとも一度、より広義または同義な異なる用語(第1の視点画像、第2の視点画像、第1の視点、第2の視点等)と共に記載された用語(右目用画像、左目用画像、右目、左目等)は、明細書又は図面のいかなる箇所においても、その異なる用語に置き換えることができる。
また、コマンドの生成・書き込み処理、コマンドの実行処理、第1、第2の視点画像の描画処理等も、本実施形態で説明したものに限定されず、これらと均等な手法も本発明の範囲に含まれる。また本発明は種々のゲームに適用できる。また本発明は、業務用ゲームシステム、家庭用ゲームシステム、多数のプレーヤが参加する大型アトラクションシステム、シミュレータ、マルチメディア端末、ゲーム画像を生成するシステムボード、携帯電話等の種々の画像生成システムに適用できる。