以下、本願発明の好ましい実施の形態を、添付図面を参照して具体的に説明する。
図1は、本願発明に係るゲームプログラムが適用されるゲーム装置の一例を示すブロック構成図である。ゲーム装置1は、家庭用として用いられるテレビゲーム機であり、ゲームプログラム及びゲームデータが記録されたDVD−ROM(Digital Versatile Disc−ROM)から当該ゲームプログラム及びゲームデータを装置内のメモリ(RAM)に読み込み、CPUによってゲームプログラムを実行させることにより、プレーヤがゲーム内容を楽しむことができるものである。
上記ゲーム装置1は、一例として家庭用のテレビゲーム機とされているが、このゲーム装置1は、家庭用のテレビゲーム機に限らず、携帯型ゲーム機、アーケードゲーム機等の他の種類のゲーム機、又はゲーム機以外の三次元映像を表示する装置、例えばゲームプログラムがローディングされたパーソナルコンピュータ等であってもよい。
ゲーム装置1は、CPU2、描画データ生成プロセッサ3、RAM4、ROM5、描画処理プロセッサ6、VRAM(Video-RAM)7、D/A(Digital-Analog)コンバータ8、音声処理プロセッサ9、アンプ10、インターフェース(I/F)11、DVD−ROMドライブ12及びバス13によって構成されている。
ゲーム装置1には、通常、ゲーム内容を表示するためのテレビジョン装置(図略)が接続される。このテレビジョン装置のブラウン管や液晶ディスプレイ等の表示装置は、D/Aコンバータ8に外部接続されるモニタ14として利用される。上記テレビジョン装置には、内蔵のスピーカが設けられ、この内蔵スピーカは、アンプ10に外部接続されるスピーカ15として利用される。
ゲーム装置1では、ゲームプログラム及びゲームデータが記録されたDVD−ROM17をDVD−ROMドライブ12に装着し、DVD−ROMドライブ12によってDVD−ROM17内のゲームプログラム及びゲームデータをRAM4に読み込み、CPU2によってゲームプログラムを実行することにより、プレーヤがゲーム内容を楽しむことができるようになっている。
ゲームプログラムには、CPU2に実行させるための処理手順や各種命令等が記述されており、その中には、操作コントローラ16からの操作信号に応じてゲーム画面や音声等を制御するための内容が含まれている。本実施形態では、ゲームプログラムには、二次元画像において複数のオブジェクト(例えばゲーム画面に描画される建物やゲーム上に登場するキャラクタ)の影同士が重なった場合に、本願特有のレンダリング処理によって違和感のないより自然な影を表示させるようにするプログラムが含まれる。
また、ゲームデータには、キャラクタや建物の画像データ、ステータス等の情報表示用の画像データ、効果音やBGM等の音声データ、及び文字や記号によるメッセージデータ等が含まれる。
ゲーム装置1には、インターフェース(I/F)11を介して操作コントローラ16が接続され、プレーヤは、この操作コントローラ16の操作部材を操作することによりゲームを進行させることができる。
CPU2、描画データ生成プロセッサ3、RAM4、ROM5、描画処理プロセッサ6、音声処理プロセッサ9、インターフェース(I/F)11及びDVD−ROMドライブ12は、バス13によって相互にデータ伝送可能に接続されている。
CPU2は、上記のように、DVD−ROMドライブ12によってDVD−ROM17からRAM4に読み込まれるゲームプログラムを実行することにより、ゲーム進行を統括的に制御する。より具体的には、CPU2は、操作コントローラ16からプレーヤによる操作信号が入力されると、ゲームプログラムにしたがってその操作信号に対する所定のゲーム進行処理を行う。
CPU2は、例えばモニタ14に表示すべきさん二次元画像の内容を決定し、その内容に対して必要な描画データを描画データ生成プロセッサ3に生成させ、その描画データを描画処理プロセッサ6に転送して描画処理を行わせ、描画処理結果をモニタ14に二次元画像として表示する。また、CPU2は、スピーカ15から出力すべき効果音又はBGM等の音響内容を決定し、音声処理プロセッサ9にその音響内容に対応した音声データを生成させ、その音声データをスピーカ15から出力させる。
描画データ生成プロセッサ3は、描画処理に必要な各種の演算処理を行うものである。CPU2がモニタ14に表示すべき画像を決定し、その画像の描画に必要な画像データ(キャラクタ、背景及び他の物体等(以下、これらのことを「オブジェクト」という。)のポリゴンデータ、テクスチャデータ、及び光源データ等)をRAM4から読み出して描画データ生成プロセッサ3に供給すると、描画データ生成プロセッサ3は、CPU2から供給される画像データと操作情報に基づいて、描画に必要なデータ(透視投影における仮想カメラ、各オブジェクトの位置関係、スクリーン画面上における各オブジェクトを構成するポリゴンの座標、各ポリゴンに対応するテクスチャ、及び各ポリゴンの反射特性等のデータ)を演算し、その演算結果を描画処理プロセッサ6に供給する。描画処理プロセッサ6では、描画データ生成プロセッサ3から供給された演算データに基づいて、モニタ14に表示するための二次元画像の描画処理が行われる。
RAM4は、DVD−ROMドライブ12によってDVD−ROM17から読み込まれたゲームプログラム及びゲームデータを格納するエリア(図示せず)と、CPU2がゲームプログラムを処理するためのワークエリア(図示せず)を提供するものである。RAM4には、ゲームの進行に応じて必要なゲームプログラムとゲームデータとが、DVD−ROM17から読み込まれて記憶される。
ROM5には、ディスクローディング機能等のゲーム装置1の基本的機能や、DVD−ROM17に記憶されたゲームプログラム及びゲームデータを読み出す手順等を示す基本プログラムが記憶されている。CPU2は、DVD−ROMドライブ12にDVD−ROM17が装着されると、ROM5の基本プログラムにしたがってDVD−ROMドライブ12を動作させ、DVD−ROM17からゲームプログラム及びゲームデータをRAM4に読み込み、ゲーム開始状態に設定する。
描画処理プロセッサ6は、二次元画像の各コマの画像(例えば透視投影法による二次元画像)を生成し、モニタ14に表示させるものである。描画処理プロセッサ6は、CPU2からの描画指令に基づき、描画データ生成プロセッサ3から供給されるデータを用いて、所定のレンダリング処理によってモニタ14に表示させる各コマの二次元画像を作成する。
描画処理プロセッサ6には、各コマの二次元画像の作成作業をするためのVRAM7が接続されている。描画処理プロセッサ6は、VRAM7を用いて例えば1/30秒毎に各コマの二次元画像のデータを生成する。
VRAM7には、モニタ14に表示される各コマの二次元画像のデータを格納するバッファメモリ72(以下、「フレームバッファ」という。)と、フレームバッファ72に格納すべき画像データを作成するための前処理を行うバッファメモリ71(以下、「テクスチャバッファ」という。)が設けられている。フレームバッファ72は同一のメモリ構造及びメモリ容量を有する2つのフレームバッファ72A,72Bで構成されている。
VRAM7に2つのフレームバッファ72A,72Bが設けられていることにより、モニタ14への例えば1/30秒毎の各コマの描画処理をスムーズに行うことができる。すなわち、一方のフレームバッファ72Aを用いてモニタ14への表示処理を行っている間に、他方のフレームバッファ72Bで次のコマの画像データを生成し、この処理をフレームバッファ72Aとフレームバッファ72Bとの間で交互に行うことにより、描画処理をスムーズに行う。
VRAM7には、後述するように、ライトマップ、シャドウマップ、Zバッファ、各オブジェクトの描画データ等が記憶される領域が設けられている。
D/Aコンバータ8は、フレームバッファ72から出力される画像データをアナログ信号に変換してモニタ14に出力するものである。D/Aコンバータ8には、フレームバッファ72Aからの画像データとフレームバッファ72Bからの画像データとを切り換えるスイッチ回路が設けられ、このスイッチ回路の切り換えは描画処理プロセッサ6によって制御される。
すなわち、描画処理プロセッサ6は、フレームバッファ72Aをモニタ14のバッファとするときは、フレームバッファ72Aの画像データがモニタ14に出力されるようにスイッチ回路を切り換え、フレームバッファ72Bをモニタ14のバッファとするときは、フレームバッファ72Bの画像データがモニタ14に出力されるようにスイッチ回路を切り換える。
音声処理プロセッサ9は、CPU2からの音声指令に基づき、RAM4から効果音又はBGM等の音声データを読み出し、所要の加工処理とD/A変換処理をした後、アンプ10に出力する。アンプ10は、音声処理プロセッサ9から入力される音声信号を所定の増幅度で増幅した後、スピーカ15に出力する。
インターフェース(I/F)11は、操作コントローラ16をゲーム装置1に接続するためのインターフェースである。操作コントローラ16は、ゲーム装置1に各種の操作情報を入力するものである。操作コントローラ16には、十字キー、左ボタン、右ボタン、セレクトボタン、スタートボタン、ジョイステック等の複数の操作部材(いずれも図示せず)が設けられている。
スタートボタンはゲーム開始を入力するためのボタンであり、セレクトボタンはメニュー内容を選択するためのボタンである。また、ジョイステックや十字キーは、主としてキャラクタに移動、攻撃及び防御等の種々の動作を指令するための操作部材として使用される。左ボタン及び右ボタンは、例えば仮想カメラの視線方向を左方向や右方向に移動又は回転したりするのに使用される。
本実施形態に係るゲームプログラムは、上述したように、二次元画像において複数のオブジェクト(例えばキャラクタや建物)の影同士が重なった場合に、本願特有のレンダリング処理によって違和感のないより自然な影を表示させるようにしたものである。以下、詳述する。
次に、本実施形態に係るレンダリング処理について説明する。図2は、レンダリング処理の概略手順を示したフローチャートである。このフローチャートに示すレンダリング処理は、主として描画処理プロセッサ6によって行われる。レンダリング処理は、図2に示すように、オブジェクト描画処理(S1)、オーバーラップ処理(S2)、及び効果付加処理(S3)等によって構成されている。オーバーラップ処理(S2)は、キャスト処理(S4)及びレシーブ処理(S5)等によって構成されている。
オブジェクト描画処理(S1)は、通常、複数の三角形であるポリゴンによって構成されているオブジェクトについて、フレームバッファ72に二次元画像を生成する処理である。本実施形態のオブジェクト描画処理では、最初に建物等の不透明なオブジェクトを対象とする描画処理が行われる。その後、グラス内の水のような半透明のオブジェクトの描画処理が行われるが、半透明のオブジェクトの描画処理については本願発明と関係のない一般的な処理であるので説明を省略する。以下に説明するオブジェクト描画処理は、不透明なオブジェクトについてのものである。
オブジェクト描画処理(S1)では、透視投影及び隠面消去が行われる。透視投影とは、三次元の仮想空間を二次元のモニタ画面に表示するために行われる処理をいう。具体的には、図3に示すように、例えば三次元の仮想空間内(xyz座標内で表される空間内)の所定位置にカメラ(図略)に相当する視点Vをおき、この視点VとオブジェクトOとの間に投影面としてのスクリーンSを仮想的に配置する。通常、三角形のポリゴンによって構成されるオブジェクトOの各点から視点Vに向かって投射線LAを生成すると、スクリーンS上に投射線LAとの交点の集まりとして、投影図としてのオブジェクトO’が形成される。このようにして、オブジェクトOがスクリーンSにオブジェクトO’として透視投影される。
また、隠面消去とは、オブジェクトにおいて手前に存在する面によって隠されて見えない面の一部の領域を消去することをいい、本実施形態では、「Zバッファ法」と呼称される方法が用いられて隠面消去が行われる。
Zバッファ法は、スクリーン画面に相当するフレームバッファ72の画素ごとに、対象となるオブジェクト同士の奥行き(z軸)方向における距離を比較することにより隠面消去を行う公知の方法である。Zバッファ法では、フレームバッファ72と同じ解像度を有し、視点からの奥行きを数値化したもの(以下、「Z値」という。)をフレームバッファ72の画素ごとに記憶するZバッファ(図示せず)が用いられる。このZバッファは、VRAM7に設けられる。
なお、本実施形態においては、Zバッファ法を採用しているが、これに代えて、遠くにあるオブジェクトから順にフレームバッファ72に上書きしていく、公知の「Zソート法」が用いられて隠面消去が行われてもよい。
オブジェクト描画処理では、複数のオブジェクトについてそれぞれ処理を行う順番が決定され、この処理の順番にしたがって一つのオブジェクトごとに処理が行われる。この処理の順番は、Zバッファ法では任意に決定される。
まず、最初のオブジェクトが描画される前工程として、フレームバッファ72の全画素の値が例えば背景色の値に設定されることによりフレームバッファ72の全画素が初期化される。次いで、Zバッファの全画素の値が最遠方(例えば無限大)の値に設定されることにより、Zバッファの全画素が初期化される。
次に、順番が最初のオブジェクト(以下、「オブジェクトO1」という。)について透視投影及び走査変換を行う。なお、走査変換とは、オブジェクトを構成するポリゴンの各辺とスクリーンS上を走査される所定のスキャンラインとの交点を取得して、ポリゴンに含まれる画素を決定するための処理である。すなわち、2つの交点間にあるスキャンライン上の画素がポリゴン内部の画素とされる。
その後、オブジェクトO1(ポリゴン)の一の画素についての、三次元の仮想空間内の所定位置に設置される仮想的なカメラ(図略)との距離の値(以下、「Zo値」という。)が算出される。次いで、このZo値と、当該画素に対応するZバッファの画素のZ値とが比較される。
この比較結果がZ>Zoである場合、すなわち、オブジェクトO1の一の画素についての距離がZバッファの画素の現在のZ値よりカメラ側にある場合、Zバッファの画素のZ値をZo値に更新するとともに、オブジェクトO1の当該画素における輝度値(以下、「輝度値K」という。)を例えばVRAM7から読み出してフレームバッファ72に格納する。この輝度値Kの設定においては、テクスチャマッピング等の作業も同時に行われる。
一方、上記比較結果がZ<Zoである場合、Zバッファの画素のZ値はそのままとされ、その画素には当該ポリゴンは描かれない。Zバッファ法では、全てのオブジェクトについて上述の処理が行われ、フレームバッファ72上に全てのオブジェクトについての二次元画像が生成される。
このオブジェクト描画処理では、例えば山や空あるいは建物等といった背景等の動かないオブジェクト(以下、「静的オブジェクト」という。)がオブジェクトの一つとして扱われ、上記レンダリング処理が行われる。また、静的オブジェクトの他に、ゲーム空間上に登場し、動作するキャラクタ等のオブジェクト(以下、「動的オブジェクト」という。)もオブジェクトの一つとして扱われ、上記レンダリング処理が行われる。
次いで、シェーディング(陰影)処理が行われ、シェーディング処理後のデータがフレームバッファ72に格納される。シェーディング処理では、例えば予めVRAM7に記憶されたライトマップが用いられる。ここで、ライトマップとは、スクリーン画面に描写される静的な陰影を表す輝度情報(例えば輝度値)が予め演算によって求められてテクスチャ化されたものである。ライトマップは、例えばゲームにおいてゲームステージ毎に生成される。このライトマップは、独自の座標系を有しており(以下、この座標を「UV座標」という)、このUV座標によって輝度情報が格納された位置の特定が可能になっている。
シェーディング処理では、ライトマップを参照して、処理対象となっている画素に対して、UV座標の輝度情報が取得される。この取得された輝度情報を上記算出された輝度値Kに乗算し又は加算して輝度値K’を算出することにより、画素ごとの輝度値が補正される。これにより、光が当たっている部分は比較的明るく、陰になる部分は比較的暗くなるよう描画され、立体感のあるリアルなスクリーン画像が得られる。
また、ライトマップを構成する輝度情報には、静的オブジェクトがライトによって照射されることにより生じる影(以下「静的シャドウ」という。)の輝度情報が含まれているので、シェーディング処理の実行によって静的シャドウも描画される。
フレームバッファ72の画素ごとに格納されていたRGBの輝度値は、対応する画素においてシェーディング処理によって算出された輝度値K’に更新される。オブジェクトO 1 の全ての画素について上記処理が終了すれば、次のオブジェクトO2について同様の処理を実行し、以降、全てのオブジェクト(O1,O2,…,On、nはオブジェクト数)について同様の処理を行う。
オーバーラップ処理(S2)は、オブジェクト描画処理(S1)においてフレームバッファ72に書き込まれた画像(スクリーン画像)に重ねるように、他の画像であるオーバーラップ画像をブレンディング、すなわち合成する処理である。
オーバーラップ画像としては、動的オブジェクトがライトによって照射されることにより生じる影(以下、「動的シャドウ」という。)等がある。この動的シャドウの合成処理に関するオーバーラップ処理については後述する。また、動的シャドウ以外の他のオーバーラップ画像のオーバーラップ処理については、本実施形態と直接的な関連がないのでここでは省略する。
効果付加処理(S3)は、例えばエフェクト処理、フィルタ処理及びスクリーン処理等によって構成されている。エフェクト処理は、パーティクル(例えば爆風や火花等の粒子状のもの)をフレームバッファ72に書き込むための処理である。フィルタ処理は、例えば「もや」を表現する場合等のように、フレームバッファ72に書き込まれている画像データ全体について所定の補正を行うための処理である。これらの処理により、スクリーン画像に描画される映像がよりリアルになり、スクリーン画像に臨場感を持たせることができる。スクリーン処理は、ゲージ等(例えば体力ゲージ等)の、プレーヤから見て一番手前に表示される二次元画像をフレームバッファ72に書き込む処理である。
次に、上記オーバーラップ処理(S2)について詳細に説明する。オーバーラップ処理は、図2に示したように、例えばキャスト処理(S4)とレシーブ処理(S5)とによって構成される。なお、本実施形態のキャスト処理及びレシーブ処理は、静的オブジェクトに動的シャドウを合成する処理であって、その他の動的シャドウの合成処理(例えば、動的オブジェクトに動的シャドウを描画するセルフシャドウの処理)等は、オーバーラップ処理における別の処理で実行される。
キャスト処理(S4)では、動的オブジェクトの動的シャドウを描画するために必要なシャドウマップが生成される。レシーブ処理(S5)では、フレームバッファ72の画素ごとに動的シャドウを描画するか否かを判別する処理が行われ、その判別処理による判別結果に基づいて動的シャドウのスクリーン画像への描画が行われる。
ここで、スクリーン画像に影を描画するための公知手法である「シャドウマップ技法(三次元の画像空間においてZバッファ法を用いて影となる画素を決定する方法)」を用いた一般的に行われる影の描写方法について説明する。
まず、シャドウマップとは、上記シャドウマップ技法に汎用的に用いられるものであり、光源(以下、「ライト」という)の位置を視点としライトから可視点までの距離を画素ごとに取得してデータ化したものである。ここでいう可視点とは、ライトを視点とした場合に、ライト側から見える点のことである。
シャドウマップの生成においては、Zバッファ法を用いてライトの位置を視点としてライトから可視面までの距離、換言すればライトから当該ライトの光が当たっている部分(例えばオブジェクトや地面)までの距離がZ値(以下、「深度値D2」という。)として画素ごとに取得される。なお、シャドウマップは、ライトが複数ある場合、ライトごとにそれぞれ生成される。
例えば図4に示すように、地面EにオブジェクトOが配置されている場合において、三次元の仮想空間上に設定されているライトLからオブジェクトOに対して照射が行われているとする。このような場合、シャドウマップSMの画素smaにおいては、照射方向上にオブジェクトOのOa点及び地面EのEa点が存在するが、Zバッファ法によってライトLからの距離が最も短いOa点が特定され、ライトLからOa点までの距離が深度値D2として格納される。
また、例えば図4に示す地面EのEb点について考察すると、Eb点は画素smbの照射方向上においてライトLからの距離が最も短い(ライトLからの光が直接当たっている部分である。)。したがって、画素smbには、ライトLからEb点までの距離の値が深度値D2として格納される。
このようにして、シャドウマップSMの各画素には、ライトLからの光が到達する部分までの距離である深度値D2がそれぞれ格納され、これによりシャドウマップSMが生成される。
次に、カメラ視点から見た際のスクリーン画像の各画素における影の有無の判別について説明する。この判別は、スクリーン画像の各画素に描画されるオブジェクトのライトからの距離(以下、「深度値D1」と言う。)と、これに対応するシャドウマップSMに格納されている深度値D2とを比較することによって行われる。深度値D1が深度値D2よりも大きい場合(ライトから光が届く距離よりも遠い場合)、その画素には影が含まれると判定される。
例えば、図4に示すスクリーン画像の一の画素に描画される地面EのEa点に着目すれば、所定の演算により算出した、ライトLからEa点までの距離(深度値D1)と、これに対応するシャドウマップSMに格納されている、ライトLからオブジェクトOのOa点までの距離(深度値D2)とが比較される。地面EのEa点に対応するフレームバッファ72の画素の深度値D1が「30」であり、シャドウマップSMに格納されている当該画素に対応する深度値D2が「20」であるとすると、当該画素には影があると判別される。
一方、深度値D1が深度値D2よりも小さい又は等しい場合、その画素には影が含まれないと判定される。同様にして、フレームバッファ72の全ての画素について影の有無を判別し各画素について描画を行うことにより、影が生成されたスクリーン画像がフレームバッファ72に描画される。
図5は、フレームバッファ72に格納される、図4に示すスクリーン画像のイメージ図であり、オブジェクトOの影が生成されていない状態を示す。また、図6は、図5に示すスクリーン画像に対して影を生成した場合の状態を示す図である。
本実施形態では、上述したシャドウマップ技法を用いて、キャスト処理(S4)において動的シャドウを描画するためのシャドウマップがライト毎に生成され、レシーブ処理(S5)において当該動的シャドウのスクリーン画像への描画が行われる。したがって、本実施形態のキャスト処理(S4)では、シャドウマップが生成される対象は、動的オブジェクトのみに限定されている。そのため、「静的シャドウ」の描画対象となる建物等のオブジェクトに対する深度値は、シャドウマップには格納されないことになっている。動的シャドウを生成の対象とするか否かの判別には、例えばオブジェクト毎に設定されている情報(例えばフラグ等を用いて予め設定された情報)が用いられる。また、シャドウマップの一の画素のライトの照射方向上に動的オブジェクトが存在しない場合、その画素の深度値D2の更新は行わない。シャドウマップの各画素には初期値としてライトから最遠の値が格納されているので、更新を行わない場合は初期値が深度値D2となる。なお、本実施形態のシャドウマップはVRAM7に記憶される。
図7は、図2に示したレシーブ処理(S5)を示すフローチャートである。レシーブ処理は、フレームバッファ72に描画されたスクリーン画像に対して動的オブジェクトの動的シャドウがブレンディング(合成)される処理である。
まず、複数のライトLがある場合、複数のライトLのうち一つのライトLが選択される(S11)。次いで、フレームバッファ72のうちの一の画素が選択され(S12)、その後、描画ピクセル処理が行われる(S13)。描画ピクセル処理は、フレームバッファ72の一の画素に描画される静的オブジェクトに重ねて動的シャドウを描画するか否かを判別するとともに、動的シャドウを描画する場合に、動的シャドウのRGBの輝度値及び混合率α(0≦α≦1)をそれぞれ決定する処理である。動的シャドウのRGBの輝度値及び混合率αは、例えばVRAM7に設けられた動的シャドウ用のバッファに格納される。なお、この描画ピクセル処理については後述する。
次いで、フレームバッファ72の全ての画素について描画ピクセル処理を行ったか否かの判別が行われる(S14)。全ての画素について描画ピクセル処理が行なわれていない場合(S14:NO)、ステップS12に戻る。
全ての画素について描画ピクセル処理が行われている場合(S14:YES)、全てのライトLについて全画素の描画ピクセル処理が行われたか否かの判別が行われる(S15)。全てのライトLについて全画素の描画ピクセル処理が行われていない場合(S15:NO)、ステップS11に戻る。
全てのライトLについて全画素の描画ピクセル処理が行われ(S15:YES)、動的シャドウが描画される場合、VRAM7に設けられたバッファから輝度値及び混合率αを読み出し、フレームバッファ72の画素毎に動的シャドウをブレンディングする処理、すなわち動的シャドウの描画処理を行う(S16)。
次に、図7のステップS13に示す描画ピクセル処理について、図8に示すフローチャートを参照して説明する。描画ピクセル処理は、上述したように、フレームバッファ72の一の画素に描画される静的オブジェクトに重ねて動的シャドウを描画するか否かを判別するとともに、動的シャドウを描画する場合に、動的シャドウのRGBの輝度値及び混合率αを設定する処理である。
まず、図7のステップS12において選択されたフレームバッファ72の一つの画素に描画されるオブジェクトの深度値D1が所定の演算により取得されるとともに、この画素に対応する動的オブジェクトの深度値D2がVRAM7のシャドウマップから読み出される(S21)。例えば、図9に示すように、動的オブジェクトとしてのキャラクタCにおいて動的シャドウCSが生成される場合、フレームバッファ72の一つの画素であるf1点に注目し、この点における静的オブジェクト(この場合は地面)の深度値D1が所定の演算により取得される。ここで、深度値D1は、上述したように、ライトLから当該画素(f1点)に描画される静的オブジェクトまでの距離である。そして、シャドウマップからこのf1点に対応する動的オブジェクト(キャラクタC)の深度値D2が読み出される。
ステップS21において深度値D1が演算により算出され、深度値D2がVRAM7から読み出されると、選択された一の画素に対して動的シャドウを描画するか否かが判別される(S22)。具体的には、ステップS21で取得した、処理対象である画素の深度値D1が深度値D2よりも大きいか否かによって、当該画素に動的シャドウを描画するか否かが判別される。
深度値D1が深度値D2以下と判別された場合(S22:NO)、選択された一の画素に対して動的シャドウを描画しないと判別される。この場合、動的シャドウのRGBの輝度値の設定が行われずに処理が終了する。このとき、動的シャドウ用のバッファは、更新されないので、初期値(例えば、RGB値に透明色を示す0の値とα値に0の値)のままとなる。
一方、ステップS22において、深度値D1が深度値D2より大きいと判別された場合(S22:YES)、選択された一の画素に対して動的シャドウを描画すると判別される。
選択された一の画素に対して動的シャドウを描画する場合、当該画素において、静的シャドウの輝度データに基づいて静的シャドウが存在するか否か(静的シャドウが描画されているか否か)が判別される。本実施形態では、ライトマップの輝度データを用いて静的シャドウが描画されているか否かを判別するが、上述したライトマップには、処理対象の画素に静的シャドウが描画されているか否かの情報が含まれていないので、以下に示す処理(ステップS23,S24)によって静的シャドウが描画されているか否かの判別が行われる。
すなわち、ステップS23において、動的シャドウの動的シャドウカラーと、静的シャドウが描画された静的オブジェクトのテクスチャカラーとが取得される。ここで、動的シャドウカラーとは、動的シャドウについて予め設定されているRGBの輝度値をいう(以下、「動的シャドウカラーDS」と言う。)。動的シャドウカラーDSは、動的シャドウの基本の輝度値(固定値)であり、静的シャドウと重なっていない状態では常にこの値を用いる。動的シャドウカラーDSは、VRAM7等に予め記憶されており、必要に応じて読み出される。なお、本実施形態の動的シャドウカラーDSは、単一の固定値であるが、例えばゲームステージ毎に切り替えて使用するように複数あってもよく、また単一の標準値を記憶しておいてゲームステージ毎に標準値を増減するようにして用いてもよい。
また、テクスチャカラーとは、選択された一の画素に描画される静的オブジェクトに関するRGBの輝度値をいう(以下、「テクスチャカラーSS」と言う。)。このテクスチャカラーSSは、静的シャドウの輝度情報が反映されている情報から取得する。本実施形態では、テクスチャカラーSSは、静的シャドウの輝度情報も含まれている、上述したシェーディング処理に用いられるライトマップから読み出され取得される。具体的には、ライトマップに格納されている、上記選択された一の画素に対応するUV座標位置の輝度値が読み出されて用いられる。なお、テクスチャカラーSSには、静的オブジェクトとともに静的シャドウが既に描画されているフレームバッファ72の輝度値が用いられてもよい。
次いで、ステップS24において、動的シャドウカラーDSとテクスチャカラーSSとの合計値が、所定の閾値よりも大きいか否かが判別される。換言すれば、動的シャドウカラーDSとテクスチャカラーSSとの重なり部分が所定のカラーより黒いか否か(暗いか否か)が判別される。すなわち、図10に示すように、動的シャドウ(図10のCS参照)が静的シャドウ(図10のBS参照)に重なっていて、動的シャドウCSをスクリーン画像に馴染ませる処理を行うべきであるか否かが判別される。
動的シャドウカラーDSとテクスチャカラーSSとの合計値が閾値を超えるような場合には、処理対象の画素のテクスチャカラーSSには静的シャドウの輝度値が含まれて比較的大きい輝度値が格納されていたとされ、動的シャドウを馴染ませる処理を行うようにされる。
より具体的には、ステップS24では、「DS×b+SS+A>閾値」といった判別式が用いられて判別される。ここで「b」及び「A」は、スクリーン画像に描画するゲームの各場面(例えばステージ)や三次元空間の所定の場所等の環境に応じて予め定められた補正値である。特に「b」は、動的シャドウカラーDSを調整するものであり、「A」は閾値を直接的に調整するものである。上記判別式において左辺の「DS×b+SS+A」は、一種の評価関数であるので、式中の「b」の値及び「A」の値をそれぞれ変更することによって、閾値を調整することができる。これによって、動的シャドウを静的シャドウに完全に馴染ませずに、動的シャドウと静的シャドウとを二重にして描画させておきたい場合等、各場面の状況に応じた動的シャドウの描画を行うことができる。
なお、上記判別式「DS×b+SS+A>閾値」に代えて「DS+SS>閾値」といった判別式が用いられてもよい。さらに、「SS>閾値」といった判別式が用いられてもよい。また、ステップS24の処理では、「DS×b+SS+A>閾値」の判別において動的シャドウカラーDS及びテクスチャカラーSSとしてRGBのうちRだけの値を用いればよいが、これに限らず、R,G,Bの全ての値を考慮して用いるようにしてもよく、あるいはGだけ又はBだけを用いるようにしてもよい。
ステップS24において、動的シャドウカラーDSとテクスチャカラーSSとの合計値が閾値よりも大きいと判別した場合(S24:YES)、すなわち、動的シャドウカラーDSとテクスチャカラーSSとの重なり部分が所定のカラーより黒く、動的シャドウを馴染ませると判別した場合、動的シャドウのRGBの輝度値として、動的シャドウカラーDSとテクスチャカラーSSとの差分の値が設定される(S25)。
具体的には、動的シャドウのRGBの輝度値として、設定式「DS×b−SS+A」で表される評価関数で算出される値が用いられる。この設定式においても式中の「b」及び「A」の値を変更することにより、各場面の状況に応じて動的シャドウと静的シャドウとの重なり具合を微調整することができる。
例えば、「b」及び「A」の値を変更することによって、静的シャドウに重なる動的シャドウをプレーヤが認識できないように透明色で描画させたり、プレーヤが認識できる程度にうっすらと描画させたりすることができる。本実施形態では、スクリーン画像に描画するゲームの各場面や三次元空間の所定の場所等の環境に応じて予め定められた値が「b」及び「A」に設定されるので、動的シャドウと静的シャドウとの重なり部分を自然な描写になるよう表現することができる。
なお、本実施形態においては、ステップS25において用いられる設定式中の「b」及び「A」は、ステップS24において用いられる判別式中の「b」及び「A」と同じ値に設定しているが、例えば「b」に代えて「b」と異なる「a」、「A」に代えて「A」と異なる「B」といった値がそれぞれ設定されてもよい。
また、上記設定式「DS×a−SS+A」に代えて、動的シャドウのRGBの輝度値として、設定式「DS−SS」が用いられてもよい。この場合であっても、動的シャドウカラーDS及び静的シャドウカラーSSがそれぞれ等しいときであれば、差分の値は「0」となって静的シャドウのみが描画される状態となるので、動的シャドウと静的シャドウとが重なっている画素の領域が不自然に濃くなることがない。また、動的シャドウカラーDS及びテクスチャカラーSSが異なる値であっても、静的シャドウに動的シャドウが重なる画素の領域の輝度値と、重ならない画素の領域の輝度値とがほぼ同等の輝度値になるので、重なっている画素の領域だけが不自然に濃く描画されることがない。
その後、図8には示していないが、動的シャドウの混合率αを決定するフィルタリング処理が行われ、動的シャドウのRGBの輝度値と混合率αとが動的シャドウ用のバッファ(VRAM7)に格納される。フィルタリング処理には、動的シャドウの境界部分がいわゆるジャギー(例えばギザギザの縁)にならないように滑らかにするためのものであり、例えば公知の近方比率フィルタリング(PCF:percentage-closer filtering)が用いられる。これによって、動的シャドウの境界部分を滑らかに表現することができる。動的シャドウ用のバッファは、フレームバッファ72と同様の構成である。動的シャドウの輝度値及び混合率αは、フレームバッファ72の選択された画素に対応する動的シャドウ用のバッファの領域に格納される。
一方、ステップS24において、動的シャドウカラーDSとテクスチャカラーSSとの合計値が閾値よりも小さいと判別した場合(S24:NO)、すなわち、動的シャドウカラーDSとテクスチャカラーSSとの重なり部分が所定のカラーより明るく、動的シャドウを馴染ませないと判別した場合、動的シャドウのRGBの輝度値として、動的シャドウカラーDSを設定する(S26)。その後、上述のフィルタリング処理を行って混合率αが決定された後、動的シャドウの輝度値と混合率αとが動的シャドウ用のバッファ(VRAM7)に格納される。
本実施形態では、フレームバッファ72に描画される全ての動的シャドウに対して図8のフローチャートの描画ピクセル処理に示した動的シャドウを馴染ませる処理を行っているが、例えばカメラ(図略)の位置から動的シャドウまでの距離(Z値)が比較的遠い動的シャドウに対しては、上記馴染ませる処理を行わずに描画するようにしてもよい。カメラの位置から遠い動的シャドウはスクリーン画面上に大きく表示されることは比較的少ないので、プレーヤには特に不自然さを感じさせることなく、また、ゲーム装置の処理負荷を軽減することができるといった利点がある。
具体的には、図8に示すステップS22とステップS23との間に、画素に描画されるオブジェクトのカメラ位置からの距離(Z値)が所定値以上であるか否かを判別する処理を加え、距離が所定値以上であると判別した場合には、動的シャドウカラーDSをそのまま動的シャドウのRGBの輝度値として設定するようにする。一方、所定値未満の場合は、ステップS23〜S26の処理を実行するようにする。
もちろん、この発明の範囲は上述した実施の形態に限定されるものではない。例えば、上記実施形態で述べたゲームの内容は、対戦型ゲーム、アクションゲーム又はロールプレーイングゲーム等の種々のゲームに適用することができる。また、本実施形態に記載のゲームは、オンラインゲームに適用するようにしてもよく、オンラインゲームに参加したプレーヤ同士で対戦する、あるいは複数のプレーヤとチームを組んで他のチームと対戦するといったゲームに適用するようにしてもよい。