2013年のNao_uさんによるUnityリアルタイム実写合成テスト
4年前は「平行光+半球ライト+適当なキューブマップ+SSAO」だけだった
今回は「大量の平行光源+写真ベースのディフューズ・スペキュラーの環境マップによるIBL+疑似スキンシェーダー+3段重ねのSSAO+FXAA」と4年分くらい進んだ要素の追加 Webカメラの映像に、Unityを使ってレンダリングしたモデルをリアルタイム合成している。背景は全く動いていないけれど、一応静止画ではない。
影は同じ場所に自分が立ってみてだいたい同じ感じに見えるように調整。主光源は画面手前左上からの蛍光灯の光で、大量の影付き平行光源を置いたうえで、範囲を変えたSSAOを3段重ねている。
床と机の上には透明な板を置いて影を投影していて、机の脚には黒いモデルを置いているので、足から右奥に出ている影は合成したライトの影になっている。
肌はSSSSSを試してみようかと思ったけど映る面積が小さすぎて手間に見合わなそうだったので、フレネル的にエッジからの距離で赤→黄色に遷移するような形ですこしだけ肌っぽく見えるように調整してみた。手のひらなどは自然な赤みがでてそれっぽくなったけど、元々色白なのでもう少し強調した調整にしてみてもいいかも。 シェーダーの質感は特に変わったことはやってなくて、ディフューズとスペキュラーのIBLをベースにフレネルで合成してるだけ。実際試してみた感じでは今回程度の表現であれば、見た目の印象への影響はIBLの環境やライティングの調整が一番重要で、多少凝ったことをやっても環境マップの影響が大きすぎて間違い探し程度の違いしか出せなさそう。 逆に、目に関してはちょっとした違いがかなり印象に大きく影響を与える感じが。人間の感覚って不思議。眼球にもともとスペキュラーが絵として書かれてしまってるので扱いが難しい。今後の検討課題。
周囲の環境は、6方向を露出固定で撮った写真をCubeMapGenで加工した環境マップを使用。
AMDがリリースしているアプリ。開発終了。
壁とか床は適当に撮ったつながってない写真でも意外とそれっぽくつながって見えるので面白い。
ディフューズ環境マップは120度ぼかしたもの(180度だとぼやけすぎな印象?)を使っていて、スペキュラー環境マップ側は95%以上明るい部分だけをシェーダー内で適当な係数をかけて加算することで疑似HDR化している。平行光がここに上乗せされるので、ディフューズはLDRな値でもそんなに問題ないはず。
もしリアルタイムで周囲の環境に馴染ませようと思ったら、以前試してたみたいにリアルタイムでグレーボールやミラーボールを撮影して乗せる方法がベターかも。
グレーボールで光源情報を合成
光源キャプチャ、光源方向を見て影を落とす
レンダリング関連の課題
シェーダーの都合で光源のスペキュラーが乗ってない
スペキュラーが遮蔽されるはずの場所にも乗っている
→スクリーンスペースの遮蔽チェックとローカルリフレクション
周囲の環境を正しく写真ベースのHDRで取得できるように(ColorChecker Passportも試す)
現状は大量の平行光源でごまかしているAO・ソフトシャドウをもっとシンプルなやり方にして、影のノイズを軽減
SSAOを後乗せで暗くするのではなく、アンビエントの遮蔽とスペキュラー軽減にも使用できるように描画パスを修正
SSSもやってみたい(けどたぶんほとんど違いが出ない気がする)
目の表現。いい感じに反射やハイライトが入る必要がある?絵として描かれた部分との整合性が課題
表情がないのはちょっと怖いのでなんとかしたい