けいブログ

端くれ描画プログラマによるNote

カラーグレーディングLUT調査その2

昨日は Unity の UniversalRP について軽く調査してみましたが、今度は HDRP についてみてみました。

LogC ←→ Linear 変換は同じ処理になっているようです。(同じcoreパッケージの関数を使っている)

UniversalRP は 32x1024(設定による) の2DLUTをピクセルシェーダで構築していましたが、 HDRP は 32x32x32(設定による) の 3DLUTをコンピュートシェーダで構築していました。

3DLUTの場合は、LogC空間のRGB値でそのまま3Dテクスチャをフェッチしたらいいので、すっきりですね。


(もう少し気になることが出てきたら追記、またはその3があるかもです)

カラーグレーディングLUT調査その1

カラーグレーディングかける際に、一番シンプルな実装はピクセルシェーダなどでスクリーンスペースに直接適用する方法です。

それに対して、LUTを経由することで、比較的高価な処理を盛り込むことが可能です。

ただ、LUTは単純な実装だとSDRしか扱えないことから、HDR空間でカラーグレーディングしたい場合は、何かしらの方法でHDRを圧縮することになります。


例えば Unity(UniversalRP) だと、Alexa LogC El1000 のカーブで圧縮を行っているようです。

LogC El1000 は 0~1 を ~58.85663 に変換します。

LogC は sRGB のカーブなどと同じで、低輝度部分にリニア区間を含んでいますが、Unity(UniversalRP)のデフォルトではリニア区間を考慮せずに変換していました。

f:id:keikunnet:20210106233241p:plain
LogC_Graph

Rustその3

今日から仕事でした。新年初日からぐったり。

Rust、例のチュートリアルは本当にゆっくーり進めていて、ようやく9章まで読了しました。

Rust関連で気になっているプロジェクトのメモ。

チュートリアルもまだまだ残っていますが、これらもそのうちさわれたらと思います。

Falcorさわってみる

NVIDIAのリアルタイムレンダリングフレームワークである Falcor をさわってみました。

github.com

自分の環境でビルドすると、c4819(Unicodeにする必要があります的な)警告が大量に出ました。 ひとまずプロパティ設定で、特定の警告を無効にすることに。(VisualStudio,日本語の環境だとutf-8にBOMを付けないとダメ?)


いくつかのプロジェクトを実行してみた後、Docs/Tutorials/ を見て自前の RenderPass(RenderGraphのノード) を実装してみました。

内部的な実装はあまりみていないけど、上記チュートリアルはサクッとできて良い感じです。


抽象化レイヤーの実装など興味があるので、後日Falcorの内部的なところも見ていきたいと思います。

note: 確率密度関数とモンテカルロ積分

確率密度関数モンテカルロ積分の簡易メモと参考にさせていただいたリンクです。

pdfの除算

モンテカルロ積分 \displaystyle
\frac{1}{N}\sum_{i=1}^{N}\frac{f(X_i)}{pdf(X_i)}
と定義されるが、どうしてpdfで割るか。

感覚的には、たくさんサンプルする(確率が高い)場合の重みを小さくする(その分たくさん評価するので全体的には少ないサンプル数で近い値を得ることができる)。

モンテカルロ積分の期待値を定積分で得られる値に一致させることを考えると、pdf除算することがわかる。

一様分布の乱数から複雑な乱数をつくる

とある確率分布に従う乱数Xを一様分布の乱数Uから作るには、その累積分布関数の逆関数を使って、 X = F^{-1}(U) とすれば良い。

note: 浮動小数点数

浮動小数点数の最大・最小値や有効桁数(精度)についての備忘録です。

32bit float

bit表現

一般的な標準フォーマットであるIEEE-754によると、 符号部が1bit。指数部(E)が8bit。仮数部(M)が23bit。

特殊ケース(E=0, E=255)を除いた値の決め方は以下の通り。

 2^{(E-127)} \cdot (1 + \frac{M}{2^{23}})

表現できる最大・最小の数

最大は  E=254, M={2^{23}}-1 を考えるので、およそ  3.4028 \cdot 10^{38}

最小は  E=1, M=1 を考えるので、およそ  1.1754 \cdot 10^{-38}

E-127=0 のときに表現できる最小の数

M=1を考えるので、 2^{-23} \approx 1.1920 \cdot 10^{-7}

10進数で小数点以下7桁くらいが表現できる最小の数であることがわかる。

ここで有効桁数について調べると、2進数で24桁(仮数部23桁とプラスする1)あるので、10進数では  log_{10}{2^{24}} \approx 7.2247 桁。

一般化

指数部のbit数をA、仮数部の桁数をBとしたときに:

最大  2^{(2^{(A-1)}-1)} \cdot (1 + \frac{2^{B}-1}{2^{B}})
最小  2^{-(2^{(A-1)}-2)} \cdot (1 + \frac{1}{2^{B}})
有効桁数  log_{10}{2^{(B+1)}}

32bit float 以外の浮動小数点数

A B 最大 最小 有効桁数
double(64bit) 11 52  1.7976 \cdot 10^{308}  2.2250 \cdot 10^{−308} 15.9545
half(16bit) 5 10 65504 0.00006109 3.3113
符号なし11bit 5 6 65024 0.00006198 2.1072
符号なし10bit 5 5 64512 0.00006294 1.8061

アウトプットできる年になりますように

2021年になってしまいました。

今日はTV見ながらボーとしたり、お雑煮作ったり。 あと生まれて初めてお重に入ったおせちを買ってみました。

今年はたくさんアウトプットできる年になるよう、ほどほどにやっていきます。