顔万華鏡 Unity HDR版

2024/8/31のSNACKS Vol6に展示する作品

./当日説明.md

使っているライブラリ

https://github.com/asus4/tf-lite-unity-sample

UnityでMediapipeの顔認識を実行する

このプロジェクトに甘える
https://github.com/asus4/tf-lite-unity-sample

コピーするフォルダ

  • Assets/StreamingAssets
  • Assets/Samples/Common
  • Assets/Samples/FaceMesh
  • Packages

オリジナル(asus4/tf-lite-unity-sample)のプロジェクトではGit LFSを使っている。
料金の問題もあるが、複雑になるので、なるべく使いたくない。
モデルデータ(.tflite)の一部がGitHubの上限の100MBを超えるが、今回使うのはAssets/StreamingAssets/mediapipe/face_detection_front.tfliteAssets/StreamingAssets/mediapipe/face_landmark.tfliteのみなので、Assets/StreamingAssets/直下のファイルは削除した。

UnityのURPでHDRでビカビカさせるためのメモ

プロジェクトの作成

プロジェクトの新規作成でUniversal 3Dを選ぶ

プロジェクトの設定

プロジェクトの設定でHDRを有効にする

Player > Other Settings > Rendering

  • Allow HDR Display Outputにチェック
  • Use HDR Display Outputにチェック
  • Swap Chain Bit DepthをBit Depth 16に変更(お好みで)

参考:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@17.0/manual/post-processing/hdr-output.html

URPのポストプロセスでシェーダーを書く

お作法が複雑なため、ShaderGraphに甘える。 ノードが複雑になる部分はCustom Functionノードを使い、HLSLで記述する。

シェーダーグラフを作る

URPのフルスクリーン用シェーダーグラフを作る
Create > Shader Graph > URP > Fullscreen Shader Graph

Renderer Featureに追加する

Add Renderer FeatureからFull Screen Pass Renderer Featureを選び追加する。
先ほど作ったシェーダーグラフのマテリアルを設定する
Inject PointBefore Rendering Post Processingに変更する

Custom Function Nodeを作る

https://docs.unity3d.com/Packages/com.unity.shadergraph@16.0/manual/Custom-Function-Node.html

PlayerでHDRを有効にする

HDROutputSettings.main.RequestHDRModeChange(true);

開発で困ったことと対処のメモ

ShaderGraphのPropertyの値がうまくCustom Functionに渡せない

値を直接指定すると呼び出せる。
Inspectorでは渡せているように見える。
NaNかInfinityが渡されているような変な計算結果になる。

問題が起きているプロパティの名前をdummyなどに変える。
そのプロパティを使わずに次のプロパティを使うと何故か直る。

Unityで.shadergraphのインポートが終わらないとき

一度プロジェクトの外に出し、インポートし直す