(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B1)
(11)【特許番号】
(24)【登録日】2025-06-17
(45)【発行日】2025-06-25
(54)【発明の名称】画像処理プログラム、情報処理システム、情報処理装置、および、画像処理方法
(51)【国際特許分類】
G06T 15/60 20060101AFI20250618BHJP
【FI】
G06T15/60
(21)【出願番号】P 2024011042
(22)【出願日】2024-01-29
【審査請求日】2024-10-29
(73)【特許権者】
【識別番号】000233778
【氏名又は名称】任天堂株式会社
(74)【代理人】
【識別番号】100158780
【氏名又は名称】寺本 亮
(74)【代理人】
【識別番号】100121359
【氏名又は名称】小沢 昌弘
(74)【代理人】
【識別番号】100130269
【氏名又は名称】石原 盛規
(72)【発明者】
【氏名】藤澤 保仁
(72)【発明者】
【氏名】宮北 大樹
【審査官】鈴木 明
(56)【参考文献】
【文献】特開2019-144739(JP,A)
【文献】特開2023-127837(JP,A)
【文献】特開2023-153534(JP,A)
【文献】特開2023-178519(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06T 15/60
(57)【特許請求の範囲】
【請求項1】
情報処置装置のコンピュータに、
仮想空間内のオブジェクトについて、デプスバッファを用いてデプステストを行いながらフレームバッファまたはGバッファへ描画を行わせ、
前記オブジェクトのうち第1の種類の複数のオブジェクトについて、オブジェクト毎に、
前記仮想空間の一部であって、当該第1の種類のオブジェクトを内包する部分空間を設定させ、
前記部分空間に対する仮想光源を設定させて、当該仮想光源に基づいた前記部分空間における前記第1の種類のオブジェクトのシャドウマップである部分シャドウマップを生成させ、
前記部分空間の範囲内に対応する画素に関して、前記デプスバッファのデプスと前記部分シャドウマップのデプスに基づいて、前記第1の種類のオブジェクトの影の濃さを画素毎に決定させ、当該画素の影の濃さが、影の濃さを記憶する影バッファに記憶されている値より濃い影の値の場合に、当該影バッファに上書きして記憶させ、
前記フレームバッファと前記影バッファとに基づいて前記フレームバッファの画像に影を描画させる、または、前記Gバッファと前記影バッファとに基づいて影の付いた画像をフレームバッファに描画させる、画像処理プログラム。
【請求項2】
前記コンピュータに、
前記部分空間の範囲内に対応する画素毎の影の濃さを、前記デプスバッファのデプスと前記部分シャドウマップのデプスとを用いた分散シャドウマップの手法に基づいて、決定させる、請求項1記載の画像処理プログラム。
【請求項3】
前記第1の種類のオブジェクトは、平たい形状のオブジェクトである、請求項2記載の画像処理プログラム。
【請求項4】
前記仮想光源は、平行光源であって、
前記部分空間は、前記平行光源の光の方向に沿った辺を有する直方体形状である、請求項1記載の画像処理プログラム。
【請求項5】
仮想空間内のオブジェクトについて、デプスバッファを用いてデプステストを行いながらフレームバッファまたはGバッファへ描画を行い、
前記オブジェクトのうち第1の種類の複数のオブジェクトについて、オブジェクト毎に、
前記仮想空間の一部であって、当該第1の種類のオブジェクトを内包する部分空間を設定し、
前記部分空間に対する仮想光源を設定して、当該仮想光源に基づいた前記部分空間における前記第1の種類のオブジェクトのシャドウマップである部分シャドウマップを生成し、
前記部分空間の範囲内に対応する画素に関して、前記デプスバッファのデプスと前記部分シャドウマップのデプスに基づいて、前記第1の種類のオブジェクトの影の濃さを画素毎に決定し、当該画素の影の濃さが、影の濃さを記憶する影バッファに記憶されている値より濃い影の値の場合に、当該影バッファに上書きして記憶し、
前記フレームバッファと前記影バッファに基づいて前記フレームバッファの画像に影を描画する、または、前記Gバッファと前記影バッファとに基づいて影の付いた画像をフレームバッファに描画する、情報処理システム。
【請求項6】
前記部分空間の範囲内に対応する画素ごと毎の影の濃さを、前記デプスバッファのデプスと前記部分シャドウマップのデプスとを用いた分散シャドウマップの手法に基づいて決定する、請求項5記載の情報処理システム。
【請求項7】
前記第1の種類のオブジェクトは、平たい形状のオブジェクトである、請求項6記載の情報処理システム。
【請求項8】
前記仮想光源は、平行光源であって、
前記部分空間は、前記平行光源の光の方向に沿った辺を有する直方体形状である、請求項5記載の情報処理システム。
【請求項9】
仮想空間内のオブジェクトについて、デプスバッファを用いてデプステストを行いながらフレームバッファまたはGバッファへ描画を行い、
前記オブジェクトのうち第1の種類の複数のオブジェクトについて、オブジェクト毎に、
前記仮想空間の一部であって、当該第1の種類のオブジェクトを内包する部分空間を設定し、
前記部分空間に対する仮想光源を設定して、当該仮想光源に基づいた前記部分空間における前記第1の種類のオブジェクトのシャドウマップである部分シャドウマップを生成し、
前記部分空間の範囲内に対応する画素に関して、前記デプスバッファのデプスと前記部分シャドウマップのデプスに基づいて、前記第1の種類のオブジェクトの影の濃さを画素毎に決定し、当該画素の影の濃さが、影の濃さを記憶する影バッファに記憶されている値より濃い影の値の場合に、当該影バッファに上書きして記憶し、
前記フレームバッファと前記影バッファに基づいて前記フレームバッファの画像に影を描画する、または、前記Gバッファと前記影バッファとに基づいて影の付いた画像をフレームバッファに描画する、情報処理装置。
【請求項10】
前記部分空間の範囲内に対応する画素ごと毎の影の濃さを、前記デプスバッファのデプスと前記部分シャドウマップのデプスとを用いた分散シャドウマップの手法に基づいて決定する、請求項9記載の情報処理装置。
【請求項11】
前記第1の種類のオブジェクトは、平たい形状のオブジェクトである、請求項10記載の情報処理装置。
【請求項12】
前記仮想光源は、平行光源であって、
前記部分空間は、前記平行光源の光の方向に沿った辺を有する直方体形状である、請求項9記載の情報処理装置。
【請求項13】
情報処理システムによって実行される画像処理方法であって、
前記情報処理システムは、
仮想空間内のオブジェクトについて、デプスバッファを用いてデプステストを行いながらフレームバッファまたはGバッファへ描画を行い、
前記オブジェクトのうち第1の種類の複数のオブジェクトについて、オブジェクト毎に、
前記仮想空間の一部であって、当該第1の種類のオブジェクトを内包する部分空間を設定し、
前記部分空間に対する仮想光源を設定して、当該仮想光源に基づいた前記部分空間における前記第1の種類のオブジェクトのシャドウマップである部分シャドウマップを生成し、
前記部分空間の範囲内に対応する画素に関して、前記デプスバッファのデプスと前記部分シャドウマップのデプスに基づいて、前記第1の種類のオブジェクトの影の濃さを画素毎に決定し、当該画素の影の濃さが、影の濃さを記憶する影バッファに記憶されている値より濃い影の値の場合に、当該影バッファに上書きして記憶し、
前記フレームバッファと前記影バッファに基づいて前記フレームバッファの画像に影を描画する、または、前記Gバッファと前記影バッファとに基づいて影の付いた画像をフレームバッファに描画する、画像処理方法。
【請求項14】
前記情報処理システムは、前記部分空間の範囲内に対応する画素ごと毎の影の濃さを、前記デプスバッファのデプスと前記部分シャドウマップのデプスとを用いた分散シャドウマップの手法に基づいて決定する、請求項13記載の画像処理方法。
【請求項15】
前記第1の種類のオブジェクトは、平たい形状のオブジェクトである、請求項14記載の画像処理方法。
【請求項16】
前記仮想光源は、平行光源であって、
前記部分空間は、前記平行光源の光の方向に沿った辺を有する直方体形状である、請求項13記載の画像処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、仮想空間内のオブジェクトに影を付した画像を生成するための画像処理プログラム、情報処理システム、情報処理装置、および、画像処理方法に関する。
【背景技術】
【0002】
従来、仮想空間内のオブジェクトに影を付した画像を生成するために、シャドウマップを用いる技術がある(例えば、非特許文献1参照)。
【先行技術文献】
【非特許文献】
【0003】
【文献】“Cascaded Shadow Maps”、[online]、Microsoft Corporation、[令和5年12月19日検索]、インターネット<https://learn.microsoft.com/en-us/windows/win32/dxtecharts/cascaded-shadow-maps>
【発明の概要】
【発明が解決しようとする課題】
【0004】
影を付した画像を生成するための処理によるコンピュータの処理負荷を軽減することが望まれる。
【0005】
それ故、本発明の目的は、影を付した画像を生成する際のコンピュータの処理負荷を軽減することが可能な画像処理プログラム、情報処理システム、情報処理装置、および、画像処理方法を提供することである。
【課題を解決するための手段】
【0006】
上記の課題を解決すべく、本発明は、以下の(1)-(4)の構成を採用した。
【0007】
(1)
本発明の一例は、情報処置装置のコンピュータに、次の処理を実行させる画像処理プログラムである。
・仮想空間内のオブジェクトについて、デプスバッファを用いてデプステストを行いながらフレームバッファまたはGバッファへ描画を行う処理
・オブジェクトのうち第1の種類の複数のオブジェクトについて、オブジェクト毎に、仮想空間の一部であって、当該第1の種類のオブジェクトを内包する部分空間を設定する処理
・上記オブジェクト毎に、部分空間に対する仮想光源を設定して、当該仮想光源に基づいた部分空間における第1の種類のオブジェクトのシャドウマップである部分シャドウマップを生成する処理
・上記オブジェクト毎に、部分空間の範囲内に対応する画素に関して、デプスバッファのデプスと部分シャドウマップのデプスに基づいて、第1の種類のオブジェクトの影の濃さを画素毎に決定し、当該画素の影の濃さが、影の濃さを記憶する影バッファに記憶されている値より濃い影の値の場合に、当該影バッファに上書きして記憶する処理
・フレームバッファと影バッファとに基づいてフレームバッファの画像に影を描画する、または、Gバッファと影バッファとに基づいて影の付いた画像をフレームバッファに描画する処理
【0008】
上記(1)の構成によれば、オブジェクト毎の部分シャドウマップを用いることで、コンピュータの処理負荷を軽減することができる。
【0009】
(2)
上記(1)の構成において、画像処理プログラムは、コンピュータに、部分空間の範囲内に対応する画素毎の影の濃さを、デプスバッファのデプスと部分シャドウマップのデプスとを用いた分散シャドウマップの手法に基づいて決定させてもよい。
【0010】
上記(2)の構成によれば、ライトブリーディングを抑制しつつ、分散シャドウマップによって自然に見える影を表示することができる。
【0011】
(3)
上記(2)の構成において、第1の種類のオブジェクトは、平たい形状のオブジェクトであってもよい。
【0012】
上記(3)の構成によれば、ライトブリーディングが生じるおそれをより低減することができる。
【0013】
(4)
上記(1)の構成において、仮想光源は、平行光源であってもよい。部分空間は、平行光源の光の方向に沿った辺を有する直方体形状であってもよい。
【0014】
上記(4)の構成によれば、部分シャドウマップを生成するための計算を容易にすることができる。
【0015】
なお、本発明の別の一例は、上記(1)~(4)における処理を実行する情報処理装置または情報処理システムであってもよい。また、本発明の別の一例は、上記(1)~(4)における処理を実行する画像処理方法であってもよい。
【発明の効果】
【0016】
上記画像処理プログラム、情報処理システム、情報処理装置、および、画像処理方法によれば、コンピュータの処理負荷を軽減することができる。
【図面の簡単な説明】
【0017】
【
図1】本体装置に左コントローラおよび右コントローラを装着した状態の一例を示す図
【
図2】本体装置から左コントローラおよび右コントローラをそれぞれ外した状態の一例を示す図
【
図7】本体装置と左コントローラおよび右コントローラとの内部構成の一例を示すブロック図
【
図9】仮想空間に配置される所定の種類のオブジェクトの一例を示す図
【
図10】各オブジェクトに設定される部分空間の一例を示す図
【
図11】本実施形態の変形例における部分空間の一例を示す図
【
図12】光源と、オブジェクトと、当該オブジェクトの影が付される面との位置関係の一例を示す図
【
図13】オブジェクトと、当該オブジェクトの影となる領域との一例を示す図
【
図14】2つのオブジェクトの影が重なって表示される場合のゲーム画像の一例を示す図
【
図16】2つのオブジェクトの影が重なって表示される場合のゲーム画像の一例を示す図
【
図17】ゲームシステムにおける情報処理に用いられる各種データを記憶する記憶領域の一例を示す図
【
図18】ゲームシステムによって実行されるゲーム処理の流れの一例を示すフローチャート
【
図19】
図18に示すステップS3のレンダリング処理の詳細な流れの一例を示すサブフローチャート
【
図20】
図19に示すステップS17の影バッファ更新処理の詳細な流れの一例を示すサブフローチャート
【
図21】
図20に示すステップS23の分散シャドウマップ処理の詳細な流れの一例を示すサブフローチャート
【
図22】
図19に示すステップS18のライティング処理の詳細な流れの一例を示すサブフローチャート
【発明を実施するための形態】
【0018】
[1.ゲームシステムの構成]
以下、本実施形態の一例に係るゲームシステムについて説明する。本実施形態におけるゲームシステム1の一例は、本体装置(情報処理装置;本実施形態ではゲーム装置本体として機能する)2と左コントローラ3および右コントローラ4とを含む。本体装置2は、左コントローラ3および右コントローラ4がそれぞれ着脱可能である。つまり、ゲームシステム1は、左コントローラ3および右コントローラ4をそれぞれ本体装置2に装着して一体化された装置として利用できる。また、ゲームシステム1は、本体装置2と左コントローラ3および右コントローラ4とを別体として利用することもできる(
図2参照)。以下では、本実施形態のゲームシステム1のハードウェア構成について説明し、その後に本実施形態のゲームシステム1の制御について説明する。
【0019】
図1は、本体装置2に左コントローラ3および右コントローラ4を装着した状態の一例を示す図である。
図1に示すように、左コントローラ3および右コントローラ4は、それぞれ本体装置2に装着されて一体化されている。本体装置2は、ゲームシステム1における各種の処理(例えば、ゲーム処理)を実行する装置である。本体装置2は、ディスプレイ12を備える。左コントローラ3および右コントローラ4は、ユーザが入力を行うための操作部を備える装置である。
【0020】
図2は、本体装置2から左コントローラ3および右コントローラ4をそれぞれ外した状態の一例を示す図である。
図1および
図2に示すように、左コントローラ3および右コントローラ4は、本体装置2に着脱可能である。なお、以下において、左コントローラ3および右コントローラ4の総称として「コントローラ」と記載することがある。
【0021】
図3は、本体装置2の一例を示す六面図である。
図3に示すように、本体装置2は、略板状のハウジング11を備える。本実施形態において、ハウジング11の主面(換言すれば、表側の面、すなわち、ディスプレイ12が設けられる面)は、大略的には矩形形状である。
【0022】
なお、ハウジング11の形状および大きさは、任意である。一例として、ハウジング11は、携帯可能な大きさであってよい。また、本体装置2単体または本体装置2に左コントローラ3および右コントローラ4が装着された一体型装置は、携帯型装置となってもよい。また、本体装置2または一体型装置が手持ち型の装置となってもよい。また、本体装置2または一体型装置が可搬型装置となってもよい。
【0023】
図3に示すように、本体装置2は、ハウジング11の主面に設けられるディスプレイ12を備える。ディスプレイ12は、本体装置2が生成した画像を表示する。本実施形態においては、ディスプレイ12は、液晶表示装置(LCD)とする。ただし、ディスプレイ12は任意の種類の表示装置であってよい。
【0024】
また、本体装置2は、ディスプレイ12の画面上にタッチパネル13を備える。本実施形態においては、タッチパネル13は、マルチタッチ入力が可能な方式(例えば、静電容量方式)のものである。ただし、タッチパネル13は、任意の種類のものであってよく、例えば、シングルタッチ入力が可能な方式(例えば、抵抗膜方式)のものであってもよい。
【0025】
本体装置2は、ハウジング11の内部においてスピーカ(すなわち、
図6に示すスピーカ88)を備えている。
図3に示すように、ハウジング11の主面には、スピーカ孔11aおよび11bが形成される。そして、スピーカ88の出力音は、これらのスピーカ孔11aおよび11bからそれぞれ出力される。
【0026】
また、本体装置2は、本体装置2が左コントローラ3と有線通信を行うための端子である左側端子17と、本体装置2が右コントローラ4と有線通信を行うための右側端子21を備える。
【0027】
図3に示すように、本体装置2は、スロット23を備える。スロット23は、ハウジング11の上側面に設けられる。スロット23は、所定の種類の記憶媒体を装着可能な形状を有する。所定の種類の記憶媒体は、例えば、ゲームシステム1およびそれと同種の情報処理装置に専用の記憶媒体(例えば、専用メモリカード)である。所定の種類の記憶媒体は、例えば、本体装置2で利用されるデータ(例えば、アプリケーションのセーブデータ等)、および/または、本体装置2で実行されるプログラム(例えば、アプリケーションのプログラム等)を記憶するために用いられる。また、本体装置2は、電源ボタン28を備える。
【0028】
本体装置2は、下側端子27を備える。下側端子27は、本体装置2がクレードルと通信を行うための端子である。本実施形態において、下側端子27は、USBコネクタ(より具体的には、メス側コネクタ)である。上記一体型装置または本体装置2単体をクレードルに載置した場合、ゲームシステム1は、本体装置2が生成して出力する画像を据置型モニタに表示することができる。また、本実施形態においては、クレードルは、載置された上記一体型装置または本体装置2単体を充電する機能を有する。また、クレードルは、ハブ装置(具体的には、USBハブ)の機能を有する。
【0029】
図4は、左コントローラ3の一例を示す六面図である。
図4に示すように、左コントローラ3は、ハウジング31を備える。本実施形態においては、ハウジング31は、縦長の形状、すなわち、上下方向(すなわち、
図1および
図4に示すy軸方向)に長い形状である。左コントローラ3は、本体装置2から外された状態において、縦長となる向きで把持されることも可能である。ハウジング31は、縦長となる向きで把持される場合に片手、特に左手で把持可能な形状および大きさをしている。また、左コントローラ3は、横長となる向きで把持されることも可能である。左コントローラ3が横長となる向きで把持される場合には、両手で把持されるようにしてもよい。
【0030】
左コントローラ3は、アナログスティック32を備える。
図4に示すように、アナログスティック32は、ハウジング31の主面に設けられる。アナログスティック32は、方向を入力することが可能な方向入力部として用いることができる。ユーザは、アナログスティック32を傾倒することによって傾倒方向に応じた方向の入力(および、傾倒した角度に応じた大きさの入力)が可能である。なお、左コントローラ3は、方向入力部として、アナログスティックに代えて、十字キーまたはスライド入力が可能なスライドスティック等を備えるようにしてもよい。また、本実施形態においては、アナログスティック32を押下する入力が可能である。
【0031】
左コントローラ3は、各種操作ボタンを備える。左コントローラ3は、ハウジング31の主面上に4つの操作ボタン33-36(具体的には、右方向ボタン33、下方向ボタン34、上方向ボタン35、および左方向ボタン36)を備える。さらに、左コントローラ3は、録画ボタン37および-(マイナス)ボタン47を備える。左コントローラ3は、ハウジング31の側面の左上に第1Lボタン38およびZLボタン39を備える。また、左コントローラ3は、ハウジング31の側面の、本体装置2に装着される際に装着される側の面に第2Lボタン43および第2Rボタン44を備える。これらの操作ボタンは、本体装置2で実行される各種プログラム(例えば、OSプログラムやアプリケーションプログラム)に応じた指示を行うために用いられる。
【0032】
また、左コントローラ3は、左コントローラ3が本体装置2と有線通信を行うための端子42を備える。
【0033】
図5は、右コントローラ4の一例を示す六面図である。
図5に示すように、右コントローラ4は、ハウジング51を備える。本実施形態においては、ハウジング51は、縦長の形状、すなわち、上下方向に長い形状である。右コントローラ4は、本体装置2から外された状態において、縦長となる向きで把持されることも可能である。ハウジング51は、縦長となる向きで把持される場合に片手、特に右手で把持可能な形状および大きさをしている。また、右コントローラ4は、横長となる向きで把持されることも可能である。右コントローラ4が横長となる向きで把持される場合には、両手で把持されるようにしてもよい。
【0034】
右コントローラ4は、左コントローラ3と同様、方向入力部としてアナログスティック52を備える。本実施形態においては、アナログスティック52は、左コントローラ3のアナログスティック32と同じ構成である。また、右コントローラ4は、アナログスティックに代えて、十字キーまたはスライド入力が可能なスライドスティック等を備えるようにしてもよい。また、右コントローラ4は、左コントローラ3と同様、ハウジング51の主面上に4つの操作ボタン53-56(具体的には、Aボタン53、Bボタン54、Xボタン55、およびYボタン56)を備える。さらに、右コントローラ4は、+(プラス)ボタン57およびホームボタン58を備える。また、右コントローラ4は、ハウジング51の側面の右上に第1Rボタン60およびZRボタン61を備える。また、右コントローラ4は、左コントローラ3と同様、第2Lボタン65および第2Rボタン66を備える。
【0035】
また、右コントローラ4は、右コントローラ4が本体装置2と有線通信を行うための端子64を備える。
【0036】
図6は、本体装置2の内部構成の一例を示すブロック図である。本体装置2は、
図3に示す構成の他、
図6に示す各構成要素81-85、87、88、91、97、および98を備える。これらの構成要素81-85、87、88、91、97、および98のいくつかは、電子部品として電子回路基板上に実装されてハウジング11内に収納されてもよい。
【0037】
本体装置2は、プロセッサ81を備える。プロセッサ81は、本体装置2において実行される各種の情報処理を実行する情報処理部であって、例えば、CPU(Central Processing Unit)のみから構成されてもよいし、CPU機能、GPU(Graphics Processing Unit)機能等の複数の機能を含むSoC(System-on-a-chip)から構成されてもよい。プロセッサ81は、記憶部(具体的には、フラッシュメモリ84等の内部記憶媒体、あるいは、スロット23に装着される外部記憶媒体等)に記憶される情報処理プログラム(例えば、ゲームプログラム)を実行することによって、各種の情報処理を実行する。
【0038】
本体装置2は、自身に内蔵される内部記憶媒体の一例として、フラッシュメモリ84およびDRAM(Dynamic Random Access Memory)85を備える。フラッシュメモリ84およびDRAM85は、プロセッサ81に接続される。フラッシュメモリ84は、主に、本体装置2に保存される各種のデータ(プログラムであってもよい)を記憶するために用いられるメモリである。DRAM85は、情報処理において用いられる各種のデータを一時的に記憶するために用いられるメモリである。
【0039】
本体装置2は、スロットインターフェース(以下、「I/F」と略記する。)91を備える。スロットI/F91は、プロセッサ81に接続される。スロットI/F91は、スロット23に接続され、スロット23に装着された所定の種類の記憶媒体(例えば、専用メモリカード)に対するデータの読み出しおよび書き込みを、プロセッサ81の指示に応じて行う。
【0040】
プロセッサ81は、フラッシュメモリ84およびDRAM85、ならびに上記各記憶媒体との間でデータを適宜読み出したり書き込んだりして、上記の情報処理を実行する。
【0041】
本体装置2は、ネットワーク通信部82を備える。ネットワーク通信部82は、プロセッサ81に接続される。ネットワーク通信部82は、ネットワークを介して外部の装置と通信(具体的には、無線通信)を行う。本実施形態においては、ネットワーク通信部82は、第1の通信態様としてWi-Fiの規格に準拠した方式により、無線LANに接続して外部装置と通信を行う。また、ネットワーク通信部82は、第2の通信態様として所定の通信方式(例えば、独自プロトコルによる通信や、赤外線通信)により、同種の他の本体装置2との間で無線通信を行う。なお、上記第2の通信態様による無線通信は、閉ざされたローカルネットワークエリア内に配置された他の本体装置2との間で無線通信可能であり、複数の本体装置2の間で直接通信することによってデータが送受信される、いわゆる「ローカル通信」を可能とする機能を実現する。
【0042】
本体装置2は、コントローラ通信部83を備える。コントローラ通信部83は、プロセッサ81に接続される。コントローラ通信部83は、左コントローラ3および/または右コントローラ4と無線通信を行う。本体装置2と左コントローラ3および右コントローラ4との通信方式は任意であるが、本実施形態においては、コントローラ通信部83は、左コントローラ3との間および右コントローラ4との間で、Bluetooth(登録商標)の規格に従った通信を行う。
【0043】
プロセッサ81は、上述の左側端子17、右側端子21、および下側端子27に接続される。プロセッサ81は、左コントローラ3と有線通信を行う場合、左側端子17を介して左コントローラ3へデータを送信するとともに、左側端子17を介して左コントローラ3から操作データを受信する。また、プロセッサ81は、右コントローラ4と有線通信を行う場合、右側端子21を介して右コントローラ4へデータを送信するとともに、右側端子21を介して右コントローラ4から操作データを受信する。また、プロセッサ81は、クレードルと通信を行う場合、下側端子27を介してクレードルへデータを送信する。このように、本実施形態においては、本体装置2は、左コントローラ3および右コントローラ4との間で、それぞれ有線通信と無線通信との両方を行うことができる。また、左コントローラ3および右コントローラ4が本体装置2に装着された一体型装置または本体装置2単体がクレードルに装着された場合、本体装置2は、クレードルを介してデータ(例えば、画像データや音声データ)を据置型モニタ等に出力することができる。
【0044】
ここで、本体装置2は、複数の左コントローラ3と同時に(換言すれば、並行して)通信を行うことができる。また、本体装置2は、複数の右コントローラ4と同時に(換言すれば、並行して)通信を行うことができる。したがって、複数のユーザは、左コントローラ3および右コントローラ4のセットをそれぞれ用いて、本体装置2に対する入力を同時に行うことができる。一例として、第1ユーザが左コントローラ3および右コントローラ4の第1セットを用いて本体装置2に対して入力を行うと同時に、第2ユーザが左コントローラ3および右コントローラ4の第2セットを用いて本体装置2に対して入力を行うことが可能となる。
【0045】
また、ディスプレイ12は、プロセッサ81に接続される。プロセッサ81は、(例えば、上記の情報処理の実行によって)生成した画像および/または外部から取得した画像をディスプレイ12に表示する。
【0046】
本体装置2は、コーデック回路87およびスピーカ(具体的には、左スピーカおよび右スピーカ)88を備える。コーデック回路87は、スピーカ88および音声入出力端子25に接続されるとともに、プロセッサ81に接続される。コーデック回路87は、スピーカ88および音声入出力端子25に対する音声データの入出力を制御する回路である。
【0047】
本体装置2は、電力制御部97およびバッテリ98を備える。電力制御部97は、バッテリ98およびプロセッサ81に接続される。また、図示しないが、電力制御部97は、本体装置2の各部(具体的には、バッテリ98の電力の給電を受ける各部、左側端子17、および右側端子21)に接続される。電力制御部97は、プロセッサ81からの指令に基づいて、バッテリ98から上記各部への電力供給を制御する。
【0048】
また、バッテリ98は、下側端子27に接続される。外部の充電装置(例えば、クレードル)が下側端子27に接続され、下側端子27を介して本体装置2に電力が供給される場合、供給された電力がバッテリ98に充電される。
【0049】
図7は、本体装置2と左コントローラ3および右コントローラ4との内部構成の一例を示すブロック図である。なお、本体装置2に関する内部構成の詳細については、
図6で示しているため
図7では省略している。
【0050】
左コントローラ3は、本体装置2との間で通信を行う通信制御部101を備える。
図7に示すように、通信制御部101は、端子42を含む各構成要素に接続される。本実施形態においては、通信制御部101は、端子42を介した有線通信と、端子42を介さない無線通信との両方で本体装置2と通信を行うことが可能である。通信制御部101は、左コントローラ3が本体装置2に対して行う通信方法を制御する。すなわち、左コントローラ3が本体装置2に装着されている場合、通信制御部101は、端子42を介して本体装置2と通信を行う。また、左コントローラ3が本体装置2から外されている場合、通信制御部101は、本体装置2(具体的には、コントローラ通信部83)との間で無線通信を行う。コントローラ通信部83と通信制御部101との間の無線通信は、例えばBluetooth(登録商標)の規格に従って行われる。
【0051】
また、左コントローラ3は、例えばフラッシュメモリ等のメモリ102を備える。通信制御部101は、例えばマイコン(マイクロプロセッサとも言う)で構成され、メモリ102に記憶されるファームウェアを実行することによって各種の処理を実行する。
【0052】
左コントローラ3は、各ボタン103(具体的には、ボタン33-39、43、44、および47)を備える。また、左コントローラ3は、アナログスティック(
図7では「スティック」と記載する)32を備える。各ボタン103およびアナログスティック32は、自身に対して行われた操作に関する情報を、適宜のタイミングで繰り返し通信制御部101へ出力する。
【0053】
通信制御部101は、各入力部(具体的には、各ボタン103、および、アナログスティック32)から、入力に関する情報(具体的には、操作に関する情報、またはセンサによる検出結果)を取得する。通信制御部101は、取得した情報(または取得した情報に所定の加工を行った情報)を含む操作データを本体装置2へ送信する。なお、操作データは、所定時間に1回の割合で繰り返し送信される。なお、入力に関する情報が本体装置2へ送信される間隔は、各入力部について同じであってもよいし、同じでなくてもよい。
【0054】
上記操作データが本体装置2へ送信されることによって、本体装置2は、左コントローラ3に対して行われた入力を得ることができる。すなわち、本体装置2は、各ボタン103およびアナログスティック32に対する操作を、操作データに基づいて判別することができる。
【0055】
左コントローラ3は、電力供給部108を備える。本実施形態において、電力供給部108は、バッテリおよび電力制御回路を有する。図示しないが、電力制御回路は、バッテリに接続されるとともに、左コントローラ3の各部(具体的には、バッテリの電力の給電を受ける各部)に接続される。
【0056】
図7に示すように、右コントローラ4は、本体装置2との間で通信を行う通信制御部111を備える。また、右コントローラ4は、通信制御部111に接続されるメモリ112を備える。通信制御部111は、端子64を含む各構成要素に接続される。通信制御部111およびメモリ112は、左コントローラ3の通信制御部101およびメモリ102と同様の機能を有する。したがって、通信制御部111は、端子64を介した有線通信と、端子64を介さない無線通信(具体的には、Bluetooth(登録商標)の規格に従った通信)との両方で本体装置2と通信を行うことが可能であり、右コントローラ4が本体装置2に対して行う通信方法を制御する。
【0057】
右コントローラ4は、左コントローラ3の各入力部と同様の各入力部を備える。具体的には、各ボタン113、および、アナログスティック52を備える。これらの各入力部については、左コントローラ3の各入力部と同様の機能を有し、同様に動作する。
【0058】
右コントローラ4は、電力供給部118を備える。電力供給部118は、左コントローラ3の電力供給部108と同様の機能を有し、同様に動作する。
【0059】
[2.ゲームシステムにおける処理の概要]
以下、ゲームシステム1によって実行される、ゲーム画像の生成処理について説明する。本実施形態においては、ゲームシステム1は、ゲーム空間である3次元の仮想空間にオブジェクトを配置し、オブジェクトに影が付された仮想空間を示すゲーム画像を生成して表示する。
図8は、ゲーム画像の一例を示す図である。
図8に示すように、本実施形態においては、仮想空間に配置される所定の種類のオブジェクトについて、影が付されて(つまり、影の領域が暗くなるように)表示される。
図8に示す例においては、2つのオブジェクト201および202について、それぞれ影203および204が付されている。本実施形態においては、上記所定の種類のオブジェクトには、プレイヤによって操作されるプレイヤキャラクタと、ゲームシステム1によって動作が制御されるノンプレイヤキャラクタが含まれる。なお、ゲームシステム1は、仮想空間に配置される任意のオブジェクトについて影を付してよく、全てのオブジェクトについて影を付してもよい。
【0060】
図9は、仮想空間に配置される所定の種類のオブジェクトの一例を示す図である。本実施形態においては、上記所定の種類のオブジェクトは、
図9に示すオブジェクト201のように平らな形状を有する。具体的には、オブジェクト201は、本体部分(具体的には、頭、胴体、および、足を含む部分)211と、右腕部分212と、左腕部分213とを有する。各部分211-213はそれぞれ平面状の形状である。なお、
図9においては、各部分211-213が若干の厚みを有するように示しているが、各部分211-213は厚みを有していなくてもよい。また、本実施形態においては、各部分211-213は、厚み方向にずれて配置される(
図9参照)。したがって、オブジェクト201は全体として若干の厚みを有する。なお、他の実施形態においては、オブジェクトは、全体として平面状の形状であってもよい。また、他の実施形態においては、オブジェクトは、平らでない形状であってもよい。
【0061】
本実施形態においては、仮想空間に配置される複数の上記所定の種類のオブジェクトについて影を付す場合、ゲームシステム1は、影となる領域を計算する処理をオブジェクト毎に実行する。以下、
図10-
図16を参照して、この処理について説明する。
【0062】
本実施形態においては、ゲームシステム1は、上記所定の種類のオブジェクト毎に部分空間を設定し、部分空間を用いてオブジェクト毎のシャドウマップ(以下、「部分シャドウマップ」と呼ぶ。)を生成する。
図10は、各オブジェクトに設定される部分空間の一例を示す図である。
図10に示す例では、オブジェクト201について部分空間221が設定され、オブジェクト202について部分空間222が設定されている。
【0063】
部分空間は、対応するオブジェクト(つまり、当該部分空間を用いて影を付す対象となるオブジェクト)を内包するように設定される(
図10参照)。部分空間の大きさは、対応するオブジェクトを内包する任意の大きさでよい。部分空間は、対応するオブジェクトが内包されればよいので、例えば複数のオブジェクトを内包するような大きな部分空間を設定する必要はない。そのため、部分シャドウマップが大きくなることを抑制でき、部分シャドウマップに用いられるメモリ領域が増加することを抑制することができる。
【0064】
本実施形態においては、部分空間は、光源の光線方向に沿った辺(より具体的には、光線方向に平行な辺)を有する直方体形状である(
図10参照)。詳細は後述するが、部分空間を上記の形状とすることで、部分空間に対応する範囲の部分シャドウマップを生成するための計算が容易になる。なお、本実施形態においては、影を付すための光源は平行光源である。したがって、各オブジェクトに設定される部分空間は、それぞれ同じ向きとなる(
図10参照)。なお、部分空間の形状は任意であり、他の実施形態においては、直方体以外の形状であってもよい。
【0065】
図11は、本実施形態の変形例における部分空間の一例を示す図である。
図11に示す変形例においては、影を付すための光源として点光源が用いられるものとする。このとき、ゲームシステム1は、点光源の位置に基づいて錐台形状の部分空間225および226を各オブジェクト201および202に対してそれぞれ設定してもよい。具体的には、部分空間225および226は、点光源の位置を頂点とする四角錐から、同じ頂点であって当該四角錐を相似に縮小した四角錐を取り除いた錐台である。点光源が用いられる場合には、上記の部分空間を設定することでオブジェクト毎の部分シャドウマップを生成することができる。
【0066】
本実施形態においては、上記部分空間に基づいて部分シャドウマップが部分空間毎に生成される(
図10参照)。部分シャドウマップは、光線方向から見たときの部分空間内における各位置のデプス(換言すれば、深度)を示す。本実施形態においては平行光源が用いられるので、上記デプスは、所定の基準位置(すなわち、光源の位置)から当該位置までの光線方向に関する距離として算出される。なお、基準位置は任意の位置であってよい。
【0067】
なお、部分シャドウマップのデプスは、上記部分空間に対応するオブジェクトのみを対象として算出される。つまり、部分シャドウマップにおいて、光線方向から見たときにオブジェクトが存在する位置については、デプスは、所定の基準位置から当該オブジェクトの位置までの光線方向に関する距離として算出される。また、部分シャドウマップにおいて、光線方向から見たときにオブジェクトが存在しない位置については、デプスは最大値に設定される。したがって、本実施形態においては、光線方向から見たときに上記オブジェクトの手前または奥に他のオブジェクトが配置されていたとしても、当該他のオブジェクトは考慮せずに部分シャドウマップのデプスが算出される。
【0068】
ゲームシステム1は、部分空間が設定されるオブジェクト毎に部分シャドウマップを生成する。なお、本実施形態においては、ゲームシステム1は、1つのオブジェクトについて部分シャドウマップを生成すると、当該部分シャドウマップに基づく影バッファの更新処理(詳細は後述する)を実行し、その後に別のオブジェクトについて部分シャドウマップを生成する。つまり、ゲームシステム1は、部分シャドウマップの生成処理と、部分シャドウマップに基づく影バッファの更新処理とを、オブジェクト毎に繰り返し実行する。これによれば、メモリ領域に同時に記憶される部分シャドウマップは1つのみとなるので、部分シャドウマップのためのメモリ領域を節約することができる。なお、他の実施形態においては、部分シャドウマップの生成処理と影バッファの更新処理とを実行する順序は任意であり、ゲームシステム1は、各オブジェクトについての部分シャドウマップをそれぞれ生成した後で、各部分シャドウマップに基づいて影バッファの更新処理を実行してもよい。
【0069】
ゲームシステム1は、生成された部分シャドウマップに基づいて影バッファを更新する。影バッファは、ゲーム画像の画素毎に影の濃さ(換言すれば、明るさ)を格納するバッファである。ゲームシステム1は、影バッファにおける各画素のうち、部分空間に対応する画素(すなわち、部分空間内の位置を表示される画素)における影の濃さを、当該部分空間についての部分シャドウマップを用いて算出する。つまり、1つの部分シャドウマップに基づく影バッファの更新処理においては、当該部分シャドウマップに対応する部分空間内の領域に対応する画素について影の濃さが更新される。
【0070】
本実施形態においては、分散シャドウマップの手法を用いて影の濃さが算出される。分散シャドウマップの手法では、画素に対応する位置が影となる確率をチェビシェフの不等式によって表し、当該確率に応じた濃さとなるように(つまり、影となる確率が高い箇所は影が濃くなり、影となる確率が低い箇所は影が薄くなるように)、影の濃さを算出する。具体的には、本実施形態においては、画素における影の濃さを示す変数Pは、次の式(1)に従って算出される。
P=σ2/{σ2+(t-E(x))2} …(1)
詳細は後述するが、上記変数Pは、値が小さいほど影が濃い(すなわち、暗い)ことを示す。
【0071】
図12は、光源と、オブジェクトと、当該オブジェクトの影が付される面(例えば、仮想空間における地面)との位置関係の一例を示す図である。上式(1)における変数tは、当該画素に対応する位置(例えば、
図12に示す位置A)のデプスである。ここで、上式(1)におけるデプスとは、光源を基準としたときのデプス(つまり、光源の位置から当該画素に対応する位置までのデプス)である。変数tは、仮想カメラを基準としたデプスdを、光源を基準としたデプスに変換することで得られる(
図12参照)。なお、仮想カメラを基準としたデプスdは、デプスバッファに格納されている。デプスバッファに格納されるデプスの値は、従来の方法によって算出されてよい。
【0072】
上式(1)における変数xは、部分シャドウマップに格納される、当該画素に対応する位置におけるデプスである。つまり、変数xは、光源を基準としたときのデプスであり、光源の位置と当該画素に対応する位置(例えば、
図12に示す位置A)との間にオブジェクトが存在する場合は、変数xは、光源の位置から当該オブジェクトの位置(例えば、
図12に示す位置B)までの距離となる。
【0073】
上式(1)における関数E(x)は、上記デプスxに所定の平滑化フィルタを適用した結果の値を示す。また、上式(1)における変数σ2は、当該画素に対応する位置のデプスの分散値(より具体的には、当該画素の周囲における局所的な分散値)である。具体的には、変数σ2は、次の式(2)によって算出される。
σ2= E(x2)-E(x)2 …(2)
なお、本実施形態においては、上式(1)および(2)における関数E(x)は、デプスに平滑化フィルタを適用した結果を表す関数であるが、他の実施形態においては、関数E(x)は、上記デプスの平均値(例えば、当該画素を含む所定範囲内の画素におけるデプスの平均値)を表す関数であってもよい。
【0074】
ここで、光源から当該画素への直線上にオブジェクトが存在する場合は、変数tが上記E(x)よりも大きくなる(
図12参照)。この場合、当該画素は、オブジェクトの影が描画される画素となる。一方、光源から当該画素への直線上にオブジェクトが存在しない場合は、変数tは上記E(x)以下となる。この場合、当該画素は、オブジェクトの影が描画されない画素となる。したがって、ゲームシステム1は、変数tがE(x)よりも大きい場合、上式(1)によって変数Pを算出する。一方、変数tがE(x)以下となる場合、変数Pを算出しない。この場合、影バッファにおける当該画素の値は更新されないこととなる。なお、他の実施形態においては、ゲームシステム1は、変数tとE(x)とを比較することに代えて、変数tと変数xとを比較するようにしてもよい。
【0075】
図13は、オブジェクトと、当該オブジェクトの影となる領域との一例を示す図である。
図13においては、仮想空間における地面のうちの領域231が、オブジェクト201の影が描画される領域であるとする。ここで、上式(1)によって算出される変数Pは、値が大きいほど明るい(換言すれば、影が薄い)ことを示す変数である。上式(1)によれば、オブジェクト201の影となる領域231の縁付近の位置では、分散σ
2が大きくなることから、変数Pの値が大きくなる。なお、上記の位置で分散σ
2が大きくなる理由は、当該位置の周囲には、変数xが光源からオブジェクトまでのデプスとなる位置(すなわち、影となる位置)と、変数xが光源から地面までのデプスとなる位置(すなわち、影とならない位置)とが含まれることから、変数xの値のばらつきが大きくなるためである。上記より、オブジェクト201の影となる領域231の縁付近の位置では、影は薄くなる(
図13参照)。一方、上記領域231の縁から離れた内側の位置では、当該位置の周囲において変数xは光源からオブジェクトまでのデプスとなるので、変数xの値のばらつきが小さいために分散σ
2が小さくなることから、変数Pの値が小さくなる。したがって、上記領域231の縁から離れた内側の位置では、影は濃くなる(
図13参照)。以上より、分散シャドウマップの手法によれば、影の輪郭がぼかされることで影の縁においてジャギーが生じにくく、また、自然に見える影を表示することができる。
【0076】
なお、分散シャドウマップの手法では、1つのオブジェクトの影の領域における縁の部分は影が薄く(つまり、明るく)なりやすいので、2つのオブジェクトの影が重なって表示される場合には、当該縁の部分において暗く表示されるべき箇所が明るく表示される現象(いわゆる、ライトブリーディング)が生じるおそれがある。
図14は、2つのオブジェクトの影が重なって表示される場合のゲーム画像の一例を示す図である。
図14に示す例は、オブジェクト201の影203とオブジェクト202の影204とが重なって表示されている状況である。このような状況において、影204の領域の縁が明るく表示されてしまい、影203と影204との境界部分において影204の輪郭が明るく表示されるといった、不自然な表示となるおそれがある。例えば、(本実施形態のようにオブジェクト毎の複数の部分シャドウマップを生成することとは異なり、)仮想空間における描画範囲の全体について単一のシャドウマップを生成し、当該シャドウマップを用いて分散シャドウマップの手法によって影の濃さを算出する場合には、ライトブリーディングが生じるおそれがある。本実施形態においては、上記のような不自然な影が表示されるおそれを低減するべく、ゲームシステム1は次のように処理を行う。
【0077】
図15は、影バッファを更新する一例を示す図である。
図15に示す例は、1つ目のオブジェクト201についての部分シャドウマップに基づく影の濃さの値が影バッファに格納された後において、2つ目のオブジェクト202についての部分シャドウマップを用いて影バッファが更新される例である。
【0078】
図15に示す(a)の状態は、2つ目のオブジェクト202についての部分シャドウマップを用いて影バッファが更新される前の状態、すなわち、1つ目のオブジェクト201の影241のみが影バッファに描画された状態である。
【0079】
2つ目のオブジェクト202についての部分シャドウマップを用いて影バッファが更新される場合には、影バッファの各画素のうちで、当該オブジェクト202の部分空間に対応する領域242内の画素について影の濃さの更新が判定される。具体的には、ゲームシステム1は、領域242内の画素のうち、上述したように、オブジェクト202の影の領域外となる画素(すなわち、変数tがE(x)以下となる画素)については、更新を行わない。また、ゲームシステム1は、領域242内の画素のうち、オブジェクト202の影の領域内となる画素(すなわち、変数tがE(x)よりも大きくなる画素)については、上式(1)に従って算出された変数Pが、影バッファに格納されている値よりも小さい場合(つまり、算出された影の濃さが、影バッファに格納されている濃さよりも濃い値を示す場合)、影バッファの値を更新する。したがって、1つ目のオブジェクト201の影241内の画素が、2つ目のオブジェクト202の影243内の位置である場合には、影241における濃さよりも、影243における濃さが濃ければ、当該画素の値が更新され、影241における濃さよりも、影243における濃さが薄ければ、当該画素の値は更新されない。上記によれば、例えば、2つ目のオブジェクト202の影243の縁の画素において影が薄く算出されたとしても、影バッファに格納されている値(すなわち、1つ目のオブジェクト201の影241の濃さを示す値)が影が濃いことを示す場合は更新されないので、当該画素においては影が濃いことを示す値が格納されたままとなる。
【0080】
上記によれば、2つのオブジェクトの影が重なって表示される場合において上記のライトブリーディングが生じるおそれを低減することができる。
図16は、2つのオブジェクトの影が重なって表示される場合のゲーム画像であって、本実施形態における処理によって生成されるゲーム画像の一例を示す図である。
図16に示す例においては、
図14に示す例とは異なり、オブジェクト201の影203とオブジェクト202の影204との境界部分は暗く表示されている。このように、本実施形態においては、部分シャドウマップ毎に影バッファの更新を行うとともに、影バッファに格納されている値よりも影が濃い場合に更新を行うことによって、ライトブリーディングが生じるおそれを低減することができる。
【0081】
なお、1つの部分空間に複数のオブジェクトが含まれる場合においても、ある位置とその周囲の位置とで光源を基準としたデプスが大きく異なると、上述の分散σ2が大きくなる結果、その位置においてライトブリーディングが生じるおそれがある。これに関して、本実施形態においては、上述したように、部分シャドウマップのデプスは、部分空間に対応するオブジェクトのみを対象として算出される。これによっても、部分シャドウマップにおける各デプスの差が大きくなる可能性を低減できるので、分散σ2が大きくなる結果としてライトブリーディングが生じるおそれを低減することができる。
【0082】
また、本実施形態においては、影が付される所定の種類のオブジェクトは平らな形状である。そのため、部分シャドウマップにおけるデプスは連続的に変化する、あるいは、ある位置とその周囲の位置とでデプスが大きくは変化しないので、分散σ2は大きくなりにくい。本実施形態においては、これによってもライトブリーディングが生じるおそれを低減することができる。また、平らなオブジェクトが光線方向に対して平行に近い向きとなる状態では、部分シャドウマップにおけるデプスの変化量は大きくなる。ただし、本実施形態においては当該オブジェクトが平らであるため、この状態においては影は細くなることから、影が不自然に見えるといった問題は生じにくいと言うことができる。
【0083】
ゲームシステム1は、オブジェクト毎の部分シャドウマップを用いて影バッファを順次更新することで、影バッファの更新を行う。そして、更新された影バッファを用いて、フレームバッファに描画されたゲーム画像に対するライティング処理を行うことで、影が付されたゲーム画像を生成する。なお、ライティング処理の具体的な内容は任意であり、従来の方法が用いられてよい。
【0084】
[3.情報処理システム/ゲームシステムにおける処理の具体例]
次に、
図17-
図22を参照して、ゲームシステム1における情報処理の具体例について説明する。
【0085】
図17は、ゲームシステム1における情報処理に用いられる各種データを記憶する記憶領域の一例を示す図である。
図17に示す各記憶領域は、本体装置2がアクセス可能な記憶媒体(例えば、フラッシュメモリ84、DRAM85、および/または、スロット23に装着されたメモリカード等)に設けられる。
図17に示すように、上記記憶媒体には、ゲームプログラムが記憶されるゲームプログラム領域が設けられる。ゲームプログラムは、本実施形態におけるゲーム処理(具体的には、
図18に示すゲーム処理)を実行するためのものである。また、上記記憶媒体には、フレームバッファ、デプスバッファ、Gバッファ、影バッファ、および、部分シャドウマップ領域が設けられる(
図17参照)。
【0086】
図18は、ゲームシステム1によって実行されるゲーム処理の流れの一例を示すフローチャートである。ゲーム処理の実行は、例えば、上記ゲームプログラムの実行中において、プレイヤの指示に応じてゲームが開始されたことに応じて開始される。
【0087】
なお、本実施形態では、本体装置2のプロセッサ81が、ゲームシステム1に記憶されている上記ゲームプログラムを実行することによって、
図18に示す各ステップの処理を実行するものとして説明する。ただし、他の実施形態においては、上記各ステップの処理のうちの一部の処理を、プロセッサ81とは別のプロセッサ(例えば、専用回路等)が実行するようにしてもよい。また、ゲームシステム1が他の情報処理装置(例えば、サーバ)と通信可能である場合、
図18に示す各ステップの処理の一部は、他の情報処理装置において実行されてもよい。また、
図18に示す各ステップの処理は、単なる一例に過ぎず、同様の結果が得られるのであれば、各ステップの処理順序を入れ替えてもよいし、各ステップの処理に加えて(または代えて)別の処理が実行されてもよい。
【0088】
また、プロセッサ81は、
図18に示す各ステップの処理を、メモリ(例えば、DRAM85)を用いて実行する。すなわち、プロセッサ81は、各処理ステップによって得られる情報(換言すれば、データ)をメモリに記憶し、それ以降の処理ステップにおいて当該情報を用いる場合には、メモリから当該情報を読み出して利用する。
【0089】
図18に示すステップS1において、プロセッサ81は、プレイヤによる指示を示す上記操作データを取得する。すなわち、プロセッサ81は、コントローラ通信部83および/または各端子17および21を介して各コントローラから受信される操作データを取得する。ステップS1の次にステップS2の処理が実行される。
【0090】
ステップS2において、プロセッサ81は、仮想空間に配置されるオブジェクトの動作を制御する。例えば、プロセッサ81は、ステップS1で取得された操作データに基づいてプレイヤキャラクタの動作を制御したり、ゲームプログラムにおいて定められているアルゴリズムに従ってノンプレイヤキャラクタの動作を制御したりする。ステップS2の次にステップS3の処理が実行される。
【0091】
ステップS3において、プロセッサ81は、所定の種類のオブジェクトに影を付す処理を含むレンダリング処理を実行する。ステップS3のレンダリング処理では、ステップS2の処理結果が反映された仮想空間について、上記所定の種類のオブジェクト等に関する描画が行われる。以下、
図19を参照して、ステップS3のレンダリング処理の詳細について説明する。
【0092】
図19は、
図18に示すステップS3のレンダリング処理の詳細な流れの一例を示すサブフローチャートである。レンダリング処理においては、まずステップS11において、プロセッサ81は、描画を行う対象となるオブジェクトを指定する。ステップS11においては、今回のステップS11-S16の処理ループにおいてまだ処理対象となっていないオブジェクトが指定される。ステップS11の次に、ステップS12の処理が実行される。
【0093】
ステップS12において、プロセッサ81は、ステップS11で指定したオブジェクトのポリゴンのうちで、描画を行う対象となるポリゴンを指定する。ステップS12においては、今回のステップS12-S15の処理ループにおいてまだ処理対象となっていないポリゴンが指定される。ステップS12の次に、ステップS13の処理が実行される。
【0094】
ステップS13において、プロセッサ81は、ステップS12で指定されたポリゴンについてデプステストを行ってデプスバッファの更新を行う。すなわち、プロセッサ81は、デプスバッファに格納されている画素毎のデプス値が、当該ポリゴンのうちの当該画素における位置のデプス値よりも大きい場合、当該ポリゴンのデプス値となるようにデプスバッファを更新する。ステップS12の次に、ステップS13の処理が実行される。
【0095】
ステップS14において、プロセッサ81は、ステップS12で指定されたポリゴンについてGバッファ(ジオメトリバッファ)の更新を行う。すなわち、プロセッサ81は、当該ポリゴンに対応する画素について、描画に用いられる情報(例えば、当該ポリゴンの位置、法線、および、色等の情報)をGバッファに書き込む。ステップS14の次に、ステップS15の処理が実行される。
【0096】
ステップS15において、プロセッサ81は、ステップS11で指定したオブジェクトの各ポリゴンについてステップS12-S14の一連の処理が完了したか否かを判定する。ステップS15の判定結果が肯定である場合、ステップS16の処理が実行される。一方、ステップS15の判定結果が否定である場合、ステップS12の処理が再度実行される。
【0097】
ステップS16において、プロセッサ81は、レンダリング処理の対象となる各オブジェクトについてステップS11-S15の一連の処理が完了したか否かを判定する。ステップS16の判定結果が肯定である場合、ステップS17の処理が実行される。一方、ステップS16の判定結果が否定である場合、ステップS11の処理が再度実行される。
【0098】
ステップS17において、プロセッサ81は、影バッファを更新する影バッファ更新処理を実行する。影バッファ更新処理は、上記所定の種類のオブジェクトについての影を示すように影バッファの値を更新する処理である。以下、
図20を参照して、ステップS17の影バッファ更新処理の詳細について説明する。
【0099】
図20は、
図19に示すステップS17の影バッファ更新処理の詳細な流れの一例を示すサブフローチャートである。影バッファ更新処理においては、まずステップS21において、プロセッサ81は、影の描画を行う対象となるオブジェクトを指定する。ステップS21においては、所定の種類のオブジェクトのうちで、今回のステップS21-S29の処理ループにおいてまだ処理対象となっていないオブジェクトが指定される。ステップS21の次に、ステップS22の処理が実行される。
【0100】
ステップS22において、プロセッサ81は、ステップS21で指定されたオブジェクトについて部分シャドウマップを生成する。すなわち、プロセッサ81は、当該オブジェクトについて上述の部分空間を設定し(
図10参照)、設定された部分空間に基づいて部分シャドウマップを生成する。なお、本実施形態においては、設定された部分空間とは異なる他の部分空間に関する値を示す部分シャドウマップが上述の部分シャドウマップ領域に記憶されている場合、新たに生成された部分シャドウマップの内容となるように部分シャドウマップ領域を上書きして更新する。ステップS22の次に、ステップS23の処理が実行される。
【0101】
ステップS23において、プロセッサ81は、上述の分散シャドウマップの手法によって影の濃さを算出する分散シャドウマップ処理を実行する。分散シャドウマップ処理においては、ステップS21で指定されたオブジェクトについて画素毎に影の濃さが算出され、算出された影の濃さに応じて影バッファが更新される。以下、
図21を参照して、ステップS23の分散シャドウマップ処理の詳細について説明する。
【0102】
図21は、
図20に示すステップS23の分散シャドウマップ処理の詳細な流れの一例を示すサブフローチャートである。分散シャドウマップ処理においては、まずステップS31において、プロセッサ81は、影バッファにおける画素のうちから、処理の対象となる1つ画素を指定する。ステップS31においては、今回のステップS31-S38の処理ループにおいてまだ処理対象となっていない画素が指定される。ステップS31の次に、ステップS32の処理が実行される。
【0103】
ステップS32において、プロセッサ81は、ステップS31で指定された画素が、ステップS21で指定されたオブジェクトについて設定された部分空間に対応する画素であるか否かを判定する。なお、部分空間に対応する画素とは、部分空間内の位置を示す画素、あるいは、光源方向から見たときに当該画素が示す位置の手前に部分空間が配置されるような画素である。ステップS32の判定結果が肯定である場合、ステップS33の処理が実行される。一方、ステップS32の判定結果が否定である場合、後述するステップS38の処理が実行される。
【0104】
ステップS33において、プロセッサ81は、ステップS31で指定された画素について、光源を基準としたデプスを算出する。すなわち、プロセッサ81は、デプスバッファに格納されている、仮想カメラを基準としたデプス(
図12に示すd)を、光源を基準としたデプス(
図12に示すt)に変換する。ステップS33の次に、ステップS34の処理が実行される。
【0105】
ステップS34において、プロセッサ81は、ステップS33で算出されたデプスtが、部分シャドウマップに格納されるデプスxに基づくE(x)よりも大きいか否かを判定する。ステップS34の判定結果が肯定である場合、ステップS35の処理が実行される。一方、ステップS34の判定結果が否定である場合、後述するステップS38の処理が実行される。
【0106】
ステップS35において、プロセッサ81は、ステップS31で指定された画素についての影の濃さを算出する。具体的には、プロセッサ81は、影の濃さを示す変数Pを上式(1)に従って算出する。ステップS35の次に、ステップS36の処理が実行される。
【0107】
ステップS36において、プロセッサ81は、ステップS31で指定された画素について、ステップS35で算出された影の濃さを示す値が、影バッファに格納されている当該画素の値よりも小さいか否か(つまり、算出された影の濃さが、影バッファに格納されている濃さよりも濃い値を示すか否か)を判定する。ステップS36の判定結果が肯定である場合、ステップS37の処理が実行される。一方、ステップS36の判定結果が否定である場合、後述するステップS38の処理が実行される。
【0108】
ステップS37において、プロセッサ81は、ステップS31で指定された画素について、影バッファに格納されている値を、ステップS35で算出された値に更新する。ステップS37の次に、ステップS38の処理が実行される。
【0109】
ステップS38において、プロセッサ81は、影バッファの各画素についてステップS31-S37の一連の処理が完了したか否かを判定する。ステップS38の判定結果が否定である場合、ステップS31の処理が再度実行される。一方、ステップS38の判定結果が肯定である場合、プロセッサ81は分散シャドウマップ処理を終了する。
【0110】
図20の説明に戻り、分散シャドウマップ処理(ステップS23)の次に、ステップS24の処理が実行される。ステップS24において、プロセッサ81は、影の描画を行う対象となる各オブジェクトについて、ステップS21-S23の一連の処理が完了したか否かを判定する。ステップS24の判定結果が否定である場合、ステップS21の処理が再度実行される。一方、ステップS24の判定結果が肯定である場合、プロセッサ81は影バッファ更新処理を終了する。
【0111】
図19の説明に戻り、影バッファ更新処理(ステップS17)の次に、ステップS18の処理が実行される。ステップS18において、プロセッサ81は、ライティング処理を実行する。ライティング処理においては、仮想空間における光源を考慮した各画素の画素値が算出される。以下、
図22を参照して、ステップS18のライティング処理の詳細について説明する。
【0112】
図22は、
図19に示すステップS18のライティング処理の詳細な流れの一例を示すサブフローチャートである。ライティング処理においては、まずステップS41において、プロセッサ81は、フレームバッファにおける画素のうちから、画素値を算出する対象となる画素を指定する。ステップS41においては、今回のステップS41-S44の処理ループにおいてまだ処理対象となっていない画素が指定される。ステップS41の次に、ステップS42の処理が実行される。
【0113】
ステップS42において、プロセッサ81は、上述のデプスバッファおよびGバッファに基づいて、ステップS41で指定された画素の画素値を算出する。ここで算出される画素値は、上述の影バッファによる影が反映される前の画素値である。なお、所定の種類のオブジェクトの部分空間に対応する光源(本実施形態においては、上述の平行光源)とは異なる他の光源が仮想空間に設定される場合、プロセッサ81は、本ステップS42の処理において当該他の光源を考慮して画素値を算出してもよい。プロセッサ81は、算出された画素値を格納するようにフレームバッファを更新する。ステップS42の次に、ステップS43の処理が実行される。
【0114】
ステップS43において、プロセッサ81は、上述の影バッファに基づいて、フレームバッファの画像に影を付すシャドウイングを実行する。すなわち、プロセッサ81は、ステップS41で指定された画素について、ステップS42で算出された画素値に基づいて、影バッファに格納されている当該画素における影の濃さが反映された画素値を算出する。プロセッサ81は、算出された画素値を格納するようにフレームバッファを更新する。ステップS43の次に、ステップS44の処理が実行される。
【0115】
ステップS44において、プロセッサ81は、フレームバッファの各画素についてステップS41-S43の一連の処理が完了したか否かを判定する。ステップS44の判定結果が否定である場合、ステップS41の処理が再度実行される。一方、ステップS44の判定結果が肯定である場合、プロセッサ81はライティング処理を終了する。ライティング処理の終了によって、
図19に示すレンダリング処理が終了される。なお、本実施形態においては、
図19に示すレンダリング処理はGバッファを用いたディファードレンダリングによって行われるが、他の実施形態においては、当該レンダリング処理はフォワードレンダリングによって行われてもよい。すなわち、本実施形態においては、プロセッサ81は、上記レンダリング処理(
図19参照)においてGバッファへ描画を行うとともに、上記ライティング処理(
図22参照)において、Gバッファと影バッファとに基づいて影の付いた画像をフレームバッファに描画するが、他の状態形態においては、上記レンダリング処理においてフレームバッファへ描画を行うとともに、上記ライティング処理において、当該フレームバッファと影バッファとに基づいて当該フレームバッファの画像に影を描画するようにしてもよい。
【0116】
図18の説明に戻り、レンダリング処理(ステップS3)の次に、ステップS4の処理が実行される。ステップS4において、プロセッサ81は、ステップS3のレンダリング処理で描画されないオブジェクト(例えば、背景等)についてレンダリング処理を実行する。例えば、上記ステップS3のレンダリング処理がディファードレンダリングによって実行され、上記ステップS4のレンダリング処理がフォワードレンダリングによって実行されてもよい。ステップS4の次に、ステップS5の処理が実行される。
【0117】
ステップS5において、プロセッサ81は、ポストプロセス処理を実行する。ポストプロセス処理の具体的な内容は任意である。プロセッサ81は、ステップS3およびS4の処理によって生成されたゲーム画像に対して、例えば、フィルタを用いてエフェクトをかけたり、明度や彩度等の調整を行ったりする。ステップS5の次に、ステップS6の処理が実行される。
【0118】
ステップS6において、プロセッサ81は、ステップS5の処理後のゲーム画像を表示装置へ出力する。これによって、表示装置にゲーム画像が表示される。なお、ゲーム画像が出力される表示装置は、本体装置2のディスプレイ12であってもよいし、本体装置2に接続される上述の据置型モニタであってもよい。ステップS6の次に、ステップS7の処理が実行される。
【0119】
ステップS7において、プロセッサ81は、ゲーム処理を終了するか否かを判定する。例えば、プロセッサ81は、ゲームを終了するための所定の操作入力がプレイヤによって行われた場合、ゲームを終了すると判定する。ステップS7の判定結果が否定である場合、ステップS1の処理が再度実行される。以降、ステップS7においてゲームを終了すると判定されるまで、ステップS1~S7の一連の処理が繰り返し実行される。一方、ステップS7の判定結果が肯定である場合、プロセッサ81は、
図18に示すゲーム処理を終了する。
【0120】
[4.本実施形態の作用効果および変形例]
上記実施形態においては、画像処理プログラム(一例として、ゲームプログラム)は、情報処置装置のコンピュータ(一例として、本体装置2のプロセッサ81)に、次の処理を実行させる構成である。
・仮想空間内のオブジェクトについて、デプスバッファを用いてデプステストを行いながらフレームバッファまたはGバッファへ描画を行う処理(ステップS14)
・オブジェクトのうち第1の種類の複数のオブジェクトについて、オブジェクト毎に、仮想空間の一部であって、当該第1の種類のオブジェクトを内包する部分空間を設定する処理(ステップS22)
・上記オブジェクト毎に、部分空間に対する仮想光源を設定して、当該仮想光源に基づいた部分空間における第1の種類のオブジェクトのシャドウマップである部分シャドウマップを生成する処理(ステップS22)
・上記オブジェクト毎に、部分空間の範囲内に対応する画素に関して、デプスバッファのデプスと部分シャドウマップのデプスに基づいて、第1の種類のオブジェクトの影の濃さを画素毎に決定して(ステップS35)、当該画素の影の濃さが、影の濃さを記憶する影バッファに記憶されている値より濃い影の値の場合に、当該影バッファに上書きして記憶する処理(ステップS37)
・フレームバッファと影バッファとに基づいてフレームバッファの画像に影を描画する、または、Gバッファと影バッファとに基づいて影の付いた画像をフレームバッファに描画する処理(ステップS43)
【0121】
上記の構成によれば、オブジェクト毎の部分シャドウマップを用いることで、描画範囲の全体についてのシャドウマップを生成する必要がないので、シャドウマップのためのメモリ領域を減少させたり、コンピュータの処理負荷を軽減したりすることができる。
【0122】
上記実施形態においては、影が付された仮想空間の画像を生成する画像処理プログラムとして、ゲーム画像を生成するゲームプログラムを例として説明を行ったが、画像処理プログラムはゲームプログラムに限定されない。上記実施形態における画像処理は、仮想空間を示す画像を生成するための任意の情報処理プログラムに適用することが可能である。
【0123】
上記実施形態においては、分散シャドウマップの手法に基づき画素毎の影の濃さを算出したが、影の濃さを算出する具体的な方法はこれに限らず、任意の方法で影の濃さが算出されてもよい。なお、上記実施形態によれば、部分シャドウマップを用いることで、分散シャドウマップの手法を用いる場合でも上述のライトブリーディングを抑制することができる。そのため、ライトブリーディングを抑制するために追加の処理を行う必要がなく、自然に見える影を表示することができる。
【0124】
なお、上記の実施形態において、ある情報処理装置においてデータ(プログラムを含む意味である)を用いて処理が実行される場合、当該処理に必要なデータの一部が、当該ある情報処理装置とは異なる他の情報処理装置から送信されてもよい。このとき、当該ある情報処理装置は、他の情報処理装置から受信されたデータと、自身に記憶されているデータとを用いて上記処理を実行してもよい。
【0125】
なお、他の実施形態において、情報処理システムは、上記実施形態における構成の一部を備えていなくてもよいし、上記実施形態において実行される処理の一部を実行しなくてもよい。例えば、情報処理システムは、上記実施形態における一部の特定の効果を奏するためには、当該効果を奏するための構成を備え、当該効果を奏するための処理を実行すればよく、その他の構成を備えていなくてもよいし、その他の処理を実行しなくてもよい。
【産業上の利用可能性】
【0126】
上記実施形態は、コンピュータの処理負荷を軽減すること等を目的として、例えばゲームシステムやゲームプログラムに利用することが可能である。
【符号の説明】
【0127】
1 ゲームシステム
2 本体装置
81 プロセッサ
201,201 オブジェクト
221,222 部分空間
【要約】
【課題】コンピュータの処理負荷を軽減する。
【解決手段】オブジェクトのうち第1の種類の複数のオブジェクトについて、オブジェクト毎に、仮想空間の一部であって、当該第1の種類のオブジェクトを内包する部分空間が設定される。オブジェクト毎に、情報処理システムは、部分空間に対する仮想光源を設定させて、当該仮想光源に基づいた部分空間における第1の種類のオブジェクトのシャドウマップである部分シャドウマップを生成する。オブジェクト毎に、情報処理システムは、部分空間の範囲内に対応する画素に関して、デプスバッファのデプスと部分シャドウマップのデプスに基づいて、第1の種類のオブジェクトの影の濃さを画素ごと毎に決定し、当該画素の影の濃さが、影の濃さを記憶する影バッファに記憶されている値より濃い影の値の場合に、当該影バッファに上書きして記憶する。影バッファに基づいて影の付いた画像が描画される。
【選択図】
図10