【CG】ゲームにおける反射表現について


この記事は「新たな反射表現思いついたよ~」って記事を書くために、前段として『そもそもゲームでの反射ってどうなってんの?』というところを詳しく解説する記事となっています。ただのゲーム好きの一般人にもわかるように易しく書きたい所存です(書けるとは言ってない)。


それでは始まります。


反射とは

まず現実世界での反射の仕組みをざっくりとおさらいしておきましょう。

画像1

入射角と反射角は同じ角度になる。以上。


とかいう簡単な説明ではちょっと間が持たないのでもう少しマテリアル的な話を。

上記は『全反射』の例で、現実世界で完全に全反射する物体は存在しません(多分)。実際には物質に光が吸収されたり、表面がざらざらしていると光が拡散してぼかしがかかったように見えたりします。金属を磨くとつやつやになるのは、この表面のざらつきを極限まで滑らかにしようとした結果ですね

画像2

このざらつき具合をラフネスとか言ったりします。ちなみにこの時ももちろん物体が光を吸収していて、全反射にはなりません。

鏡と同様の現象を起こす窓ガラスについても少し触れておきましょう。

例えば夜、外にいるときはビルの中が良く見え、ほとんど反射を感じませんが、中にいると窓ガラスは結構反射して見えますよね。

画像3

これはガラスが反射と透過をする素材だから起きる現象になります。
例えば反射率が50%のガラスがあったとします。夜は外のほうが暗いため外からくる光は40、中から出る光は100とします。この場合、ガラス自体に明るいほうと暗いほうを分ける機能はないので、どちらも必ず50%反射と透過を行い、中の光は50ずつ反射と透過を、外の光は20ずつ反射と透過を行います。人間の目は強い光のほうを捉えやすくできているので、外にいても中にいても強いほうの光を視認し、中にいると反射、外にいると透過という現象になるわけですね。


ではゲームの反射はどうなっているのでしょうか?


ゲームでの反射


ゲームでは主に3種類の反射表現が使われています。一つ目は描画負荷軽め、でもリアル度は低めの環境マップによる反射。二つ目は、リアルだが描画負荷の大きいスクリーンスペースリフレクション(Screen Space Reflection(略してSSR))という技術を使った反射。そして三つ目がカメラを使ったちょっと特殊な反射。それぞれ解説していきましょう。

環境マップ

環境マップとは、簡単に言うと『360度カメラで撮った画像』です。

画像4

例えば反射させたいオブジェクトを中心に、その周りの環境を撮影してテクスチャにし、ちょこっと計算を加えてオブジェクトに描画すれば即席鏡面反射の完成です。(環境マップの詳細はこちら)

通常、ゲームは作成直前に『ベイク』というテクスチャの焼き付けなどを行う作業をします。(ボタン押して待つだけですが)
このベイク時に環境マップを自動生成してもらって反映するか、もしくはあらかじめ自分で作成して反映するかでこの反射表現を使います。

この方法、言ってしまえばただのテクスチャなので、比較的軽いです。しかしゲームには致命傷となるデメリットがあります。それは、動くものが反射できないということ。

この反射はリアルタイムの反射ではなくただの画像なので、仮に反射物を覗き込んでいる自分の顔をテクスチャに書いたってその顔は動くことがありません。顔を離してもずっとそこに書かれたままです。

でもそもそもゲームをプレイしているときに、そんな金属の一部分の反射に自分が映っているかどうかなんて当然見ないので、だいたいのゲームではこの反射が使われています。ゲームをよくやるという方はぜひ鉄製の物体の近くまで行って確かめてみてください。

画像5

↑ 環境マップでの反射の例:Apex新マップのオリンポスにあるハモンド研究所の屋根。綺麗に反射しているように見えるが、よく見ると全然違うところが映っている。


スクリーンスペースリフレクション

スクリーンスペースリフレクションは、かなり現実に近い反射表現を行うので、よりリアルな反射を行いたい場面で使用されます。

画像6

現実世界では光源から光が放たれ、物体に当たって散乱を繰り返して最終的に私たちの目に届きます。スクリーンスペースリフレクションでは、簡単に言うとこれの逆の手順を追います。カメラからレイを飛ばしスクリーンスペースリフレクションに対応した物体に衝突したら反射し、次の物体に衝突するまで(厳密には負荷がかかるため距離に上限を設けるが)レイが飛びます。

これはリアルタイムに毎フレーム行うので、動いているキャラクターでも反射を映すことができます。その反面リアルに近づければ近づけるほど処理が重くなります。例えば反射回数。反射時に衝突したオブジェクトのマテリアル情報を反映する必要があるので単純に距離=負荷とはいかず、例えば左右鏡張りの狭い廊下のようにレイの飛距離が短そうな状況であっても、反射回数を多くすればするほど負荷が高まります。

ゲームでこのスクリーンスペースリフレクションをよく見かける場面は、水面や大理石の床などでしょうか。スクリーンスペースリフレクションは高負荷の為何個も設置することが困難なので、シーン上に一枚でっかくバーン!とリフレクションの板を設置してしまうパターンをよく見かける気がします。(フォートナイトの湖などがこのパターン)

画像7

↑スクリーンスペースリフレクションの例:グランツーリスモスポーツのフォトモード。ボディも綺麗に反射していますが、ここでは床の反射に注目。フォトモードでは車を自分の好きな位置に動かせるので環境マップでは車が反射しません。しかもフォトモードは激しく動かすわけではないので、少々重くても反射をよりリアルに描いていますね。
※ちなみにグランツーリスモスポーツのフォトモードはCGの車と実写の写真をうまいこと合成することでよりリアルに見せています。リアルというより背景はもう本物なんですよね。(全部かどうかはしらん)


カメラを使った反射

最後にちょっと特殊な反射技術を紹介します。これもグランツーリスモを例に紹介しますが、主に車ゲームで使われます。方法は至ってシンプルで、反射するオブジェクトの位置にカメラを設置して、その映像をテクスチャ化してオブジェクトに表示するというもの。

画像8

画像9

レースゲームのルームミラーやサイドミラーにこれが使われています。というかここでしか見たことない。映像を映し出しているので、他の二つに比べてかなりくっきり反射っぽく見せることができる反面、ただの映像なので自分の視線に追従しないという最大のデメリットがあります。言うなればこれはテレビですね。(図解しようと思ったけど上手く書けなかったので、『テレビでスカートを覗こうとしても見ることができない現象』という例えで分かってください(脅迫))

要するに、レースゲームなどのように視点移動がほぼ0の状態でしか、この方法を使うことができません。ある一定の位置からは反射に見えるけど、動いたらただの映像だということがバレてしまうからですね。



まとめ

つまるところ、適材適所というわけですな。それぞれ長所短所があるので、シーンごとに「ここでは環境マップ」「ここではSSR」という風に分けて使うのが一般的です(多分)

環境マップ
・軽い
・ただし解像度によってはゲーム容量を圧迫する
・解像度高くしてどれだけリアルに見せても動くものは映らない
・何も設定しなくても使える
・とりあえず反射ならこれ
スクリーンスペースリフレクション
・重いけどリアル
・動くキャラクター映したいならこれ使え
・リアルに近い挙動をする為設定が細かい
・カメラ外のものは反射しない
カメラ反射
・まあまあ重い
・視点移動するなら使えない
・ラフネスとか使わなければ間違いなく一番綺麗でリアル


以上、ゲームで使われている反射表現でした。

ちなみに最近何かと話題になりつつあるレイトレーシングは、スクリーンスペースリフレクションとよく似た方法です。話題になっている理由は、今までレイトレーシングは1フレームの描画に数分~数時間かかるような超リアルだけど超高負荷な技術だったものが、NVIDIAのグラフィックボードRTXシリーズが『リアルタイムレイトレーシング』に対応したからですね。要するに数時間で1フレームだったのが、1秒で60フレーム(またはそれ以上)という高速化でみんな「まじかよやべえ!」ってなったわけですね。この話は気が向いたらまた記事を書きます。

次の記事では、技術者、特にゲームのデザイナーやアーティストなら気になるであろう、多分新しい技術の反射表現を紹介します。先駆者になりたいなあ。


それでは!

この記事が気に入ったらサポートをしてみませんか?