去年、UE4歴3か月くらいしかない時にポストの学習がてらやった事を書きます。
#リライトとは?
ポスト上で自前でディファードレンダリングするような物で、予めレンダリングされた法線やワールド位置情報をもとに、ポストプロセス上でライティングを行います。
UE4に存在しないライティングモデルの適用や、デフォルトのライトチャンネルやマスクでは難しい表現ができます。
完全に置き換える時もありますし、既存のライティング結果にライトを足す事もできます。
#実装
去年練習がてらやったUE4でのリライト、左UE4標準、右、ポストでリライト pic.twitter.com/ZFw6zL0lbl
— おく/奥川 剛 (@t_oku) October 20, 2019
今回は既存の結果に上乗せではなく、置き換える実装をしています。わかりやすく画面の半分より左がUE4の標準の出力、右側がGバッファはじめ、ポストプロセスで取得できる情報をもとにライティングしたものです。もう一個 pic.twitter.com/NqYgBZfWN8
— おく/奥川 剛 (@t_oku) October 20, 2019
##準備
ポストマテリアルを一個用意するだけです。
ライティングをするので、トーンマップ適用前のパスに設定しましょう。
##ポスト上でリライトのために取得できる情報
カメラ位置、ワールド座標は専用のノードから取得できます。
以下はSceneTextureノードから取得することが可能です。
-マテリアルAO、AO、ワールド法線、メタリック、ラフネス、ベースカラー
###取得、実装が難しい事
####影
シャドウマップが生成できないのが難点です。もし、どうしても影が欲しい場合は、レイマーチ女る実装をするか、同じ位置、向きのライトがシーン上にあるのであればデライトして使う事ができます。
####エミッシブ
ポストマテリアル上ではエミッシブをとる事が出来ません。
欲しい場合はあらかじめ別のRTにレンダリングしておくなどの対応をする必要があります。
##ライティング
###直接光
今回は平行光のみGGXでカスタムノードを実装しました。
viewDirにはワールド座標からカメラ位置を引いた物を、lightDirにはベクターパラメータとして外にだしているものを渡し、同じくベクターパラメータのlightColorにはα成分にインテンシティーをパックして入れています。
###環境光
環境光周りで用意したのはフレネル関数とキューブマップ2つです。
radianceキューブはラフネスに応じて参照するMipレベルを変えます。この素材は事前にcmftやIBLBakerなどのツールでフィルター処理して作成しておきます。
irradianceキューブについてはテクスチャではなく、SHの係数であることが多いですが、今回は手を抜いてテクスチャをそのまま参照しています。
これらにAO、マテリアルAOの影響を適用し、さらに直接光の結果と合成すれば完成です
#まとめ
どうしても標準のライティングだけでは表現が難しかったり遠回りになってしまう時があります。そんな時、痒い所に手が届くことが多いのでリライト用の関数など整備しておくといいかもしれません。
ただし、前途した通り、影やエミッシブの問題はあるので、その辺り留意した上で使っていくのがいいでしょう。