CG 映画やアニメーションは現実の反射にとても似ているものです。その性質はシーン内のオブジェクト同士が “つながっている” 感じを表現するのに重要です。しかし、現実的な反射を正確に表現しようとすると演算機に高い負荷がかかります。こうした負荷は映画の場合は問題にならないのですが、リアルタイムゲームで反射するオブジェクトを使用するのには著しい制限がかかります。
ゲームではオブジェクトからの反射をシミュレーションする リフレクションマッピング という技術が伝統的に使用されてきました。反射演算のオーバーヘッドを許容範囲に収めるためです。このテクニックはシーンにあるすべての反射するオブジェクトが周囲の環境を“知ることができる”(ゆえに反射できる)ものと仮定します。この技術は(例えば光沢のある車など)ゲームのメインキャラクターが広い場所にいる場合は良好な働きを見せますが、異なる環境に移る場合は説得力を失います。車がトンネル内を走っているのにウィンドウに空が映っているのが見えては不自然でしょう。
Unity は Reflection Probes (リフレクションプローブ)を使用することで、基本的なリフレクションマッピングの質を向上します。リフレクションプローブによって、シーン内の視覚的な環境を重量なポイントでサンプリングすることが可能になります。通常、反射するオブジェクトの見た目が顕著に変わる場所(例えば、トンネル、建物付近や、地面の色が変わる場所など)ごとにプローブを設置するといいでしょう。反射するオブジェクトがプローブの近くを通り過ぎるときプローブによってサンプリングされた反射をオブジェクトのリフレクションマップで使用することができます。さらに、いくつかのプローブが近くにある場合、Unity は反射が徐々に変化するように補間できます。このように、リフレクションプローブを使用することで演算のオーバーヘッドを許容範囲に抑えつつ説得力のある反射を演出することができます。
シーン内のとあるポイントの視覚的な環境は キューブマップ によって表現することができます。これは概念的には、六面(上、下、左、右、前そして後ろ)から見た光景を平坦な画像として内面に描いた箱のようなものです。
反射を表示するオブジェクトのために、シェーダーはキューブマップを描写している画像にアクセスしなければなりません。オブジェクト表面それぞれのポイントはキューブマップの各領域の表面が向いている方向(すなわち、表面の法線ベクトルの方向)を “知る” ことができます。シェーダーはそのポイントにおいてオブジェクトの表面がそうあるべき色を計算してキューブマップの色を使用します。鏡のマテリアルは光沢のある車の場合効果が多少薄まったり元の色がついたりする一方で、正確に色を反射します。
上記のように、昔からあるリフレクションマッピングはシーン中の環境を表現するのに単一のキューブマップのみを使用します。キューブマップはアーティスト一人で描くことができ、その他にはシーンの一点から1枚1枚がキューブ表面に対応する6枚の “スナップショット” を撮影することでも作成できます。リフレクションプローブを使用することで、シーンでキューブマップのスナップショットを取ることができ、多くのポイントを事前定義してセットアップできるようになります。したがって、シーンで顕著に反射が異なる周囲の環境をどの地点からでも記録することができます。
ビューポイントに加えて、プローブはシーンに不可視のボックス形状によって定義されたエフェクトのゾーンも展開します。プローブのゾーン内を通り過ぎる反射オブジェクトはプローブによって一時的に提供されるリフレクションキューブマップを保有します。オブジェクトがあるゾーンから他のゾーンへ移動するのに合わせて、キューブマップも変更していきます。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.