はじめまして!
そして前回からの方はこんにちは!
アラフォー3D背景デザイナーのtodaと申します。
前回に引き続き、"いまさら聞けない業界用語 ~ライティング編②~"と題して
ゲームライティングについて用語を交えて書かせていただきたいと思います。
前回は、グローバルイルミネーション(以降、GIと略)表現をする上で
レイトレーシングによる間接光は処理負荷的に厳しいけど、
別のアプローチで疑似的に再現できるよってところまででしたね。
~~~
※この記事は2回にわたるシリーズです、前回の記事は以下をご参照ください
第1回:いまさら聞けない業界用語 ~ライティング編①~
第2回:いまさら聞けない業界用語 ~ライティング編②~←いまここ!
~~~
それではさっそく、なんちゃってGI表現、見ていきましょう!
■なんちゃってGI
・PBR
まず、この言葉を覚えておいて欲しいんですが、
物理ベースレンダリング:Physically Based Rendering(略してPBR)
というものが3DCGの進化とともに登場してきました。
ザックリ言うと現実世界で起こっている光の振る舞い、物理現象を
ちゃんとシミュレートしようっていう、しくみとその環境のことです。
PBR環境では光が現実世界に近い振る舞いをしますので、よりリアルな見た目になります。
・プリライティング
さて話を戻しますが、なんちゃってGIは
プリライティング(事前ライティング)というプロセスによって実現することが出来ます。
プリライティングとは、3Dシーンを構築する段階であらかじめライティングし、
その結果をデータとしてとっておく、というプロセスのことです。
要はリアルタイムでのレイトレによるGIライティングが難しいなら
3Dシーン構築時にGIをプリライティングし、そのデータを活用しようぜ、というものです。
正しいプリライティング結果を得るには
現実世界と同じように光が振る舞ってくれる環境が必要なんですが、
それならPBR環境が最適だよねってことになります。
前振りでPBRに触れたのは、これを言いたかったからなんです。
RBR環境下でのプリライティングで得られたデータをなんらかの形でシーンに埋め込めば
疑似的にGIが再現できるんじゃないか?
この発想からライトマップとライトプローブが考案されました。
ゲームシーンには動かないものと動くものが混在していて、
地面や山、建物など動かない静的なものはスタティック、
たなびく旗や仕掛けなど、形や位置、向きが変わる動的なものはダイナミック、
とカテゴリ分けされます。
そしてそれぞれ、
スタティックなものにはライトマップを、
ダイナミックなものにはライトプローブを使って、疑似的に間接照明を再現していきます。
・ライトマップ
プリライティング結果を焼き付けたテクスチャマップのことです。
大雑把に言えば。動かないんだったら光が当たる位置も変わらんし、
先に焼き付けてマップ化しちゃおうっていうものです。
・ライトプローブ
プローブという観測ポイントをシーンに複数配置し、
プリライティング結果をそれぞれのプローブに入れておきます。
ダイナミックな物体が各プローブに近づくと、
プローブに入っているデータから局所ライティングを受ける、という仕組みです。
ライティング結果がすでに配置されてるから、近づいたらそれを使うよっていう具合です。
この二つを使うことで、シーン内のスタティックなもの、ダイナミックなもの両方に
なんちゃってですがGIっぽいライティングが再現することができるんですね。
■カゲ
さて、ここまで”光”についてお話をしてきましたが、
次に光があるところに必ずできる"カゲ"の表現についても触れてみたいと思います。
3Dグラフィックスにおけるカゲには"陰"と”影”の二つがあります。
”陰(シェーディング)”、はライトによって明るく照らされていない部分のことで、
”影(シャドウ)”、は物体によって光が遮蔽されて出来る部分のことを言います。
陰は意図しなくても勝手に描画されますが、影は意図して描画しないと描画されません。
今回は”影”の方をフォーカスしていきたいと思います。
1つ注意したいのは、ライトマップに描かれてる影はこの"影"には含まれません。
ゲーム中にリアルタイムに計算、描画される影についてのお話になります。
・丸影
まず一番最初に登場したのが丸影です。
これは板ポリゴンに丸い影のテクスチャを貼って足もとに置くというものです。
3D黎明期のハード性能が低い頃はこれが主流でした。
・投影テクスチャマッピング技法
次に、プレステ2の頃に投影テクスチャマッピング技法というものが登場しました。
これは光源から見た物体のシルエットを影テクスチャにして投影するという技法です。
ライトとの相互関係を持った影が出始めたのもこのころです。
ただこの技法は、「物体が他の物体に落とす影」のみのである
キャストシャドウしか出来ないという弱点がありました。
そしてキャストシャドウの弱点を克服した、
「物体が他の物体に落とす影 + 物体が自身にも落ちる影」の両方ができる
セルフシャドウが登場します。
・ステンシルシャドウ、デプスシャドウ
さて、このセルフシャドウですが二通りのやり方があります。
それはステンシルシャドウボリューム技法とデプスシャドウ技法です。
ステンシル~は処理が軽いのですが、モデル形状でしか影を描画できないので、
テクスチャマスクで抜かれたモデルでも、モデル形状のまま影が落ちてしまいます。
デプス~はテクスチャマスクで抜かれたモデルは、マスクの形で影を落としてくれます。
(その分だけ処理も重めなんですが…)
結論として、セルフシャドウができてマスクで抜いた影も落とせるということで、
デプスシャドウが一番高品質ということになりますね。
そして現在はハード性能も上がったので最もメジャーな影表現技法として使われています。
じゃあ高品質で一番メジャーらしいけど、デプスシャドウ技法ってどういうものなの?
をざっくり追いかけてみましょう。
■デプスシャドウ技法
・シャドウマップ
まず、デプスシャドウで影を描画するにはシャドウマップというものが必要になります。
これはライトからの視点でシーンを見た時の、
シーン内のオブジェクトの距離関係を白黒で表したマップです。
シャドウマップはZバッファレンダリングというプロセスで生成されるデプス(深度)マップの一つで、Zバッファという深度情報用の一時メモリに格納されます。
・デプスシャドウのしくみ
このシャドウマップを使ってデプスシャドウの影を描画していくわけですが、
そのしくみは割と単純で、とある地点で影が落ちるかどうかを調べる時
A.シャドウマップに格納されている深度
B.実際の深度(距離)
の二つの深度を比較して、Bの深度の方が大きければ
その地点は光源からの光を手前の物体が遮っているから
光が届いていないよねってことで影を描画しましょう、という具合です。
・ライトマップとシャドウマップ
よくライトマップとシャドウマップが混同されることがあります。
ライトマップに影が描かれていることからシャドウマップと言いたくなりますが、
上述のように別モノなんですね。
—
とまぁデプスシャドウはこんな風に影を描画しているわけなんですが、
ここでとあることにお気付きになったでしょうか。
それはデプスシャドウが光源からの直接光のみ、
つまりローカルイルミネーションでしか影を描画してないということです。
影の色もベタ一色で、影の中のより明るい所、暗い所といった濃淡の幅もありません。
ライティングの方はなんちゃってですがGIを再現しているのに、です。
そこで影もGIっぽく、もう少し陰影を豊かにできないか?
というニーズから、アンビエントオクルージョンという手法が考案されました。
■アンビエントオクルージョン(以降、AOと略)
日本語に訳すと"環境の遮蔽"…なんのことか良く分かりませんが、ザックリ説明すると
折り目やミゾ、隙間、狭所といった遮蔽空間に陰影を描画してくれるものです。
AOを追加すると物体の立体感やボリュームが出るようになります。
ただ純粋なAOは、
周囲との遮蔽具合を計るのにオクルージョンレイというものを物体表面から飛ばします。
つまりレイトレーシングをするので、処理が重くてゲームでは使い勝手が悪いです。
ですのでカメラ目線のデプスマップの深度値から遮蔽箇所を割り出して陰影を描画する、
スクリーンスペースアンビエントオクルージョン(以降、SSAOと略)
というものがゲームでは主に使われています。
※AOはレイトレによるGIの一種で、SSAOはデプスマップを使ったポストエフェクトです。
なので厳密に言うとこの二つは全くの別モノなんです。ちょっとややこしいですね。
このように陰影も様々な技法を駆使して豊かな表現をしているんですね。
誰かが言ってましたが、ライティングとはつまり"陰影をコントロールする"ことだそうです。
確かに陰影が無いと立体感が出ませんし、それ次第で印象も大きく変わりますしね。
"ライティング"というワードに引っ張られて、つい光が当たっている箇所を意識しがちですが
実はその真逆で、陰影こそ最も注意を払うべきことなのかも知れません。
まとめ
はい、ということで2回にわたってライティング(と影)について
ほんの一部ですがざっくりと紹介させていただきました。
モデルとかテクスチャとかポストエフェクトにもたくさんの技術、用語がありますので、
機会がありましたらそれらの用語も紹介できればと思います。
ではでは、駄文にお付き合いいただきありがとうございました!