LoginSignup
2
3

More than 3 years have passed since last update.

UE4のポストプロセスでリライト

Posted at

去年、UE4歴3か月くらいしかない時にポストの学習がてらやった事を書きます。

リライトとは?

ポスト上で自前でディファードレンダリングするような物で、予めレンダリングされた法線やワールド位置情報をもとに、ポストプロセス上でライティングを行います。
UE4に存在しないライティングモデルの適用や、デフォルトのライトチャンネルやマスクでは難しい表現ができます。
完全に置き換える時もありますし、既存のライティング結果にライトを足す事もできます。

実装


今回は既存の結果に上乗せではなく、置き換える実装をしています。わかりやすく画面の半分より左がUE4の標準の出力、右側がGバッファはじめ、ポストプロセスで取得できる情報をもとにライティングしたものです。

準備

ポストマテリアルを一個用意するだけです。
ライティングをするので、トーンマップ適用前のパスに設定しましょう。
image.png

ポスト上でリライトのために取得できる情報

カメラ位置、ワールド座標は専用のノードから取得できます。
以下はSceneTextureノードから取得することが可能です。
-マテリアルAO、AO、ワールド法線、メタリック、ラフネス、ベースカラー

取得、実装が難しい事

シャドウマップが生成できないのが難点です。もし、どうしても影が欲しい場合は、レイマーチ女る実装をするか、同じ位置、向きのライトがシーン上にあるのであればデライトして使う事ができます。

エミッシブ

ポストマテリアル上ではエミッシブをとる事が出来ません。
欲しい場合はあらかじめ別のRTにレンダリングしておくなどの対応をする必要があります。

ライティング

直接光

今回は平行光のみGGXでカスタムノードを実装しました。
viewDirにはワールド座標からカメラ位置を引いた物を、lightDirにはベクターパラメータとして外にだしているものを渡し、同じくベクターパラメータのlightColorにはα成分にインテンシティーをパックして入れています。
image.png

環境光

環境光周りで用意したのはフレネル関数とキューブマップ2つです。
radianceキューブはラフネスに応じて参照するMipレベルを変えます。この素材は事前にcmftやIBLBakerなどのツールでフィルター処理して作成しておきます。
irradianceキューブについてはテクスチャではなく、SHの係数であることが多いですが、今回は手を抜いてテクスチャをそのまま参照しています。
image.png

これらにAO、マテリアルAOの影響を適用し、さらに直接光の結果と合成すれば完成です

まとめ

どうしても標準のライティングだけでは表現が難しかったり遠回りになってしまう時があります。そんな時、痒い所に手が届くことが多いのでリライト用の関数など整備しておくといいかもしれません。
ただし、前途した通り、影やエミッシブの問題はあるので、その辺り留意した上で使っていくのがいいでしょう。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3