今後の方針とか。
10-bit RGB の HLSL/GLSL 対応について
いろいろやってみたのですが,HLSL で OK なコードは GLSL では NG でした。
HLSL では Texture2D
型に対して Sample
した値を asuint
で uint
として使うことで可能でした。一方 Texture2D<uint>
型では,そもそも映像出力もされず(ミップマップも生成してないはずなんだけどなぁ…)
GLSL では uint
として扱う floatBitsToUint
があるのですが,これを使っても出力されず… usampler2D
ですらうまくいかないので断念しました。
HLSL で正しく動いたときの OBS Studio Custom HLSL。
/* uniform texture2d image; は uniform Texture2D image; にデコード */ uint vvvv = asuint(image.Sample(def_sampler, vert_in.uv).r); return float4( float (vvvv >> 22U) / 1023.0, float((vvvv >> 12U) & 0x3FFU) / 1023.0, float((vvvv >> 2U) & 0x3FFU) / 1023.0, 1.0 );
ちなみに,GLSL で,unsigned int
を使う場合 U
suffix 必須なんですね。初めて知りました。
12-bit RGB について
PS4 の DeepColor は 12-bit で出力されています。
Linker 4K60 を使ってみた。こっちの方が詳細な情報かも。この手の製品はカスタムEDIDを送信できるので検証に便利かも pic.twitter.com/e3kdsEmtLc
— kilin (@kilinbox) 2017年4月4日
ちなみに 3840x2160 では,帯域が足りず 4K+HDR 時 YUV 4:2:2 になりますが。ま,細かいことは調べてください。
これに関しても,ビット演算がシェーダーで使える状態にできないため,おそらく CPU で 16-bit RGB に展開することになると思います。OpenGL では 12-bit テクスチャーをサポートしているのですが,DirectX ではサポートしていません。実行時にテクスチャーをフォーマットとサポートしているかどうかを取る仕組みを作ればいいのでしょうが,それをやると diff が多くなるためやりません。
個人的見解といいますか,BT.2020 では,10-bit では可もなく不可もなく(階調飛びは視認可能)。12-bit では優って感じらしいです。資料を見ただけなので,正確な見解は言えませんが,少なくとも 10-bit では階調飛びがわかるらしい。
Apple 製品では P3 が採用されていますが,内部の通信(グラボと内臓ディスプレイ)には 10-bit RGB で処理されていると思います。(スワップチェーンレベルでは 16-bit FLOAT RGB なんでしょうけど)
光源変換
いまだに光源変換は実装していません。しばらくお待ちください。
HDR 対応
ここをどうしようか,と考えています。個人的には HDR 対応機材持ってないので,表示を確認する手段がなく,実は対応できないという問題が起こっていますw
とりあえず実装しようかなぁ…
評価する方法がなく,わかんね,って感じで。
モニタリング用カラマネ対応
モニタリング用は出力映像をそのまま出しているため,一部階調がおかしいです。BT.709 はほぼ同じですが,一部階調表現が異なります。
ガンマカーブ参照。
GPU のシェーダー処理では,非常に高速なため,EOTF,OETF を近似ではなく,そのまま関数処理で扱ってます(GPU ぱない… やはり並列化が CPU とは比べられないのはわかるわ… 並列数から違う…)。ゆえに,厳密に扱っているので,sRGB と BT.709 の transfer の違いはよくわかりますね。
映像マスタリングする場合,BT.709 や BT.601 のカラープロファイルをご利用ください。
モニタリング用カラマネは BT.2020 出力が主流になったときに必須だと思ってまして。まだまだ先の話ですが,とりあえず,PS4 Pro の HDR を正しく扱えるようにしていかないとなーと個人的に思ってます。
まとめ
以上雑記でした。
自分のやりたいことってマジでこれだけなんですよね。ただまあ俺がメインで作ってるならもっとやりたいことありますね。あまりにもカオスに入り組んでるコードをきちんとわけたりとかですね。
fork 版は作らなくてよさそうなので,助かりましたがw 以下,速報です。
速報
記事書いていたら,Apple Watch に CodeHub の通知がきまして,この issue を立てた Fenrirthviti さんがレスポンス返してまして,
遅延はこのコミットに関係ないよ! って。
IRC のログみてると遅延問題の調査が大変なようですね… この詳細な調査は実はできていないですが,彼らはこういうことに対してはプロだと思うので任せようかな,と思います。Fenrirthviti さんがタイムスタンプに関してめっちゃ調査しているようです。OBS 起動してから,PS4 起動するとだめだとか。。。