(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B1)
(11)【特許番号】
(24)【登録日】2025-06-17
(45)【発行日】2025-06-25
(54)【発明の名称】画像処理プログラム、画像処理システム、画像処理方法、および画像処理装置
(51)【国際特許分類】
G06T 15/06 20110101AFI20250618BHJP
【FI】
G06T15/06
(21)【出願番号】P 2024011579
(22)【出願日】2024-01-30
【審査請求日】2024-10-29
(73)【特許権者】
【識別番号】000233778
【氏名又は名称】任天堂株式会社
(74)【代理人】
【識別番号】100158780
【氏名又は名称】寺本 亮
(74)【代理人】
【識別番号】100121359
【氏名又は名称】小沢 昌弘
(74)【代理人】
【識別番号】100130269
【氏名又は名称】石原 盛規
(72)【発明者】
【氏名】藤澤 保仁
【審査官】益戸 宏
(56)【参考文献】
【文献】特開平8-123835(JP,A)
【文献】水原白,リアルタイムレイトレーシングの可能性を切り拓く,CGWORLD+digitalvideo,2014年10月01日,Vpl.194,pp.68-71
(58)【調査した分野】(Int.Cl.,DB名)
G06T 15/06
(57)【特許請求の範囲】
【請求項1】
情報処理装置のコンピュータに、
仮想空間内のオブジェクトについて、
第1のデプスバッファを用いて第1のデプステストと当該第1のデプスバッファの更新を行わせ、
前記第1のデプステストの結果に基づいてフレームバッファに描画を行わせ、
前記オブジェクトのうち第1の種類のオブジェクトについてさらに、第2のデプスバッファを用いて第2のデプステストと当該第2のデプスバッファの更新を行わせ、
描画が行われた前記フレームバッファの画素ごとに、当該画素を着目画素として、
前記第1のデプスバッファのデプスに基づいて、仮想カメラから前記着目画素に対応する前記仮想空間内の位置に向かう方向を入射方向、当該位置を反射位置として反射するレイの方向をレイトレース方向として算出させ、
当該レイトレース方向に沿って当該レイをトレースさせ、前記レイのトレース距離が第1の距離より小さい第2の距離未満の場合には前記第1のデプスバッファ、前記第2の距離以上の場合には前記第2のデプスバッファのデプスに基づいて、前記レイが前記仮想空間内においてオブジェクトに衝突する衝突位置を判定させ、
前記トレース距離が前記第1の距離以内となる範囲内において前記衝突位置が判定された場合に、当該衝突位置に対応する前記フレームバッファ内の画素の色に基づいた色を、前記着目画素の色に加えさせる映り込みの色として決定させる、画像処理プログラム。
【請求項2】
前記コンピュータにさらに、
前記衝突位置に対応する前記フレームバッファ内の画素の色に基づいて前記着目画素の色に加えさせる映り込みの色を、前記第1のデプスバッファに基づいた前記衝突位置と前記第2のデプスバッファに基づいた前記衝突位置とで異なるパラメータに基づいて決定させる、請求項1に記載の画像処理プログラム。
【請求項3】
前記コンピュータにさらに、
第2の種類のオブジェクトについて、フレームバッファへの描画を行わずにレンダリングした画像をテクスチャとして設定した平面オブジェクトを前記仮想空間内の前記第2の種類のオブジェクトの位置に配置させ、
前記レイが前記平面オブジェクトと交差する場合に、交差位置の前記テクスチャの色に基づいて前記着目画素の色にさらに加えさせる映り込みの色として決定させ、
前記フレームバッファに前記映り込みの色を反映させ、
前記映り込みの色を反映させた後に、前記第2の種類のオブジェクトをフレームバッファに描画させる、請求項1に記載の画像処理プログラム。
【請求項4】
前記コンピュータにさらに、
前記入射方向と前記反射位置の法線方向に基づいた反射方向に、さらに画面内側向きの補正を加えた方向を前記レイトレース方向として算出させる、請求項1に記載の画像処理プログラム。
【請求項5】
前記第2の種類のオブジェクトは、平たい形状のオブジェクトである、請求項3に記載の画像処理プログラム。
【請求項6】
プロセッサを備える画像処理システムであって、前記プロセッサは、
仮想空間内のオブジェクトについて、
第1のデプスバッファを用いて第1のデプステストと当該第1のデプスバッファの更新を行い、
前記第1のデプステストの結果に基づいてフレームバッファに描画を行い、
前記オブジェクトのうち第1の種類のオブジェクトについてさらに、第2のデプスバッファを用いて第2のデプステストと当該第2のデプスバッファの更新を行い、
描画が行われた前記フレームバッファの画素ごとに、当該画素を着目画素として、
前記第1のデプスバッファのデプスに基づいて、仮想カメラから前記着目画素に対応する前記仮想空間内の位置に向かう方向を入射方向、当該位置を反射位置として反射するレイの方向をレイトレース方向として算出し、
当該レイトレース方向に沿って当該レイをトレースさせ、前記レイのトレース距離が第1の距離より小さい第2の距離未満の場合には前記第1のデプスバッファ、前記第2の距離以上の場合には前記第2のデプスバッファのデプスに基づいて、前記レイが前記仮想空間内においてオブジェクトに衝突する衝突位置を判定し、
前記トレース距離が前記第1の距離以内となる範囲内において前記衝突位置が判定された場合に、当該衝突位置に対応する前記フレームバッファ内の画素の色に基づいた色を、前記着目画素の色に加える映り込みの色として決定する、画像処理システム。
【請求項7】
前記プロセッサはさらに、
前記衝突位置に対応する前記フレームバッファ内の画素の色に基づいて前記着目画素の色に加える映り込みの色を、前記第1のデプスバッファに基づいた前記衝突位置と前記第2のデプスバッファに基づいた前記衝突位置とで異なるパラメータに基づいて決定する、請求項6に記載の画像処理システム。
【請求項8】
前記プロセッサはさらに、
第2の種類のオブジェクトについて、フレームバッファへの描画を行わずにレンダリングした画像をテクスチャとして設定した平面オブジェクトを前記仮想空間内の前記第2の種類のオブジェクトの位置に配置し、
前記レイが前記平面オブジェクトと交差する場合に、交差位置の前記テクスチャの色に基づいて前記着目画素の色にさらに加える映り込みの色として決定し、
前記フレームバッファに前記映り込みの色を反映し、
前記映り込みの色を反映した後に、前記第2の種類のオブジェクトをフレームバッファに描画する、請求項6に記載の画像処理システム。
【請求項9】
前記プロセッサはさらに、
前記入射方向と前記反射位置の法線方向に基づいた反射方向に、さらに画面内側向きの補正を加えた方向を前記レイトレース方向として算出する、請求項6に記載の画像処理システム。
【請求項10】
前記第2の種類のオブジェクトは、平たい形状のオブジェクトである、請求項8に記載の画像処理システム。
【請求項11】
画像処理方法であって、
仮想空間内のオブジェクトについて、
第1のデプスバッファを用いて第1のデプステストと当該第1のデプスバッファの更新を行うこと、
前記第1のデプステストの結果に基づいてフレームバッファに描画を行うこと、
前記オブジェクトのうち第1の種類のオブジェクトについてさらに、第2のデプスバッファを用いて第2のデプステストと当該第2のデプスバッファの更新を行うこと、
描画が行われた前記フレームバッファの画素ごとに、当該画素を着目画素として、
前記第1のデプスバッファのデプスに基づいて、仮想カメラから前記着目画素に対応する前記仮想空間内の位置に向かう方向を入射方向、当該位置を反射位置として反射するレイの方向をレイトレース方向として算出すること、
当該レイトレース方向に沿って当該レイをトレースさせ、前記レイのトレース距離が第1の距離より小さい第2の距離未満の場合には前記第1のデプスバッファ、前記第2の距離以上の場合には前記第2のデプスバッファのデプスに基づいて、前記レイが前記仮想空間内においてオブジェクトに衝突する衝突位置を判定すること、
前記トレース距離が前記第1の距離以内となる範囲内において前記衝突位置が判定された場合に、当該衝突位置に対応する前記フレームバッファ内の画素の色に基づいた色を、前記着目画素の色に加える映り込みの色として決定すること、を備える、画像処理方法。
【請求項12】
前記衝突位置に対応する前記フレームバッファ内の画素の色に基づいて前記着目画素の色に加える映り込みの色を、前記第1のデプスバッファに基づいた前記衝突位置と前記第2のデプスバッファに基づいた前記衝突位置とで異なるパラメータに基づいて決定すること、をさらに備える、請求項11に記載の画像処理方法。
【請求項13】
第2の種類のオブジェクトについて、フレームバッファへの描画を行わずにレンダリングした画像をテクスチャとして設定した平面オブジェクトを前記仮想空間内の前記第2の種類のオブジェクトの位置に配置すること、
前記レイが前記平面オブジェクトと交差する場合に、交差位置の前記テクスチャの色に基づいて前記着目画素の色にさらに加える映り込みの色として決定すること、
前記フレームバッファに前記映り込みの色を反映すること、
前記映り込みの色を反映した後に、前記第2の種類のオブジェクトをフレームバッファに描画すること、をさらに備える、請求項11に記載の画像処理方法。
【請求項14】
前記入射方向と前記反射位置の法線方向に基づいた反射方向に、さらに画面内側向きの補正を加えた方向を前記レイトレース方向として算出すること、をさらに備える、請求項11に記載の画像処理方法。
【請求項15】
前記第2の種類のオブジェクトは、平たい形状のオブジェクトである、請求項13に記載の画像処理方法。
【請求項16】
プロセッサを備える画像処理装置であって、前記プロセッサは、
仮想空間内のオブジェクトについて、
第1のデプスバッファを用いて第1のデプステストと当該第1のデプスバッファの更新を行い、
前記第1のデプステストの結果に基づいてフレームバッファに描画を行い、
前記オブジェクトのうち第1の種類のオブジェクトについてさらに、第2のデプスバッファを用いて第2のデプステストと当該第2のデプスバッファの更新を行い、
描画が行われた前記フレームバッファの画素ごとに、当該画素を着目画素として、
前記第1のデプスバッファのデプスに基づいて、仮想カメラから前記着目画素に対応する前記仮想空間内の位置に向かう方向を入射方向、当該位置を反射位置として反射するレイの方向をレイトレース方向として算出し、
当該レイトレース方向に沿って当該レイをトレースさせ、前記レイのトレース距離が第1の距離より小さい第2の距離未満の場合には前記第1のデプスバッファ、前記第2の距離以上の場合には前記第2のデプスバッファのデプスに基づいて、前記レイが前記仮想空間内においてオブジェクトに衝突する衝突位置を判定し、
前記トレース距離が前記第1の距離以内となる範囲内において前記衝突位置が判定された場合に、当該衝突位置に対応する前記フレームバッファ内の画素の色に基づいた色を、前記着目画素の色に加える映り込みの色として決定する、画像処理装置。
【請求項17】
前記プロセッサはさらに、
前記衝突位置に対応する前記フレームバッファ内の画素の色に基づいて前記着目画素の色に加える映り込みの色を、前記第1のデプスバッファに基づいた前記衝突位置と前記第2のデプスバッファに基づいた前記衝突位置とで異なるパラメータに基づいて決定する、請求項16に記載の画像処理装置。
【請求項18】
前記プロセッサはさらに、
第2の種類のオブジェクトについて、フレームバッファへの描画を行わずにレンダリングした画像をテクスチャとして設定した平面オブジェクトを前記仮想空間内の前記第2の種類のオブジェクトの位置に配置し、
前記レイが前記平面オブジェクトと交差する場合に、交差位置の前記テクスチャの色に基づいて前記着目画素の色にさらに加える映り込みの色として決定し、
前記フレームバッファに前記映り込みの色を反映し、
前記映り込みの色を反映した後に、前記第2の種類のオブジェクトをフレームバッファに描画する、請求項16に記載の画像処理装置。
【請求項19】
前記プロセッサはさらに、
前記入射方向と前記反射位置の法線方向に基づいた反射方向に、さらに画面内側向きの補正を加えた方向を前記レイトレース方向として算出する、請求項16に記載の画像処理装置。
【請求項20】
前記第2の種類のオブジェクトは、平たい形状のオブジェクトである、請求項18に記載の画像処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、描画された画像に基づいて反射を表現することが可能な画像処理プログラム、画像処理システム、画像処理方法、および画像処理装置に関する。
【背景技術】
【0002】
従来より、描画された画像に対する処理を行うことで反射を表現する方法がある(例えば、非特許文献1)。
【先行技術文献】
【非特許文献】
【0003】
【文献】“Screen Space Reflection”、[online]、2023年、Unity Technologies、[令和5年12月20日検索]、インターネット<URL:https://docs.unity3d.com/ja/2019.4/Manual/PostProcessing-ScreenSpaceReflection.html>
【発明の概要】
【発明が解決しようとする課題】
【0004】
上記従来技術は描画された画像に対する処理であるため、オブジェクト毎に映り込みの仕方を調整することは困難であった。
【0005】
それ故、本発明の目的は、オブジェクト毎に映り込みの仕方を異ならせることが可能な画像処理プログラム、画像処理システム、画像処理方法、および画像処理装置を提供することである。
【課題を解決するための手段】
【0006】
上記の課題を解決すべく、本発明は、以下の構成を採用した。
【0007】
(第1の構成)
第1の構成の画像処理プログラムは、情報処理装置のコンピュータに、仮想空間内のオブジェクトについて、第1のデプスバッファを用いて第1のデプステストと当該第1のデプスバッファの更新を行わせ、前記第1のデプステストの結果に基づいてフレームバッファに描画を行わせ、前記オブジェクトのうち第1の種類のオブジェクトについてさらに、第2のデプスバッファを用いて第2のデプステストと当該第2のデプスバッファの更新を行わせる。また、画像処理プログラムは、前記コンピュータに、描画が行われた前記フレームバッファの画素ごとに、当該画素を着目画素として、前記第1のデプスバッファのデプスに基づいて、仮想カメラから前記着目画素に対応する前記仮想空間内の位置に向かう方向を入射方向、当該位置を反射位置として反射するレイの方向をレイトレース方向として算出させ、当該レイトレース方向に沿って当該レイをトレースさせ、前記レイのトレース距離が第1の距離より小さい第2の距離未満の場合には前記第1のデプスバッファ、前記第2の距離以上の場合には前記第2のデプスバッファのデプスに基づいて、前記レイが前記仮想空間内においてオブジェクトに衝突する衝突位置を判定させ、前記トレース距離が前記第1の距離以内となる範囲内において前記衝突位置が判定された場合に、当該衝突位置に対応する前記フレームバッファ内の画素の色に基づいた色を、前記着目画素の色に加えさせる映り込みの色として決定させる。
【0008】
上記によれば、トレース距離に応じて参照するデプスバッファを切り替えることで、例えば、オブジェクトによって遠くまで映り込ませることができ、オブジェクト毎に映り込み方を異ならせることができる。
【0009】
(第2の構成)
第2の構成では、上記第1の構成において、前記コンピュータにさらに、前記衝突位置に対応する前記フレームバッファ内の画素の色に基づいて前記着目画素の色に加えさせる映り込みの色を、前記第1のデプスバッファに基づいた前記衝突位置と前記第2のデプスバッファに基づいた前記衝突位置とで異なるパラメータに基づいて決定させてもよい。
【0010】
上記によれば、参照するデプスバッファに応じて異なるパラメータに基づいて、衝突位置に対応する画素の色を着目画素の色に加えることができる。
【0011】
(第3の構成)
第3の構成では、上記第1又は第2の構成において、前記コンピュータにさらに、第2の種類のオブジェクトについて、フレームバッファへの描画を行わずにレンダリングした画像をテクスチャとして設定した平面オブジェクトを前記仮想空間内の前記第2の種類のオブジェクトの位置に配置させ、前記レイが前記平面オブジェクトと交差する場合に、交差位置の前記テクスチャの色に基づいて前記着目画素の色にさらに加えさせる映り込みの色として決定させ、前記フレームバッファに前記映り込みの色を反映させ、前記映り込みの色を反映させた後に、前記第2の種類のオブジェクトをフレームバッファに描画させてもよい。
【0012】
上記によれば、さらに第2の種類のオブジェクトの映り込みを生成することができ、例えば、第2の種類のオブジェクトが前記オブジェクトの手前側に存在する場合でも、前記オブジェクトの映り込みと、第2の種類のオブジェクトの映り込みとを生成することができる。
【0013】
(第4の構成)
第4の構成では、上記第1から第3の構成の何れかにおいて、前記コンピュータにさらに、前記入射方向と前記反射位置の法線方向に基づいた反射方向に、さらに画面内側向きの補正を加えた方向を前記レイトレース方向として算出させてもよい。
【0014】
上記によれば、法線方向に基づく反射方向を補正した方向に基づいてレイトレースを行うことができる。
【0015】
(第5の構成)
第5の構成では、上記第3の構成において、前記第2の種類のオブジェクトは、平たい形状のオブジェクトであってもよい。
【0016】
上記によれば、第2の種類のオブジェクトは平たい形状のオブジェクトであり、映り込みも平面的に見えるため、違和感のない画像とすることができる。
【0017】
また、他の実施形態は、上記画像処理を行う画像処理システムであってもよいし、画像処理装置であってもよいし、画像処理方法であってもよい。
【発明の効果】
【0018】
本発明によれば、オブジェクト毎に映り込みの仕方を異ならせることができる。
【図面の簡単な説明】
【0019】
【
図1】本体装置2に左コントローラ3および右コントローラ4を装着した状態の一例を示す図
【
図2】本体装置2の内部構成の一例を示すブロック図
【
図3】本実施形態のゲームの実行中に仮想空間に配置される複数のオブジェクトの一例を示す図
【
図4】表示装置に表示されるゲーム画像の一例を示す図
【
図5】キャラクタオブジェクト以外のオブジェクトの映り込みに関する画像処理の概要を示す図
【
図7】ステップS2によるレンダリングが行われた後のフレームバッファに描画された画像の一例を示す図
【
図9】レイトレースが行われる様子を示す図であり、反射位置RPaから反射したレイが円柱オブジェクト34に衝突する様子を示した図
【
図10】第1デプスバッファを用いて、反射位置RPaから反射するレイの衝突判定が行われる様子を示す図
【
図11】レイトレースが行われる様子を示す図であり、反射位置RPbから反射したレイが木オブジェクト32に衝突する様子を示した図
【
図12】レイトレースが行われる様子を示す図であり、反射位置RPcから反射したレイがオブジェクトに衝突しない様子を示した図
【
図13】第2デプスバッファを用いて、レイの衝突判定が行われる様子を示す図
【
図14】各画素に映り込む色が加えられたときのフレームバッファに描画される画像の一例を示す図
【
図15】反射方向を補正したレイトレース方向の一例を示す図
【
図16】反射方向に対する補正の詳細を説明するための図
【
図17】円柱オブジェクト34の手前側にキャラクタオブジェクト41が存在しないときのゲーム画像の一例を示す図
【
図18】キャラクタオブジェクト41が移動し、円柱オブジェクト34の手前側にキャラクタオブジェクト41が存在するときのゲーム画像の一例を示す図
【
図19】キャラクタオブジェクト及びその奥側にあるオブジェクトの映り込みを生成するための画像処理の概要を示す図
【
図20】ステップS11で作成されるキャラクタ平面の一例を示す図
【
図21】ステップS13におけるキャラクタの映り込みの色の算出について説明するための図
【
図22】
図19の画像処理が行われた場合に表示されるゲーム画像の一例を示す図
【
図23】本体装置2のメモリに記憶されるデータの一例を示す図
【
図24】本体装置2のプロセッサ81によって実行されるメイン処理の一例を示すフローチャート
【
図25】ステップS105のSSR処理の一例を示すフローチャート
【
図26】ステップS122のレイトレース処理の一例を示すフローチャート
【
図27】ステップS141におけるキャラクタの映り込みの色の算出処理の一例を示すフローチャート
【発明を実施するための形態】
【0020】
(システム構成)
以下、本実施形態の一例に係るゲームシステムについて説明する。本実施形態におけるゲームシステム1の一例は、本体装置(情報処理装置;本実施形態ではゲーム装置本体として機能する)2と左コントローラ3および右コントローラ4とを含む。本体装置2は、左コントローラ3および右コントローラ4がそれぞれ着脱可能である。つまり、ゲームシステム1は、左コントローラ3および右コントローラ4をそれぞれ本体装置2に装着して一体化された装置として利用できる。また、ゲームシステム1は、本体装置2と左コントローラ3および右コントローラ4とを別体として利用することもできる。以下では、本実施形態のゲームシステム1のハードウェア構成について説明し、その後に本実施形態のゲームシステム1の制御について説明する。
【0021】
図1は、本体装置2に左コントローラ3および右コントローラ4を装着した状態の一例を示す図である。
図1に示すように、左コントローラ3および右コントローラ4は、それぞれ本体装置2に装着されて一体化されている。本体装置2は、ゲームシステム1における各種の処理(例えば、ゲーム処理)を実行する装置である。本体装置2は、ディスプレイ12を備える。左コントローラ3および右コントローラ4は、ユーザが入力を行うための操作部を備える装置である。
【0022】
左コントローラ3および右コントローラ4は、本体装置2に着脱可能である。なお、以下において、左コントローラ3および右コントローラ4の総称として「コントローラ」と記載することがある。
【0023】
本体装置2単体または本体装置2に左コントローラ3および右コントローラ4が装着された一体型装置は、携帯型装置となってもよい。また、本体装置2または一体型装置が手持ち型の装置となってもよい。また、本体装置2または一体型装置が可搬型装置となってもよい。
【0024】
また、本体装置2は、ディスプレイ12の画面上にタッチパネル13を備える。本実施形態においては、タッチパネル13は、マルチタッチ入力が可能な方式(例えば、静電容量方式)のものである。ただし、タッチパネル13は、任意の種類のものであってよく、例えば、シングルタッチ入力が可能な方式(例えば、抵抗膜方式)のものであってもよい。
【0025】
図2は、本体装置2の内部構成の一例を示すブロック図である。
【0026】
本体装置2は、プロセッサ81を備える。プロセッサ81は、本体装置2において実行される各種の情報処理を実行する情報処理部であって、1又は複数のCPU(Central Processing Unit)と、1又は複数のGPU(Graphics Processing Unit)とを含む。プロセッサ81は、CPU機能及びGPU機能等の複数の機能を含むSoC(System-on-a-chip)から構成されてもよい。なお、CPUとGPUとがそれぞれ別々のプロセッサとして構成されてもよい。また、プロセッサ81の内部には、一時的にデータを記憶する1又は複数のメモリが設けられる。プロセッサ81は、記憶部(具体的には、フラッシュメモリ84等の内部記憶媒体、あるいは、スロット23に装着される外部記憶媒体等)に記憶される情報処理プログラム(例えば、ゲームプログラム)を実行することによって、各種の情報処理を実行する。
【0027】
本体装置2は、自身に内蔵される内部記憶媒体の一例として、フラッシュメモリ84およびDRAM(Dynamic Random Access Memory)85を備える。フラッシュメモリ84およびDRAM85は、プロセッサ81に接続される。フラッシュメモリ84は、主に、本体装置2に保存される各種のデータ(プログラムであってもよい)を記憶するために用いられるメモリである。DRAM85は、情報処理において用いられる各種のデータを一時的に記憶するために用いられるメモリである。
【0028】
本体装置2は、スロットインターフェース(以下、「I/F」と略記する。)91を備える。スロットI/F91は、プロセッサ81に接続される。スロットI/F91は、スロット23に接続され、スロット23に装着された所定の種類の記憶媒体(例えば、専用メモリカード)に対するデータの読み出しおよび書き込みを、プロセッサ81の指示に応じて行う。
【0029】
プロセッサ81は、フラッシュメモリ84およびDRAM85、ならびに上記各記憶媒体との間でデータを適宜読み出したり書き込んだりして、上記の情報処理を実行する。
【0030】
本体装置2は、ネットワーク通信部82を備える。ネットワーク通信部82は、プロセッサ81に接続される。ネットワーク通信部82は、ネットワークを介して外部の装置と通信(具体的には、無線通信)を行う。本実施形態においては、ネットワーク通信部82は、第1の通信態様としてWi-Fiの規格に準拠した方式により、無線LANに接続して外部装置と通信を行う。また、ネットワーク通信部82は、第2の通信態様として所定の通信方式(例えば、独自プロトコルによる通信や、赤外線通信)により、同種の他の本体装置2との間で無線通信を行う。
【0031】
本体装置2は、コントローラ通信部83を備える。コントローラ通信部83は、プロセッサ81に接続される。コントローラ通信部83は、左コントローラ3および/または右コントローラ4と無線通信を行う。本体装置2と左コントローラ3および右コントローラ4との通信方式は任意であるが、本実施形態においては、コントローラ通信部83は、左コントローラ3との間および右コントローラ4との間で、Bluetooth(登録商標)の規格に従った通信を行う。
【0032】
プロセッサ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は、クレードルを介してデータ(例えば、画像データや音声データ)を据置型モニタ等に出力することができる。
【0033】
本体装置2は、タッチパネル13の制御を行う回路であるタッチパネルコントローラ86を備える。タッチパネルコントローラ86は、タッチパネル13とプロセッサ81との間に接続される。タッチパネルコントローラ86は、タッチパネル13からの信号に基づいて、例えばタッチ入力が行われた位置を示すデータを生成して、プロセッサ81へ出力する。
【0034】
本体装置2は、電力制御部97およびバッテリ98を備える。電力制御部97は、バッテリ98およびプロセッサ81に接続される。また、図示しないが、電力制御部97は、本体装置2の各部(具体的には、バッテリ98の電力の給電を受ける各部、左側端子17、および右側端子21)に接続される。電力制御部97は、プロセッサ81からの指令に基づいて、バッテリ98から上記各部への電力供給を制御する。
【0035】
また、バッテリ98は、下側端子27に接続される。外部の充電装置(例えば、クレードル)が下側端子27に接続され、下側端子27を介して本体装置2に電力が供給される場合、供給された電力がバッテリ98に充電される。
【0036】
(画像処理の概要)
次に、本実施形態の画像処理について説明する。本実施形態のゲームシステム1(画像処理システムの一例)では、3次元の仮想空間に複数のオブジェクトが配置され、ゲームが行われる。
【0037】
図3は、本実施形態のゲームの実行中に仮想空間に配置される複数のオブジェクトの一例を示す図である。本実施形態のゲームが開始されると、xyz直交座標系によって定義される3次元の仮想空間が設定される。例えば、y軸は仮想空間の上方向の軸であり、x軸は、右方向の軸であり、z軸は奥方向の軸である。
【0038】
図3に示されるように、仮想空間には、複数のオブジェクトとして、地面オブジェクト30が配置される。地面オブジェクト30は、地面を模したオブジェクトであり、例えば、xz平面に平行な平面である。なお、地面オブジェクト30は、凹凸を有してもよいし、斜面を有してもよい。地面オブジェクト30上には、木オブジェクト32と、円柱オブジェクト34とが配置される。また、例えば、仮想空間のz軸方向の所定位置には、山オブジェクト36が配置される。これら地面オブジェクト30、木オブジェクト32、円柱オブジェクト34は、仮想空間に固定される。
【0039】
また、仮想空間には、キャラクタオブジェクト41及び43が配置される。キャラクタオブジェクト41及び43は、平たい形状のオブジェクトであり、上下左右方向の長さに比べて厚さ方向の長さが小さい板状のオブジェクトである。例えば、キャラクタオブジェクト41及び43は、それぞれ、前面を構成する平面状のメッシュと背面を構成する平面状のメッシュとを含む3Dオブジェクトである。キャラクタオブジェクト41は、プレイヤによって制御されるプレイヤキャラクタである。キャラクタオブジェクト41は、仮想空間内において、コントローラに対する入力に応じたアクションを行う。例えば、キャラクタオブジェクト41は、アクションとして、地面オブジェクト30上を移動したり、仮想空間内で手足を動かしたり、ジャンプしたり、顔の向きを変化させたりする。キャラクタオブジェクト41が左右方向に移動すると、画面が左右方向にスクロールされる。また、キャラクタオブジェクト43は、キャラクタオブジェクト41の移動に応じて移動するノンプレイヤキャラクタであり、プロセッサ81によって自動制御される。なお、キャラクタオブジェクト43は、プレイヤによって制御されてもよい。
【0040】
仮想空間には、仮想カメラが配置されており、当該仮想カメラから仮想空間を見たゲーム画像が生成され、生成されたゲーム画像がディスプレイ12又は据置型モニタ(以下、これらを「表示装置」という)に表示される。
【0041】
図4は、表示装置に表示されるゲーム画像の一例を示す図である。表示装置には、各オブジェクト(30、32、34、36、41、43)の画像が表示される。例えば地面オブジェクト30は反射面であり、地面オブジェクト30上には各オブジェクトが映り込む。本実施形態では、SSR(スクリーンスペースリフレクション)と呼ばれる方法で、各オブジェクトの映り込みが生成される。
【0042】
例えば、
図4に示されるように、地面オブジェクト30上には、木オブジェクト32の映り込み52と、円柱オブジェクト34の映り込み54とが表示される。また、地面オブジェクト30上には、キャラクタオブジェクト41の映り込み61と、キャラクタオブジェクト43の映り込み63とが表示される。一方、地面オブジェクト30上には、山オブジェクト36の映り込みは表示されない。
【0043】
本実施形態では、木オブジェクト32及び円柱オブジェクト34は、予め特定のオブジェクトとして設定されており、仮想カメラからある程度離れていても地面オブジェクト上に映り込むように設定される。一方、山オブジェクト36は、特定のオブジェクトとして設定されない。
【0044】
特定のオブジェクトは、メッシュ(ポリゴンの集合体)単位で設定される。例えば、木オブジェクト32を構成する複数のメッシュのそれぞれが、特定のオブジェクトとして設定されてもよい。また、木オブジェクト32を構成する複数のメッシュのうちの何れかのメッシュが、特定のオブジェクトとして設定されてもよい。例えば、木オブジェクト32が、幹の部分を構成する第1のメッシュと、葉が茂った部分を構成する第2のメッシュとで構成される場合、第1のメッシュ及び第2のメッシュのうち、第1のメッシュのみが特定のオブジェクトとして設定されてもよい。すなわち、「特定のオブジェクト」は、必ずしも外観上1つに見えるオブジェクトでなくてもよく、外観上1つに見えるオブジェクトのうちの一部を構成するメッシュであってもよい。例えば、xz平面に平行な地面とxz平面に垂直な壁面とが連続的に形成された地形オブジェクトは、外観上、段差を有する1つの地形を形成するように見えるが、地面と壁面とが異なるメッシュにより構成される場合がある。このような地形オブジェクトにおける壁面が、特定のオブジェクトとして設定され、地面は特定のオブジェクトとして設定されなくてもよい。
【0045】
本実施形態では、特定のオブジェクトとして設定された木オブジェクト32及び円柱オブジェクト34が、地面オブジェクト上に映り込む。以下、これらのオブジェクトの映り込みに関する画像処理について説明する。
【0046】
図5は、キャラクタオブジェクト以外のオブジェクトの映り込みに関する画像処理の概要を示す図である。
【0047】
図5に示されるように、プロセッサ81は、まず、第1デプステストを行う(ステップS1)。ここでは、キャラクタオブジェクト以外の全てのオブジェクト(30、32、34、36)について、画素単位でデプステストが行われ、当該デプステストの結果が第1デプスバッファに記憶される。
【0048】
図6は、第1デプスバッファの一例を示す図である。
図6に示されるように、第1デプスバッファには、キャラクタオブジェクト以外の全てのオブジェクト(30、32、34、36)について、画素ごとのデプス値が記憶される。なお、
図6では、各オブジェクトの画像が表示されているが、これは、第1デプスバッファに記憶された各画素のデプス値を概念的に表したものである。各画素の位置は、スクリーン座標系の座標値で表される。例えば、スクリーン座標系のSx軸は、画像(画面)における右方向の軸であり、Sy軸は、画像における上方向の軸である。スクリーン座標系の原点は、例えば、画像の中心に設定されてもよいし、画像の左下に設定されてもよい。
【0049】
図5に戻り、ステップS1の後、プロセッサ81は、第1デプステストの結果に基づいて、フレームバッファへのレンダリングを行う(ステップS2)。ステップS2では、第1デプスバッファに記憶されたデプスに基づいて、フレームバッファに画像が描画される。本実施形態では、レンダリングの方法として、ディファードレンダリング(ディファードシェーディングともいう)が用いられる。ステップS2では、画素毎の法線情報を記憶した法線バッファが更新され、フレームバッファに画像が描画される。なお、レンダリングの方法として、ディファードレンダリングではなく、フォワードレンダリングが用いられてもよい。
【0050】
図7は、ステップS2によるレンダリングが行われた後のフレームバッファに描画された画像の一例を示す図である。
図7に示されるように、ステップS2では、フレームバッファに、キャラクタオブジェクト以外の全てのオブジェクト(30、32、34、36)の画像が描画される。画素毎に、色情報が記憶される。色情報は、例えば、3つの色を表すRGB値と、透明度(あるいは不透明度)を表すアルファ値とを含む。なお、
図7では陰影が省略されているが、ステップS2では、陰影がついた画像が生成される。
【0051】
図5に戻り、ステップS2の後、プロセッサ81は、仮想空間に配置された複数のオブジェクトのうち、特定のオブジェクトについて、さらに第2デプステストを行う(ステップS3)。具体的には、複数のオブジェクト(30、32、34、36)のうち、特定のオブジェクトとして設定された木オブジェクト32及び円柱オブジェクト34について、さらに第2デプステストが行われ、当該第2デプステストの結果が第2デプスバッファに記憶される。これにより、第2デプスバッファには、仮想カメラの撮像範囲に含まれる複数のオブジェクト(30、32、34、36)のうち、木オブジェクト32及び円柱オブジェクト34のみの画素毎のデプス値が記憶される。
【0052】
図8は、第2デプスバッファの一例を示す図である。
図8に示されるように、第2デプスバッファには、木オブジェクト32及び円柱オブジェクト34の画素毎のデプス値が記憶される。一方、山オブジェクト36のデプス値は、第2デプスバッファに記憶されない。なお、
図8は、第2デプスバッファに記憶された各画素のデプス値を概念的に表したものである。
【0053】
図5に戻り、ステップS3の後、プロセッサ81は、第1デプスバッファ又は第2デプスバッファを用いて、レイトレースを行う(ステップS4)。ここでは、画素(以下では「着目画素」という)毎に処理が行われる。具体的には、プロセッサ81は、着目画素を設定し、仮想カメラの位置から着目画素に向かう方向にレイ(仮想的な光線)を飛ばしたときのレイの反射位置を計算し、当該反射位置から反射するレイがオブジェクトと衝突するか否かの衝突判定を行う。
【0054】
次に、プロセッサ81は、レイの衝突位置に対応するフレームバッファ内の画素の色を、着目画素に映り込む色として算出する(ステップS5)。ステップS5の処理も画素毎に行われる。
【0055】
以下、
図7に示される各画素PIXa~PIXcが着目画素として設定された場合のステップS4及びS5の処理について具体的に説明する。
【0056】
例えば、プロセッサ81は、
図7に示される画素PIXaを着目画素として設定する。画素PIXaは、円柱オブジェクト34よりも仮想カメラ側にある画素である。プロセッサ81は、着目画素PIXaのスクリーン座標系における位置と、第1デプスバッファに記憶された当該位置のデプス値とに基づいて、着目画素PIXaの仮想空間における位置を、レイの反射位置RPaとして算出する。
【0057】
図9は、レイトレースが行われる様子を示す図であり、反射位置RPaから反射したレイが円柱オブジェクト34に衝突する様子を示した図である。
図9の右方向は、仮想カメラVCに基づいて生成されたゲーム画像が画面に表示されたときの画面の奥方向である。
【0058】
図9に示されるように、プロセッサ81は、仮想カメラVCの位置から反射位置RPaに向かう方向を入射方向とし、当該反射位置RPaから反射するレイの方向をレイトレース方向RTDaとして算出する。具体的には、プロセッサ81は、入射方向と反射位置RPaの法線とに基づいて、レイの反射方向を算出する。入射方向の入射角と、反射方向の反射角とは等しい。そして、プロセッサ81は、当該反射方向、又は、当該反射方向に補正を加えた方向を、レイトレース方向RTDaとして算出する。なお、反射方向の補正については後に説明する。
【0059】
プロセッサ81は、反射位置RPaからレイトレース方向RTDaにレイを進行させ、レイがオブジェクトと衝突するか否かの衝突判定を行う。プロセッサ81は、レイのトレース距離がLa未満では、第1デプスバッファを用いて衝突判定を行う。ここで、トレース距離は、反射位置からレイトレース方向に沿った距離である。
【0060】
図10は、第1デプスバッファを用いて、反射位置RPaから反射するレイの衝突判定が行われる様子を示す図である。プロセッサ81は、まず、仮想空間における反射位置RPaからレイトレース方向RTDaに最大距離Lbだけ進んだ仮想空間における位置を算出し、当該算出した位置をスクリーン座標系に変換することで、スクリーン座標系におけるレイトレース終了位置を算出する。プロセッサ81は、スクリーン座標系において、反射位置RPa(着目画素RPa)をレイトレース開始位置とし、当該レイトレース開始位置からレイトレース終了位置までレイを伸ばし、レイの先端がオブジェクトと衝突するか否かを判定する。具体的には、プロセッサ81は、レイを所定距離進行させ、レイの先端のデプスと、第1デプスバッファに記憶された各位置のデプスとに基づいて、レイがオブジェクトと衝突するか否かを判定する。
図9及び
図10に示す例では、反射位置RPaで反射したレイが、衝突位置CPaにおいて衝突すると判定される。
【0061】
レイが衝突位置CPaにおいてオブジェクトと衝突すると判定された場合、ステップS5において、当該衝突位置CPaに対応するフレームバッファの画素の色が、着目画素RPaに映り込む色として算出される。
【0062】
次に、
図7に示される画素PIXbが着目画素として設定される場合と、画素PIXcが着目画素として設定される場合とについて説明する。画素PIXbは、木オブジェクト32よりも仮想カメラ側にある画素である。また、画素PIXcは、山オブジェクト36よりも仮想カメラ側にある画素である。
【0063】
図11は、レイトレースが行われる様子を示す図であり、反射位置RPbから反射したレイが木オブジェクト32に衝突する様子を示した図である。
図12は、レイトレースが行われる様子を示す図であり、反射位置RPcから反射したレイがオブジェクトに衝突しない様子を示した図である。
図13は、第2デプスバッファを用いて、レイの衝突判定が行われる様子を示す図である。
【0064】
図11に示されるように、プロセッサ81は、画素PIXbを着目画素として設定した場合、上記と同様に、着目画素PIXbに対応する反射位置RPbを算出し、反射位置RPbから反射するレイの方向を、レイトレース方向RTDbとして算出する。プロセッサ81は、レイトレース方向RTDbにレイを進行させ、レイがオブジェクトと衝突するか否かの衝突判定を行う。プロセッサ81は、トレース距離がLa未満のときは、第1デプスバッファを用いてレイの衝突判定を行うが、トレース距離がLa未満のときは、レイはオブジェクトと衝突しない。このため、プロセッサ81は、さらにレイを進行させ、第2デプスバッファを用いて、レイの衝突判定を行う(
図13)。
図11及び
図13に示されるように、トレース距離がLa以上であり、かつ、最大距離Lb以下であるときに、レイは衝突位置CPbにおいて木オブジェクト32と衝突すると判定される。
【0065】
一方、
図12に示されるように、プロセッサ81は、画素PIXcを着目画素として設定した場合、上記と同様に、着目画素PIXcに対応する反射位置RPcを算出し、反射位置RPcから反射するレイの方向をレイトレース方向RTDcとして算出し、当該レイトレース方向RTDbにレイを進行させる。プロセッサ81は、トレース距離がLa未満のときは、第1デプスバッファを用いてレイの衝突判定を行い、トレース距離がLa以上であり、かつ、最大距離Lb以下であるときは、第2デプスバッファを用いてレイの衝突判定を行う。ここで、
図13に示されるように、第2デプスバッファには山オブジェクト36のデプスは記憶されていない。このため、
図12及び
図13に示されるように、プロセッサ81は、レイを最大距離Lbまで進行させても、レイはオブジェクトと衝突しないと判定する。
【0066】
なお、第1デプスバッファに基づいてレイの衝突位置が算出された場合と、第2デプスバッファに基づいてレイの衝突位置が算出された場合とで、衝突位置の画素の色を着目画素の色に加える際のパラメータを異ならせてもよい。例えば、第2デプスバッファに基づいて衝突位置が算出された場合は、第1デプスバッファに基づいて衝突位置が算出された場合よりも、映り込みの色が濃くなるようにパラメータが変更されてもよい。
【0067】
各着目画素について上述したステップS4及びS5の処理が行われることにより、各着目画素に映り込む色が決定される。そして、各着目画素の色に、決定された映り込む色を加えることで、各オブジェクトの映り込みがフレームバッファに描画されることになる。
【0068】
図14は、各画素に映り込む色が加えられたときのフレームバッファに描画される画像の一例を示す図である。
【0069】
図14に示されるように、画素RPaに対して、上述のように算出された衝突位置CPaの画素の色が加えられる。円柱オブジェクト34の手前側の領域(仮想カメラ側の領域)に含まれる各画素に対して同様の処理が行われることで、円柱オブジェクト34の映り込み54がフレームバッファに描画される。また、画素RPbに対して、衝突位置CPbの画素の色が加えられる。木オブジェクト32の手前側の領域に含まれる各画素に対して同様の処理が行われることで、木オブジェクト32の映り込み52がフレームバッファに描画される。一方、画素RPcについては、衝突位置は算出されない。山オブジェクト36の手前側の領域に含まれる各画素に対して処理が行われる場合も同様である。このため、山オブジェクト36の映り込みはフレームバッファには描画されない。
【0070】
このように、本実施形態では、複数のオブジェクトについて第1デプステストを行った結果を第1デプスバッファに記憶し、複数のオブジェクトのうちの特定のオブジェクトについて第2デプステストを行った結果を第2デプスバッファに記憶する。トレース距離がLa未満のときは、第1デプスバッファに基づいてレイの衝突判定を行い、トレース距離がLa以上、かつ、最大距離Lb以下のときは、第2デプスバッファに基づいてレイの衝突判定を行う。これにより、SSRを用いて、複数のオブジェクトのうちの特定のオブジェクトについては、仮想カメラから離れている場合でも、映り込みを表示させ、特定のオブジェクト以外のオブジェクトについては、映り込みを表示させないようにすることができる。映り込ませたいオブジェクトを特定のオブジェクトに指定することで、所望のオブジェクトを例えば地面に映り込ませることができる。逆に、映り込ませたくないオブジェクトを特定のオブジェクトに指定しないことで、所望のオブジェクトを、映り込ませないようにすることができる。
【0071】
また、第1デプスバッファに基づいてレイの衝突位置が算出された場合と、第2デプスバッファに基づいてレイの衝突位置が算出された場合とで、衝突位置の画素の色を着目画素に映り込ませる際のパラメータを異ならせる。これにより、例えば、特定のオブジェクトをより濃く、はっきりと映り込ませることができる。
【0072】
(反射方向の補正)
次に、反射方向の補正について説明する。上述のように、仮想カメラVCから反射位置に向かう方向が入射方向として算出され、当該入射方向と反射位置の法線方向とに基づいて、反射方向が算出される。本実施形態では、補正条件が満たされる場合に、反射方向を補正した方向が、レイトレース方向として設定される。補正条件が満たされない場合、反射方向が、レイトレース方向として設定される。以下、反射方向が補正される補正条件、及び、補正の方法について具体的に説明する。
【0073】
図15は、反射方向を補正したレイトレース方向の一例を示す図である。
図15に示されるように、例えば、画面の左端に近い着目画素(反射位置RP1)についてレイトレースが行われる場合、入射方向と法線方向とに基づいて算出される反射方向RD1が補正され、補正後の方向が、レイトレース方向RTD1として設定される。また、反射位置RP1よりも画面の右側にある着目画素(反射位置RP2)についてレイトレースが行われる場合も、反射方向RD2が補正され、補正後の方向が、レイトレース方向RTD2として設定される。
【0074】
補正条件は、反射位置に関する条件と、反射方向に関する条件の両方が成立する場合に、満たされる。反射位置に関する条件は、反射位置が画面の端から所定範囲にあることである。また、反射方向に関する条件は、反射方向が画面の外側を向いていることである。反射位置に関する条件、及び、反射方向に関する条件のうち一方が成立しない場合、補正条件は満たされず、反射方向は補正されない。例えば、反射位置が画面の左端から画面の左右方向の長さの1/4までの範囲にあり、かつ、反射方向が画面の左方向を向いている場合、補正条件が満たされる。また、反射位置が画面の右端から1/4までの範囲にあり、かつ、反射方向が画面の右方向を向いている場合、補正条件が満たされる。
【0075】
画面の左端に近い反射位置RP1の方が、反射位置RP2よりも補正の度合いが大きい。具体的には、反射位置のスクリーン座標系のSx軸方向における位置に基づいて、補正の度合いCRが決定される。反射位置のSx軸方向における位置が、画面の左端又は右端に近いほど、補正の度合いCRが大きくなる。また、スクリーン座標系における反射方向とSy軸方向との角度が大きいほど、補正の度合いCRは小さくなる。
【0076】
図16は、反射方向に対する補正の詳細を説明するための図である。
図16に示されるように、例えば、反射方向RDと画面の上方向(Sy軸方向)との角度が45度以下である場合、補正の度合いCRは、反射位置RPのSx座標値に応じた値CR(Sx)に設定される。CR(Sx)は、例えば、0~1の範囲で設定され、反射位置が画面の左端又は右端に近いほど大きくなる。反射方向RDと画面の上方向との角度が45度を超える場合、その超えた角度に応じて、反射位置RPのSx座標値に応じた値CR(Sx)が小さくなる。反射方向RDと画面の上方向との角度が閾値(例えば、60度~65度)を超える場合、補正の度合いCRは、「0」に設定される。
【0077】
補正の度合いCRに応じて、反射方向に、画面内側向きの補正が加えられる。具体的には、仮想空間における反射位置RPから反射方向RDに最大距離Lbだけ進んだ位置をスクリーン座標系に変換した位置が、レイトレース終了位置EPとして算出される。このレイトレース終了位置EPのSx座標値が、補正の度合いCRに応じて、画面の内側方向に移動するように補正される。例えば、線形補完により、レイトレース終了位置EPのSx座標値が、反射位置RPのSx座標値に近づくように補正される。例えば、反射位置RPが画面の左端から所定範囲に位置している場合、レイトレース終了位置EPは、補正の度合いCRに応じて、右方向(Sx軸正方向)に移動される。レイトレース終了位置EPのSx座標値は、反射位置RPのSx座標値を超えて移動されない。また、レイトレース終了位置EPのSy座標値については、補正前後で変化しない。そして、反射位置EPから、移動後のレイトレース終了位置EP‘に向かう方向が、レイトレース方向RTDとして算出される。
【0078】
このように、画面の端に近い領域においては、反射方向を補正した方向がレイトレース方向として算出される。これにより、画面の端において、SSRによる映り込みを生成することができる。例えば、
図15に示されるように、画面の左端にある位置RP1の画素について、反射方向RD1にレイトレースが行われる場合、レイの衝突位置が画面の外側になる場合があり、衝突位置の画素の色を、位置RP1の画素に加えることができない。このため、反射方向に対して補正が行われない場合は、画面の端の部分が、他の部分と異なる色になってしまい、違和感のある画像になってしまう場合がある。
【0079】
本実施形態では、入射方向と法線方向とに基づく反射方向が補正され、補正後の方向がレイトレース方向として設定されるため、レイの衝突位置を画面内に収め易くすることができ、レンダリングした画像に基づいて映り込みを生成することができる。レイトレース終了位置EPのSx座標値は、反射位置RPのSx座標値に近づくように移動される。このため、画面の外側を向く反射方向が、最大の補正が行われても、画面の内側を向く方向とはならず、画面の上方向となる。したがって、例えば、画面の左端の位置の画素に、それよりも右側の画素の色が映り込まない。これにより、不自然にオブジェクトが歪められて地面に映り込むことを防止することができる。
【0080】
また、本実施形態では、反射位置が画面の端に近いほど補正の度合いが大きくなる。このため、画面の端の近傍でも、画面内の画素に基づいて映り込みを生成することができる。
【0081】
また、例えば、反射方向が画面の内側を向いている場合において、反射方向が補正された場合、実際の映り込みとはかけ離れた映り込みになることがある。本実施形態では、反射方向が画面の外側を向いていない場合、反射方向の補正は行われないため、実際の映り込みとかけ離れた映り込みが生成されることを防止することができる。
【0082】
また、反射方向と画面の上方向との角度が比較的大きい場合(例えば45度を超える場合)、補正の度合いCRは小さくなる。反射方向と画面の上方向との角度が閾値を超えると、補正の度合いが0になる。これにより、例えば、地面が斜面になっている場合に、補正の度合いが大きすぎて不自然な映り込みが生成されることを防止することができる。また、反射方向が横方向となる壁面への映り込みに対する補正を抑制することができる。
【0083】
また、本実施形態では、反射方向の補正は、スクリーン座標系における左右方向の成分についてのみ行われる。このため、例えば、画面の左右方向に仮想空間が広がり、横方向にスクロールされるゲームに適している。
【0084】
(キャラクタオブジェクトの映り込みの生成)
次に、キャラクタオブジェクト41及び43の映り込みを生成する方法について説明する。
図17は、円柱オブジェクト34の手前側にキャラクタオブジェクト41が存在しないときのゲーム画像の一例を示す図である。
図18は、キャラクタオブジェクト41が移動し、円柱オブジェクト34の手前側にキャラクタオブジェクト41が存在するときのゲーム画像の一例を示す図である。
【0085】
図17に示されるように、円柱オブジェクト34の手前側にキャラクタオブジェクト41が存在しない場合、例えば、手前側の反射位置RPdからレイトレースが行われ、衝突位置CPdが算出され、当該衝突位置CPdの色が、反射位置RPdの色に加えられる。各画素に対して同様の処理が行われることで、円柱オブジェクト34の映り込み54が表示される。
【0086】
一方、
図18では、円柱オブジェクト34の手前側にキャラクタオブジェクト41が存在し、
図17と同じ位置CPdにキャラクタオブジェクト41の頭部が存在する。この場合、反射位置RPdの画素には、
図17に示す円柱オブジェクト34の衝突位置CPdの画素の色を加えることができず、反射位置RPdには円柱オブジェクト34の一部が映り込まない。このように、例えば、キャラクタオブジェクト41が円柱オブジェクト34の手前に位置するときは、本来の各オブジェクトの位置関係に応じた自然な映り込みを表現することができない場合がある。
【0087】
本実施形態では、キャラクタオブジェクト及びその奥側にあるオブジェクトの映り込みを表示するために、
図19に示す方法で画像処理が行われる。
図19は、キャラクタオブジェクト及びその奥側にあるオブジェクトの映り込みを生成するための画像処理の概要を示す図である。
【0088】
図19に示されるように、プロセッサ81は、まず、キャラクタオブジェクト以外のオブジェクトのレンダリングを行う(ステップS10)。ここでは、仮想空間に配置された複数のオブジェクト30、32、34、36をフレームバッファに描画する処理が行われる。ステップS10の処理は、
図5のステップS1~S2の処理である。
【0089】
次に、プロセッサ81は、キャラクタオブジェクトを別バッファにレンダリングして、当該レンダリングした画像をテクスチャとして設定したキャラクタ平面を作成する(ステップS11)。
【0090】
図20は、ステップS11で作成されるキャラクタ平面の一例を示す図である。
図20に示されるように、キャラクタオブジェクト41が別バッファにレンダリングされ、当該キャラクタオブジェクト41をレンダリングした画像が、2次元の平面オブジェクトにテクスチャとして設定されることにより、キャラクタ平面65が作成される。同様に、キャラクタオブジェクト43をレンダリングした画像をテクスチャとして設定したキャラクタ平面66が作成される。本実施形態では、各キャラクタオブジェクトをレンダリングした画像が、毎フレーム生成される。なお、各キャラクタオブジェクトをレンダリングした画像は、予め用意されてもよい。例えば、キャラクタオブジェクト41の各アクションに応じた画像が予め記憶媒体に記憶され、当該予め記憶された画像をテクスチャとして設定したキャラクタ平面65が作成されてもよい。
【0091】
次に、プロセッサ81は、キャラクタオブジェクト以外のオブジェクトの映り込みの色を算出する(ステップS12)。ここでは、仮想空間に配置された複数のオブジェクト30、32、34、36について、映り込みの色が算出される。具体的には、プロセッサ81は、上述した
図5のステップS3~S5の処理を行う。この時点では、キャラクタオブジェクトはフレームバッファに描画されていないため、仮想空間において仮想カメラVCから見てオブジェクトの手前側にキャラクタオブジェクトが存在する場合であっても、当該オブジェクトの映り込みの色を算出することができる。算出されたキャラクタオブジェクト以外のオブジェクトの映り込みの色(以下では、「第1の映り込みの色」という)は、映り込みバッファに記憶される。例えば、映り込みバッファには、第1の映り込みの色を示す色情報として、RGB値とアルファ値とが記憶される。
【0092】
次に、プロセッサ81は、キャラクタの映り込みの色を算出する(ステップS13)。ここでは、プロセッサ81は、ステップS11で作成されたキャラクタ平面を仮想空間に配置したときのキャラクタオブジェクトの映り込みの色を算出する。
【0093】
図21は、ステップS13におけるキャラクタの映り込みの色の算出について説明するための図である。
図21に示されるように、プロセッサ81は、仮想空間におけるキャラクタオブジェクト41の位置及び姿勢に応じてキャラクタ平面65を仮想空間に配置したときの当該キャラクタ平面65とレイとの交差位置を算出する。具体的には、プロセッサ81は、キャラクタ平面65を仮想空間に配置したときのデプスを計算し、反射位置RPeからレイトレース方向RTDeに向かうレイとキャラクタ平面65との交差位置CRPeを算出する。交差位置CRPeにおける画素の色が、キャラクタの映り込みの色(以下では、「第2の映り込みの色」という)として算出される。ここで、キャラクタ平面65のうち、キャラクタオブジェクト41の画像以外の部分については透明に設定され、レイと交差しない。例えば、反射位置RPfからレイトレース方向RTDfに向かうレイは、キャラクタ平面65のうちのキャラクタオブジェクト41の画像とは交差しない。この場合、交差位置は算出されない。算出された第2の映り込みの色は、映り込みバッファに記憶される。例えば、映り込みバッファには、第2の映り込みの色を示す色情報として、RGB値とアルファ値とが記憶される。
【0094】
図19に戻り、プロセッサ81は、次に、ステップS12の結果とステップS13の結果とに基づいて、着目画素に映り込む色を算出する(ステップS14)。例えば、第1の映り込みの色に、第2の映り込みの色が加えられることにより、着目画素に映り込む色が算出される。ここで、「第1の色に第2の色を加える」とは、2つの色を混合することであってもよい。例えば、「第1の色に第2の色を加える」とは、第1の色を背景色とし、第2の色を前景色とするアルファブレンドを行うことであってもよい。また、「第1の色に第2の色を加える」とは、第2の色を背景色とし、第1の色を前景色とするアルファブレンドを行うことであってもよい。また、「第1の色に第2の色を加える」とは、第1の色と第2の色とをそれぞれのアルファ値に基づいて混合することであってもよい。また、「第1の色に第2の色を加える」とは、第2の色が第1の色よりも優先され、第1の色に第2の色を上塗りすることであってもよい。
【0095】
次に、プロセッサ81は、ステップS14で算出した結果をフレームバッファにレンダリングする(ステップS15)。ここでは、プロセッサ81は、フレームバッファに記憶された着目画素の色に、ステップS14で算出した映り込む色を加える。例えば、プロセッサ81は、着目画素の色を背景色とし、ステップS14で算出した映り込む色を前景色としたアルファブレンドを行う。これにより、フレームバッファに、キャラクタオブジェクト及びキャラクタオブジェクト以外のオブジェクトの映り込みが描画される。
【0096】
ステップS15の処理が行われた後、プロセッサ81は、キャラクタオブジェクト41及び43をフレームバッファにレンダリングする(ステップS16)。これにより、
図22に示されるようなゲーム画像が生成されて表示装置に表示される。
【0097】
図22は、
図19の画像処理が行われた場合に表示されるゲーム画像の一例を示す図である。
図22に示されるように、木オブジェクト32及びその映り込み52が表示される。また、キャラクタオブジェクト43及びその映り込み63も表示される。また、円柱オブジェクト34及びその映り込み54が表示される。円柱オブジェクト34の手前側にはキャラクタオブジェクト41が存在し、キャラクタオブジェクト41及びその映り込み61が表示される。円柱オブジェクト34の映り込み54と、キャラクタオブジェクト41の映り込み61とは一部が重なるが、これらは何れも実際の形状および位置関係に応じた形状となり、自然な映り込みを表現することができる。
【0098】
本実施形態では、キャラクタオブジェクトは平たい形状のオブジェクトである。上述のように、キャラクタオブジェクトの画像をテクスチャとして設定したキャラクタ平面に基づいて、キャラクタオブジェクトの映り込みを生成する場合、キャラクタオブジェクトの映り込みが平面的に見えてしまう。キャラクタオブジェクト自体がある程度の厚さを有する立体的なオブジェクトである場合、その映り込みが平面的に見えると違和感のある画像になる可能性があるが、本実施形態では、キャラクタオブジェクト自体が平たい形状のオブジェクトであるため、違和感のない画像とすることができる。
【0099】
(画像処理の詳細)
次に、上述した画像処理の詳細について説明する。まず、本体装置2のメモリ(プロセッサ81内のメモリ、DRAM85、フラッシュメモリ84、又は外部記憶媒体等)に記憶されるデータについて説明する。
図23は、本体装置2のメモリに記憶されるデータの一例を示す図である。
【0100】
図23に示されるように、本体装置2のメモリには、プログラムと、操作データと、オブジェクトデータと、キャラクタデータと、キャラクタ平面データとが記憶される。また、本体装置2のメモリには、第1デプスバッファと、第2デプスバッファと、法線バッファと、映り込みバッファと、フレームバッファとが記憶される。
【0101】
プログラムは、後述するメイン処理を実行するためのプログラムであり、上述した映り込みに関する画像処理を行う画像処理プログラムを含む。プログラムは、スロット23に装着される外部記憶媒体又はフラッシュメモリ84に予め記憶されており、ゲームの実行時にDRAM85に読み込まれる。なお、プログラムは、ネットワーク(例えばインターネット)を介して他の装置から取得されてもよい。
【0102】
操作データは、左コントローラ3及び右コントローラ4から取得された操作に関するデータである。例えば、操作データは、左コントローラ3及び右コントローラ4から所定の時間間隔(例えば、1/200秒間隔)で本体装置2に送信され、メモリに記憶される。
【0103】
オブジェクトデータは、仮想空間に配置されたキャラクタオブジェクト以外の各オブジェクト(30、32、34、36)に関するデータである。オブジェクトデータは、各オブジェクトの仮想空間における位置や姿勢に関するデータと、形状に関するデータと、テクスチャに関するデータとを含む。また、オブジェクトデータは、各オブジェクトが特定のオブジェクトとして設定されているか否かに関する情報を含む。例えば、木オブジェクト32及び円柱オブジェクト34は、特定のオブジェクトとして設定される。一方、山オブジェクト36は、特定のオブジェクトとして設定されない。
【0104】
キャラクタデータは、キャラクタオブジェクト41,43に関するデータである。キャラクタデータは、各キャラクタの仮想空間における位置や姿勢に関するデータと、形状に関するデータと、テクスチャに関するデータとを含む。本実施形態では、各キャラクタオブジェクトは、3Dモデルとして形成されているが、上下左右方向に比べて厚さ方向が薄い平面的なオブジェクトとして形成されている。
【0105】
キャラクタ平面データは、2次元のオブジェクトであり、キャラクタオブジェクトをレンダリングした画像をテクスチャとして設定した平面オブジェクトに関するデータである。キャラクタ平面データは、キャラクタオブジェクト41の画像をテクスチャとして設定したキャラクタ平面65に関するデータと、キャラクタオブジェクト43の画像をテクスチャとして設定したキャラクタ平面66に関するデータとを含む。
【0106】
第1デプスバッファは、第1デプステストの結果に基づいて生成・更新される画素毎のデプス値を記憶したバッファである。第1デプスバッファには、仮想カメラVCの撮像範囲に含まれるキャラクタオブジェクト以外の全てのオブジェクトのデプス値が記憶される。
【0107】
第2デプスバッファは、第2デプステストの結果に基づいて生成・更新される画素毎のデプス値を記憶したバッファである。第2デプスバッファには、仮想カメラVCの撮像範囲に含まれる特定のオブジェクトのデプス値が記憶される。
【0108】
法線バッファは、各画素の法線情報を記憶したバッファである。
【0109】
映り込みバッファは、上記第1の映り込みの色(キャラクタオブジェクト以外のオブジェクトの映り込みの色)及び上記第2の映り込みの色(キャラクタオブジェクトの映り込みの色)を記憶するためのバッファである。映り込みバッファには、後述するレイトレース処理において、レイがキャラクタオブジェクト以外のオブジェクトと衝突した場合に、第1の映り込みの色が記憶され、レイとキャラクタ平面とが交差する場合に、第2の映り込みの色が記憶される。詳細は後述するが、映り込みバッファには、複数の映り込みの色が記憶される場合がある。
【0110】
フレームバッファは、表示されるゲーム画像を格納するバッファである。フレームバッファに記憶された画像が、所定のタイミングで表示装置に出力され、表示装置において表示される。
【0111】
(本体装置2におけるゲーム処理の詳細)
次に、
図24から
図27を参照して、本体装置2において行われる処理の詳細について説明する。
図24は、本体装置2のプロセッサ81によって実行されるメイン処理の一例を示すフローチャートである。
図24から
図27に示す処理は、プロセッサ81のCPU又はGPUによって行われる。
【0112】
図24に示されるように、プロセッサ81は、まず、初期処理を実行する(ステップS100)。具体的には、プロセッサ81は、3次元の仮想空間を設定し、仮想空間に各オブジェクト(30、32、34、36)、各キャラクタオブジェクト(41,43)、仮想カメラVC、光源、その他のゲームに用いられる各種オブジェクトを配置する。プロセッサ81は、初期処理を実行した後、次のステップS101~ステップS108の処理を所定のフレーム時間間隔(例えば、1/60秒間隔)で繰り返し実行する。
【0113】
ステップS101において、プロセッサ81は、コントローラからの操作データを取得する。
【0114】
次に、プロセッサ81は、取得した操作データに基づいて、ゲーム処理を行う(ステップS102)。例えば、プロセッサ81は、操作データに基づいて、キャラクタオブジェクト41を仮想空間内で移動させたり、キャラクタオブジェクト41に所定のアクション(例えば、ジャンプアクション、攻撃アクション等)を行わせたりする。また、プロセッサ81は、所定のアルゴリズムに従ってキャラクタオブジェクト43を仮想空間内で移動させたり、キャラクタオブジェクト43に所定のアクションを行わせたりする。また、プロセッサ81は、キャラクタオブジェクト以外の敵オブジェクトを仮想空間内で制御したり、キャラクタオブジェクトの障害となる障害オブジェクトを仮想空間内で移動させたりする。
【0115】
次に、プロセッサ81は、キャラクタオブジェクト以外のオブジェクトのレンダリング処理を行う(ステップS103)。具体的には、プロセッサ81は、仮想カメラVCの撮像範囲に含まれるキャラクタオブジェクト41、43以外の各オブジェクトについて、第1デプステストを行い、第1デプスバッファを更新する。また、プロセッサ81は、第1デプスバッファに記憶されたデプスに基づいて、各オブジェクトをフレームバッファに描画する。本実施形態では、レンダリングの方法としてディファードレンダリングが用いられる。ステップS103では、法線バッファの更新も行われる。なお、レンダリングの方法としてフォワードレンダリングが用いられてもよい。
【0116】
次に、プロセッサ81は、キャラクタオブジェクトを別バッファにレンダリングして、キャラクタ平面を作成する(ステップS104)。具体的には、プロセッサ81は、キャラクタオブジェクト41を別バッファにレンダリングし、当該別バッファにレンダリングされたキャラクタオブジェクト41の画像をテクスチャとして平面オブジェクトに設定することにより、キャラクタ平面65を作成する。また、プロセッサ81は、同様に、キャラクタオブジェクト43の画像をテクスチャとして平面オブジェクトに設定したキャラクタ平面66を作成する。
【0117】
ステップS104の後、プロセッサ81は、SSR処理を行う(ステップS105)。SSR処理は、キャラクタオブジェクトを含む全てのオブジェクトの映り込みをフレームバッファに描画するための処理である。以下、SSR処理の詳細について説明する。
【0118】
(SSR処理)
図25は、ステップS105のSSR処理の一例を示すフローチャートである。
【0119】
図25に示されるように、プロセッサ81は、特定のオブジェクトに対して第2デプステストを行い、第2デプスバッファを更新する(ステップS121)。例えば、プロセッサ81は、予め特定のオブジェクトとして設定された木オブジェクト32及び円柱オブジェクト34に対して、デプステストを行い、第2デプスバッファを更新する。なお、特定のオブジェクトの設定は、メッシュ単位で行われる。
【0120】
次に、プロセッサ81は、レイトレース処理を行う(ステップS122)。レイトレース処理は、各着目画素に対して行われる。ここでは、各着目画素への映り込みの色が算出される。なお、レイトレース処理は、全ての画素について行われてもよいし、特定の範囲の画素についてのみ行われてもよい。たとえば、モデルが描画されていない部分、モデルやメッシュ単位でSSRが無効に設定されている部分、法線方向が特定の範囲外の部分等を除外することで負荷を軽減するようにしてもよい。以下、レイトレース処理の詳細について説明する。
【0121】
(レイトレース処理)
図26は、ステップS122のレイトレース処理の一例を示すフローチャートである。
【0122】
図26に示されるように、プロセッサ81は、着目画素の仮想空間における位置を反射位置として算出し、反射方向を算出する(ステップS131)。具体的には、プロセッサ81は、着目画素のスクリーン座標系における位置と、第1デプスバッファに記憶された着目画素のデプスとに基づいて、着目画素の仮想空間における位置を、反射位置として算出する。また、プロセッサ81は、仮想カメラVCの位置から反射位置に向かう方向を入射方向とし、当該入射方向と反射位置の法線方向とに基づいて、反射方向を算出する。
【0123】
次に、プロセッサ81は、算出した反射方向、又は、反射方向を補正した方向をレイトレース方向として設定する(ステップS132)。ここでは、補正条件が満たされる場合は、反射方向を補正した方向がレイトレース方向として設定され、補正条件が満たされない場合は、反射方向がレイトレース方向として設定される。また、レイトレース終了位置が設定される。補正条件および補正の方法については、上述した通りである。
【0124】
ステップS132の後、プロセッサ81は、判定用デプスバッファとして第1デプスバッファを設定し、着目画素からレイトレースを開始する(ステップS133)。レイトレースはスクリーン座標系で行われる。次に、プロセッサ81は、レイを所定距離進める(ステップS134)。
【0125】
続いて、プロセッサ81は、トレース距離が最大距離Lbを超えたか否かを判定する(ステップS135)。具体的には、プロセッサ81は、スクリーン座標系におけるレイの先端がレイトレース終了位置に到達したか否かを判定する。
【0126】
トレース距離がLbを超えたと判定した場合(ステップS135:YES)、プロセッサ81は、次にステップS141の処理を行う。
【0127】
一方、トレース距離がLb以下である場合(ステップS135:NO)、プロセッサ81は、レイがオブジェクトと衝突したか否かを判定する(ステップS136)。具体的には、プロセッサ81は、判定用デプスバッファを用いて、レイの先端がオブジェクトと衝突したか否かを判定する。
【0128】
レイがオブジェクトと衝突していないと判定した場合(ステップS136:NO)、プロセッサ81は、トレース距離がLa以上か否かを判定する(ステップS137)。
【0129】
トレース距離がLa以上である場合(ステップS137:YES)、プロセッサ81は、判定用デプスバッファを第2デプスバッファに変更し(ステップS138)、再びステップS134の処理を実行する。一方、トレース距離がLa未満である場合(ステップS137:NO)、プロセッサ81は、判定用デプスバッファを維持したまま、ステップS134の処理を再び実行する。
【0130】
一方、レイがオブジェクトと衝突したと判定した場合(ステップS136:YES)、プロセッサ81は、レイの衝突位置の色から第1の映り込みの色を算出する(ステップS139)。例えば、プロセッサ81は、フレームバッファに記憶された衝突位置の画素の色を第1の映り込みの色として算出してもよいし、衝突位置の画素の色に所定の処理を加えた色を第1の映り込みの色として算出してもよい。第1デプスバッファに基づいて衝突したと判定された場合と第2デプスバッファに基づいて衝突したと判定された場合とで、第1の映り込みの色が異なる。例えば、判定用デプスバッファとして第1デプスバッファが設定されている場合、トレース距離に応じて、衝突位置の画素の色を薄く変化させ(アルファ値を小さくし)、当該変化させた色を第1の映り込みの色として算出してもよい。また、判定用デプスバッファとして第2デプスバッファが設定されている場合、トレース距離に関わらず、衝突位置の画素の色を、第1の映り込みの色として算出してもよい。また、判定用デプスバッファとして第2デプスバッファが設定されている場合、トレース距離に応じて衝突位置の画素の色を薄く変化させるが、判定用デプスバッファとして第1デプスバッファが設定されている場合よりは濃くなるように変化させ、当該変化させた色を、第1の映り込みの色として算出してもよい。そして、プロセッサ81は、算出した第1の映り込みの色を映り込みバッファに記憶する。ここで、第1デプスバッファに基づいてレイが衝突したと判定された場合に映り込みバッファに記憶される第1の映り込みの色を、「第1の映り込みの色(第1デプスバッファ)」と表記する。また、第2デプスバッファに基づいてレイが衝突したと判定された場合に映り込みバッファに記憶される第1の映り込みの色を、「第1の映り込みの色(第2デプスバッファ)」と表記する。
【0131】
次に、プロセッサ81は、判定用デプスバッファが第1デプスバッファであり、かつ、ステップS139で算出した第1の映り込みの色が半透明か否かを判定する(ステップS140)。例えば、トレース距離がLa以下であり、かつ、第1の映り込みの色が半透明である場合は、さらに奥側にレイトレースが行われる。半透明であるということは、映り込みのアルファ値が1.0未満であるということであるが、アルファ値は距離La、衝突位置、その他各種パラメータに基づいて独自に算出される。
【0132】
ステップS140でNOと判定した場合、プロセッサ81は、ステップS141に処理を進める。ステップS140でYESと判定した場合、プロセッサ81は、ステップS138に処理を進める。
【0133】
ステップS141において、プロセッサ81は、キャラクタオブジェクトの映り込みの色(第2の映り込みの色)を算出する。以下、ステップS141の処理の詳細について説明する。
【0134】
図27は、ステップS141におけるキャラクタの映り込みの色の算出処理の一例を示すフローチャートである。
【0135】
図27に示されるように、プロセッサ81は、レイとキャラクタ平面との交差位置を算出する(ステップS151)。具体的には、プロセッサ81は、キャラクタ平面をキャラクタオブジェクトの仮想空間における位置及び姿勢に応じて配置したときのデプスを算出し、上記レイトレースに用いられたレイと、キャラクタ平面とが交差するか否かを判定する。レイがキャラクタ平面と交差する場合、プロセッサ81は、その交差位置を算出する。
【0136】
次に、プロセッサ81は、交差位置の色を第2の映り込みの色として映り込みバッファに記憶する(ステップS152)。具体的には、プロセッサ81は、交差位置に対応するキャラクタオブジェクトのテクスチャ画像の画素の色に基づく色を、第2の映り込みの色として記憶する。なお、第2の映り込みの色は、キャラクタオブジェクトのテクスチャ画像の画素の色であってもよいし、当該画素の色に所定の処理を加えて算出した色であってもよい。プロセッサ81は、ステップS152の処理を行った場合、
図27に示す処理を終了し、処理を
図26に戻す。なお、レイが複数のキャラクタ平面と交差する場合、複数の第2の映り込みの色が映り込みバッファに記憶される。この場合、複数の第2の映り込みの色は、交差位置が仮想カメラに近い順に、映り込みバッファに記憶されてもよい。
【0137】
ステップS139及びステップS152の処理が行われることにより、映り込みバッファには、0から複数の映り込みの色が記憶される。例えば、映り込みバッファには、レイの衝突位置又は交差位置に応じた映り込みの色が、仮想カメラに近い順に、記憶されてもよい。例えば、トレース距離がLa未満である第1の位置でレイが衝突したと判定され、かつ、トレース距離がLa以上Lb未満である第2の位置でレイが衝突したと判定された場合において、第1の位置と第2の位置との間でレイがキャラクタ平面と交差する場合、映り込みバッファには、仮想カメラから近い順に、第1の映り込みの色(第1デプスバッファ)、第2の映り込みの色、第1の映り込みの色(第2デプスバッファ)が記憶される(
図23参照)。なお、レイが何れのオブジェクトとも衝突せず、キャラクタ平面とも交差しない場合、映り込みバッファには、映り込みの色は記憶されない。
【0138】
図26に戻り、プロセッサ81は、ステップS141の処理の後、映り込みバッファに記憶された映り込みの色に基づいて、着目画素に映り込む色を算出する(ステップS142)。映り込みバッファに複数の映り込みの色が記憶されている場合、プロセッサ81は、仮想カメラから遠い順に複数の映り込みの色をアルファブレンドすることで、着目画素に映り込む色を算出してもよい。例えば、
図23に示されるように、映り込みバッファに、仮想カメラから近い順に、第1の映り込みの色(第1デプスバッファ)、第2の映り込みの色、第1の映り込みの色(第2デプスバッファ)が記憶されている場合、プロセッサ81は、第1の映り込みの色(第2デプスバッファ)に第2の映り込みの色をアルファブレンドした色を算出し、さらにその算出した色に第1の映り込みの色(第1デプスバッファ)をアルファブレンドすることにより、着目画素に映り込む色を算出してもよい。また、例えば、映り込みバッファにおいて、仮想カメラに近い順に、第2の映り込みの色、第1の映り込みの色が記憶されている場合(すなわち、仮想カメラから見てキャラクタの手前側にオブジェクトが存在せず、かつ、キャラクタの奥側にオブジェクトが存在する場合)、プロセッサ81は、第1の映り込みの色に第2の映り込みの色をアルファブレンドすることで、着目画素に映り込む色を算出してもよい。例えば、手前側の第2の映り込みの色が不透明である場合、着目画素に映り込む色として、第2の映り込みの色が設定される。また、手前側の第2の映り込みの色が半透明である場合、着目画素に映り込む色として、第1の映り込みの色と第2の映り込みの色とをブレンドした色が算出される。プロセッサ81は、算出した映り込む色をメモリに記憶する。
【0139】
ステップS142の処理を行った場合、プロセッサ81は、
図26の処理を終了し、処理を
図25に戻す。
【0140】
図25に戻り、ステップS122の後、プロセッサ81は、レイトレース処理の結果に基づいて、フレームバッファへのレンダリングを行う(ステップS123)。例えば、プロセッサ81は、フレームバッファに記憶された着目画素の色に、ステップS142で算出された映り込む色を加える。これにより、着目画素の色に、ステップS142で算出された映り込む色が反映される。
【0141】
次に、プロセッサ81は、全画素についてステップS122及びS123の処理を行ったか否かを判定する(ステップS124)。プロセッサ81は、ステップS124でNOと判定した場合、ステップS122の処理を再び実行する。全画素についてステップS122及びS123の処理が行われることにより、仮想空間に配置されたキャラクタオブジェクト以外のオブジェクトの映り込み(52、54)と、キャラクタオブジェクトの映り込み(61、63)とがフレームバッファに描画される。プロセッサ81は、ステップS124でYESと判定した場合、
図25の処理を終了し、処理を
図24に戻す。
【0142】
図24に戻り、ステップS105の後、プロセッサ81は、キャラクタオブジェクト41及び43をフレームバッファにさらにレンダリングする(ステップS106)。
【0143】
次に、プロセッサ81は、フレームバッファに記憶された画像を表示装置に出力する(ステップS107)。これにより、ゲーム画像が表示される。
【0144】
次に、プロセッサ81は、ゲームを終了するか否かを判定する(ステップS108)。例えば、プレイヤによってゲームの終了が指示された場合、プロセッサ81は、
図24に示すゲーム処理を終了する。プロセッサ81は、ゲームを終了しないと判定した場合(ステップS108:NO)、ステップS101の処理を再び実行する。以上で、
図24に示すメイン処理の説明を終了する。
【0145】
なお、上記フローチャートにおける処理の順番、内容、判定に用いられた値等は単なる一例であり、これらは適宜変更されてもよい。
【0146】
以上のように、本実施形態では、トレース距離がLa未満である場合は、第1デプスバッファに基づいてレイの衝突判定が行われ、トレース距離がLa以上である場合は、第2デプスバッファに基づいてレイの衝突判定が行われる(ステップS135~ステップS140)。これにより、特定のオブジェクトについてトレース距離が長い場合であっても映り込みを表示させることができる。また、特定のオブジェクト以外のオブジェクトについては、映り込みを表示させないようにすることができ、所望のオブジェクトを映り込ませたり、映り込ませないようにしたりすることができる。また、第1デプスバッファ及び第2デプスバッファに基づいて映り込みを生成し、第1デプスバッファに基づく場合はトレース距離に応じて映り込みの色の薄くすることにより、特定のオブジェクトについては大きくはっきりと映り込ませ、それ以外のオブジェクトについては、小さく映り込ませることができる。
【0147】
また、本実施形態では、着目画素(反射位置)が画面の端に近い場合、入射方向と反射位置における法線方向とに基づく反射方向を補正した方向が、レイトレース方向として設定される(ステップS132)。これにより、フレームバッファに描画された画素に基づいて映り込みの色を算出することができ、画面の端であっても映り込みを生成することができる。
【0148】
また、本実施形態では、キャラクタオブジェクト以外のオブジェクトを先にフレームバッファに描画し、当該オブジェクトの映り込みを描画し、さらにキャラクタオブジェクトの映り込みを描画し、最後にキャラクタオブジェクトを描画する。これにより、仮想カメラから見てキャラクタオブジェクトの奥側にあるオブジェクトの映り込みを表示するとともに、キャラクタオブジェクトの映り込みも表示することができる。
【0149】
また、本実施形態では、第1デプスバッファに基づいて算出された衝突位置の色と、第2デプスバッファに基づいて算出された衝突位置の色と、キャラクタ平面との交差位置の色とを算出し、奥から順にこれらの色をアルファブレンドする。これにより、仮想カメラから見て各オブジェクトが重なる場合でも、各オブジェクトの映り込みを表示することができる。
【0150】
(変形例)
以上、本実施形態の画像処理について説明したが、上記実施形態は単なる一例であり、例えば以下のような変形が加えられてもよい。
【0151】
例えば、上記実施形態では、レンダリングの方法としてディファードレンダリングが用いられたが、他の実施形態では、フォワードレンダリングが用いられてもよい。フォワードレンダリングが用いられる場合、上記SSR処理において、例えば、着目画素の周囲の複数の画素のデプスに基づいて着目画素に対応する反射位置の法線方向を推定し、入射方向と当該法線方向とに基づいて、反射方向が算出されてもよい。あるいは、仮想空間におけるメッシュの姿勢を算出し、着目画素に対応する反射位置の法線方向を算出し、当該法線方向に基づいて、反射方向が算出されてもよい。
【0152】
また、上記実施形態では、画面の左端又は右端から所定範囲の領域の画素について反射方向を補正したが、他の実施形態では、画面の上端又は下端から所定範囲の領域の画素についても反射方向を補正してもよい。上記実施形態では、反射方向の補正において、スクリーン座標系におけるレイトレース終了位置のSx軸方向における位置を、反射位置のSx軸方向における位置に近づけた。他の実施形態では、レイトレース終了位置のSy軸方向における位置についても、Sy軸正方向又は負方向に移動させることにより、反射方向の補正が行われてもよい。レイトレース終了位置を横方向及び/又は縦方向に移動させることで、レイの衝突位置が画面内に収まるように、反射方向が補正されてもよい。
【0153】
また、上記実施形態では、レイトレースをスクリーン座標系で行ったが、他の実施形態では、レイトレースを仮想空間のxyz座標系で行ってもよい。すなわち、仮想空間のxyz座標系においてレイを伸ばしていき、レイの衝突位置を計算し、衝突位置に対応する位置の画素の色を、映り込みの色として算出してもよい。
【0154】
また、上記実施形態では、キャラクタオブジェクトの画像をテクスチャとして平面オブジェクトに設定したキャラクタ平面を作成し、当該キャラクタ平面を用いてキャラクタオブジェクトの映り込みの色を算出した。他の実施形態では、キャラクタオブジェクトの画像をテクスチャとして3次元のオブジェクトに設定し、当該3次元のオブジェクトを用いてキャラクタオブジェクトの映り込みの色を算出してもよい。また、上記実施形態では、キャラクタオブジェクトは平たい形状のオブジェクトであるとしたが、他の実施形態では、キャラクタオブジェクトは厚さを有する立体的な形状のオブジェクトであってもよい。
【0155】
また、上記実施形態では、地面を反射面として、地面にオブジェクトが映り込む場合について説明したが、地面以外の面(例えば、壁面や天井面)を反射面として、上述した処理によりオブジェクトを映り込ませてもよい。
【0156】
また、上記実施形態では、ゲーム画像を生成するものとしたが、上述した画像処理は、ゲーム画像に限らず任意の画像を生成する際に用いられてもよい。
【0157】
また、上記ハードウェア構成は単なる一例であり、他の任意のハードウェアにおいて上記画像処理が行われてもよい。例えば、パーソナルコンピュータ、タブレット端末、スマートフォン、インターネット上のサーバ等、任意の情報処理装置において上記処理が実行されてもよい。また、上記画像処理は、複数の装置を含む情報処理システムにおいて実行されてもよい。複数の装置が上記画像処理を分散実行してもよい。また、上記画像処理を行う装置と、画像を表示する装置とが異なってもよい。例えば、第1の装置(例えばサーバ)が、上記画像処理の一部又は全部を実行することにより画像を生成し、生成した画像をネットワーク(例えば、インターネットやLAN)を介して第2の装置に送信し、第2の装置が当該画像を表示してもよい。
【0158】
また上記実施形態及びその変形例に係る構成は、互いに矛盾しない限り、任意に組み合わせることが可能である。また、上記は本発明の例示に過ぎず、上記以外にも種々の改良や変形が加えられてもよい。
【符号の説明】
【0159】
1 ゲームシステム
2 本体装置
81 プロセッサ
32 木オブジェクト
34 円柱オブジェクト
36 山オブジェクト
41、43 キャラクタオブジェクト
【要約】
【課題】オブジェクト毎に映り込みの仕方を異ならせることが可能な画像処理プログラムを提供する。
【解決手段】一実施形態に係る画像処理システムは、仮想空間内のオブジェクトについて、第1デプステストを行うことで第1デプスバッファを更新し、当該第1デプスバッファに基づいてフレームバッファにレンダリングを行う。画像処理システムは、前記オブジェクトのうちの特定のオブジェクトについて、第2デプステストを行うことで第2デプスバッファを更新する。画像処理システムは、トレース距離が第1の距離よりも小さい第2の距離未満である場合は、第1デプスバッファに基づいてレイトレースを行い、トレース距離が第2の距離以上である場合は、第2デプスバッファに基づいてレイトレースを行い、レイの衝突位置に対応するフレームバッファ内の画素の色を、映り込む色として算出する。
【選択図】
図5