Ash は "A very lightweight wrapper" を謳っているくらいなので非常に薄いラッパー API を提供しています。
No validation, everything is unsafe
と書かれており、ほとんどの API は unsafe ブロックの中で使用する必要があります。 drop trait の実装もされていないのでインスタンス管理も自分で行う必要があります。
基本的に Vulkan の API をそのまま Rust で見える形にしたものに近く、 C/C++ のコードをそのまま Rust で書き直すのもそれほど難しくはないように思います。 API 的には C++ の vulkan.hpp に近く、各種構造体は Builder pattern で設定できるので C API ほど面倒くさいという事もないように思いました。 vulkan.hpp からデストラクタがなくなった?というのが近いかなという感じです。
drop trait が実装されていないのが面倒に感じるかもしれませんが、 Vulkan Memory Allocator のようなリソースマネージャーと組み合わせて使う場合は固定的な drop trait は実装されていると逆に困ってしまうことになるので、これはこれでよいかなと思います。
その他のライブラリ
scopeguard
スコープを抜ける際に実行するコードを記述できるようにする crate です。 C++ ではお馴染みだと思います。 Swift の defer ですね。
Ash では drop trait がないので後始末コードは全て自前で書く必要があります。ある程度規模のあるコードであれば管理用の構造体に drop trait を実装すればよいと思いますが、学習コードなどで 1 メソッド内で完結してしまう場合はなかなか面倒です。そういった場合にこの crate を使うと後始末処理を細かく書く必要がなくなって楽です。
この scopeguard crate は defer! マクロという、 Swift の defer そのままの使い勝手を実現できるようになっているのでとても楽です。
delegateint FnUnityMain(IntPtr hInstance, IntPtr hPrevInstance, [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, int nShowCmd);
DLL をロードして "UnityMain" のエントリーポイントを取得、実行をします。
var p = GetProcAddress(_dll, "UnityMain");
var fnUnityMain = Marshal.GetDelegateForFunctionPointer<FnUnityMain>(p);
fnUnityMain(Process.GetCurrentProcess().Handle, IntPtr.Zero, arg, 1);
Windows での Unity as a Library は実際提供されている機能的には極々限られていて、特に標準で通信手段が用意されていないのはなかなかつらいものがあります。 Unity との通信には MagicOnion を使ってみましたが、 Broadcast を使うしかないですし実際はあんまりお勧めできないかと思います。他の方法といってもパイプとか泥臭い方法になりそうですが・・・
We have added HDR display support for the Editor, allowing developers who use displays that support HDR to take advantage of it. This change supports DX12 and Metal.
HDR 出力有効時の注意点として (少なくとも 2020.1 時点では) Unity 標準の Post Process (PPS, URP, HDRP) の Tone mapping を適用すると 0.0~1.0 の範囲に丸め込まれるので HDR じゃなくなります。従って Tone mapping は標準 Post Process 以外の方法で行う必要があります。
Bit Depth 10 の場合
Bit Depth 10 は "Rec.2020 (BT.2020) かつ "ST 2084(PQ)" となっています。これは Unity の Color Space と互換性がありません。実は私は 2019.3 で試していた時は Unity 側で色空間変換をしてくれるものと思っていたのですがそうではありませんでした。
色空間変換をしてくれない、ということは自前でなんとかする必要があります。
Bit Depth 16 の場合
Bit Depth 16 は "Rec.709 (BT.709)" かつ "Linear" となっています。つまり Color Space = Linear に設定した際の中間レンダリングフォーマットそのもの ということになります。従ってこの設定にした場合は特に意識しないで正しい色になります。
上記以外のプロパティは available プロパティ が true じゃないと例外が出るので、まずこのプロパティを確認してから操作をするようにすべきでしょう。 avalilable プロパティは Player Settings の "Use display in HDR mode" が ON になっていると (かつ HDR が有効にできるプラットフォーム) true になります。 OFF にしていると対応環境でも available = false なので「Editor 上では SDR で作業したい」と OFF にしてそのままビルドするとはまりそうなので注意が必要です。
BitDepth は実行時に変更することはできません (まあ実行時に切り替えるようなものではないですが) 。 BitDepth に基づいた設定は displayColorGamut, format, graphicsFormat から判断できます。これらの情報を元に必要に応じて色空間変換処理を適用すればよいかと思います。