ColorSystem sample usage

ColorSystem( https://github.com/nikq/ColorSystem )の利用サンプル。

ある色域でマクベスチャートのライティング計算をしたときに
合計でどれくらいのCIE DE2000色差が出るかを計算してみる。

で、これを使ってCCT2500-15000のレンジでrec709,rec2020,ACES2065,ACEScgで合計DE20000を計算した結果がこちら

XYZはD65付近でとても誤差が減るが、それ以外の光源色のときと差が激しい。
この差の激しさってのが問題で、特定のパッチだけ変な色に転ぶような挙動を招く。
結果として、ただのrec709のほうがよほど安定していて良かったりする。不思議なもんですね。

constexprで色

はい。皆さんは、やっていく気持ちですか?

さて、

https://github.com/nikq/ColorSystem

というコードを書いた。これが何かというと、constexprを活用してできる限りコンパイル時に定数化されるような、色関係のライブラリです。もともと3000行くらいの適当にとにかく書き散らした色ライブラリがすでに手元にあったのだが、こいつのメンテナンス性が落ちてきているのと、組み合わせによって固定されるべき行列が何度も計算されるのが嫌だったので書き直した次第。

で、このためにconstexprの活用にトライしてみた。せっかくだからある程度モダンな開発環境にしようと思って、msvc2017+github+vscodeの組み合わせで作っている。しかしコンパイルはコマンドラインからmsbuildを叩いている。連携の仕方が良くわからないからである。

constexprはある程度プログラマブルに書くことができるdefineみたいなもんだ。C++14はだいぶ緩和されるようだが、C++11だと割と条件が厳しい。関数中にreturnはひとつ。ifは書けない。変数代入はconstのみ。まぁ、ほぼlispだと思えばよい(?)

こうしていくと何がうれしいかというと、たとえばrec709からrec2020に変換するような行列(間にXYZを経由する)を求めるとき、以前であれば実行時に毎回行列積が計算されていたわけだけど、今回はできる限り事前に計算されて可能ならば定数として扱われる。実際、clangでコンパイルしてみるとfloatの定数が9個並ぶだけになる。

でも当然ながら問題がないわけでもなくって、例えば、VC12でコンパイルができなくなってしまった…まぁみんな最新版のコンパイラを使おうね!という話でした。