macOS で Blender を使うときのカラーマネジメント設定

長年悩んでいたことの解決策をけさ見つけたので興奮して書き残しておきます。

Mac で Blender を使うときに困ることとしてビューポートやレンダリングの色が期待するものと一致しないということがあった。これは Blender の Render Properties にある [Color Management] の [Display Device] が “sRGB” しか選べず、いっぽうでさいきんの Mac のディスプレイはより広色域の Display P3 を搭載しているためだ。

Display P3 のモニタで sRGB のつもりで描画している画を映すとどうなるかというと、じっさいよりも色がどきつく出る。そしてその設定でレンダリングするとこんどは鮮やかさに欠けた色になって出てきてしまう。

“sRGB” と “XYZ” しか選べない。

この [Display Device] に “Display P3” の選択肢がない以上これを解決する方法はなく、いままではしかたなく sRGB で使ってレンダリング結果を自分の感覚でレタッチするみたいな使いかたをしていた。しかしこれだと不便である。作業中ビューポートの色を信用できないのもつらい。

ところが、さいきん知ったのだが Troy James Sobotka さんという方が、最新の Blender カラーマネジメント設定を GitHub で配布しているのである。この方はそもそもいまの Blender で採用されている Filmic 変換を作ったお方なので、ある意味本家である。Blender 本体に Filmic が取り込まれたあともアップデートは続けられていたみたいで、この最新版(といっても2018年のだけど)の Filimic 設定に、Apple Display P3 のディスプレイプロファイルが含まれている。

Filmic と色変換については Blender Guru のすばらしい解説があります。

この動画はまだ Blender に Filmic が取り込まれていなくて、Sobotka 氏の設定をインストールするところから解説していることに注意。いまは sRGB 環境ではなにも追加で作業することなく、デフォルトで Filmic 変換が設定されている。……のだが、Mac だと上述のような不便があるので、最新版の Filmic をダウンロードして Blender に入れるということをやる。

Filmic 変換のインストール方法は GitHub のプロジェクトページに書いてあるのでわざわざここには書かないでいいかなと思ったけど、Mac の場合は App パッケージの中に設定が入っているのでちょっとだけ注記しておく。

ダウンロードは ZIP ファイルになっているのでこれは展開する。filmic-blender-master というフォルダになると思うのであとの便宜のためにこれを colormanagement にリネームしておくといいです。

Blender はアプリケーションフォルダに入っていると思うので、アイコンを右クリック(or Ctrl+クリック)してコンテキストメニューを出し、[パッケージの内容を表示] を選択すると Finder でアプリの中身に入れる。この中の Contents/Resouces/2.93/datafiles フォルダの中に、colormanagement フォルダがある。”2.93″ の部分はバージョン番号なので Blender のバージョンによって違うはず。

このフォルダをダウンロードしたものと入れ換えるわけだが、そのまま上書きすると元に戻せないので、元のフォルダを colormanagement.orig などにリネームしておいてダウンロードしたフォルダを datafiles に入れるとよい。

これで Blender を起動すると、カラーマネジメントで [Display Device] に “Apple Display P3” が選べるようになっているはず。

“Apple Display P3” が選べる!

モニタで見たとおりの色でレンダリングできるのはすばらしい。

さて、GitHub で説明されている Filmic のインストール方法にはもうひとつあって、それはこのフォルダに含まれている config.ocio ファイルの場所を環境変数で設定してやるというやりかた。これはオプショナルなのでさっきのフォルダコピーのインストール方法でいいやという人はやる必要はない。しかしそれだとこの先アプリをアップデートするたびに Filmic をコピーしなおさなければいけないという不便がある。設定一式をホームディレクトリのどこかに置いといて環境変数でそこを参照するようにしておけばその必要はなくなる。

私は ~/Library/Blender/datafiles というフォルダを作ってそこに colormanagement という名前でダウンロードした最新 Filmic 設定を置いてみた。場所はどこでもよい。

ターミナルで環境変数を使うときは setenv でやればいいのだけど Mac の GUI アプリで環境変数設定された状態で起動できるのかというと launchctl コマンドを使うとできる(というのを調べた)。

ターミナルを立ち上げ、launchctl setenv OCIO $HOME/Library/Blender/datafiles/clolrmanagement/config.ocio を実行し、その後ふつうに Blender を起動すると、先ほどと同様のインストール結果になるはずである。

しかしこの環境変数は Mac 再起動すると消えてしまうんだと。再起動時に自動で任意の環境変数を設定する方法はと調べたところ、plist ファイルを作って所定の場所に置けばいいということがわかった。(『macOSでlaunchctlを使ってアプリの環境変数を設定する – CrossBridge』

以下のような XML ファイルを作成し ~/Library/LaunchAgents/ に置いた。ファイル名は ocio.blender.plist にした。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>ocio.blender</string>
    <key>ProgramArguments</key>
    <array>
      <string>/bin/launchctl</string>
      <string>setenv</string>
      <string>OCIO</string>
      <string>/Users/mshibata/Library/Blender/datafiles/colormanagement/config.ocio</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

できたら Mac を再起動させるとほかの方法同様に最新版の Filmic 設定で Blender を使える。

で、Mac で Blender をまともな色で使おうとするとこの手順は必須だと思うのだが、私はこれをわかりやすくガイドしている記事はいままでひとつも見つけられなかった。英語でもなかったと思う。みんな私みたいにおかしな色で使ってたの?

まあとにかくこうして解決策がわかったわけなので、Mac で Blender 使う人たちは今後はこの手順を踏んで幸せに使っていきましょう。Blender 3.0 が出たら最初から Display P3 選べるようになってたらいいな。

ひみつメモ帳を現行の macOS に対応させたい

ひみつメモ帳で使っていた OpenSSL ライブラリは、現行の macOS (Mojave) だと標準装備されなくなっている。したがって自分で openssl ライブラリをビルドして同梱する必要がある。ソースをダウンロードして自分でビルドしてもいいが、Homebrew か MacPorts を使うと楽そう。あまり考えずみんな大好き Homebrew にしてみる。

Homebrew でインストールしたライブラリとリンクしてビルドするところまでは簡単。しかしここで問題が出る。できたバイナリは openssl ライブラリを Homebrew でインストールしている環境でしか動かない。ユーザーに Homebrew で手作業で入れてもらうわけにもいかないし。バイナリがどこのライブラリを見にいくかは otool -L でわかる。

こういうときの定石としては、アプリのパッケージ内にライブラリをコピーしてそれを使うようにすればいいらしい。Xcode のビルド設定でできる。しかしコピーするだけで実行ファイルがそのライブラリを探すようになるわけではないので動かない。そこでビルド後の Run Script フェーズで install_name_tool を使ってバイナリのライブラリ参照先を書き替える。

これで .app 単体でどの環境でも起動するようになった。Parallels で作った新規インストールの macOS で確認。いまの macOS は開発、テスト用に仮想環境に2つまでコピーをインストールできることが使用許諾に含まれている。

しかしこのプロジェクトをアーカイブしてストア用に validate すると通らない。

OpenSSL の .dylib バイナリに LC_VERSION_MIN_MACOSX ロードコマンドが含まれていないのがエラーのひとつ。このライブラリは Homebrew で入れたものなので、brew install のビルド設定を変えないとだめそう。

ここでものすごく時間を費やす。

けっきょく、Homebrew では LC_VERSION_MIN_MACOSX を付けるビルドにカスタマイズすることはできないというのを発見する。Homebrew は捨てて MacPorts を使え。

MacPorts でもそのまま欲しいパッケージを入れると LC_VERSION_MIN_MACOSX は付かない。ちなみにこの確認は otool -l でできる。そこで /opt/local/etc/macports/macports.conf を編集して設定を変更する。

末尾に

macosx_deployment_target 10.12

の設定を追加。ちなみにこのオプションは文書化されていない(ファッ○)。

また、~/.bash_profile に export MACOSX_DEPLOYMENT_TARGET=10.12 を追加してみたが、これははなくても LC_VERSION_MIN_MACOSX が付いたので消した。参考にしたサイトには universal_target と macosx_sdk_version も指定するよう書いてあったが、universal_target オプションはいまの MacPorts では廃止されたのでもう存在せず、macos_sdk_version はおそらくビルドに使う SDK のバージョンなので、対象となる OS のバージョンの設定とは無関係とみて設定しなかった。

上記の作業をやったうえで、インストール時に、

sudo port install -s openssl

と -s オプション付きで導入すればよい。このオプションを付けるのは、そのままだとパッケージによってはビルド済みバイナリを取ってきて導入してしまうからで、それだともちろんビルド設定は反映されていない。ソースからちゃんとビルドするように指定するオプション。ただし当然ながら導入までの時間は長くかかる。

(2020-04-07追記) /opt/local/etc/macports/macports.conf の buildfromsource オプションを always にすると毎回 -s オプションを付けなくてもソースからビルドしてくれる。

これでアプリの validation における .dylib の問題は解決。その後 App ID が登録されてないとかカテゴリが一致してないとかあったがそれはアップルの開発者サイトで登録したり Xcode で設定を合わせたりすればよい。

アプリのサンドボックス関連の検証エラーで、.entitlements ファイルの com.apple.security.app-sandbox の値が真になってないとか言ってくることがあるが、.entitlements ファイルを見てもちゃんと設定されている。これはターゲットの設定の Capabilities にある App Sandbox 設定を on にすればよい。

アプリの登録ページで、ひみつメモ帳は暗号関係ライブラリを使ってるので、米国の輸出規制対象となるのでコンプライアンス書類を提出する必要がある。いまここ。めんどくさそう。

Vcpkg

Vcpkg は、Visual C++ でオープンソースのライブラリをパッケージとして簡単に管理できるツールとして Microsoft がさいきん公開したツール。GitHub で公開されている。

有名どころのライブラリはほとんどがすでにポートとして網羅されていて、boost、curl、gettext、gtk などを vcpkg コマンドを使って VC++ で使うためにビルドできる。個人的に気になるのは freetype, icu, opencv, openssl, python3, wxwidgets あたりかな。これまで NuGet にもあった WTL はこっちにもある。

オープンソースのライブラリはメインターゲットがほとんど Linux なので Windows で使おうとすると README 読んで自分でがんばるしかないという状況だったので、MS 謹製でこういうものを用意してくれるとありがたい。Visual Studio でこれらを扱う標準的なやりかたが出たのも大きい。

たとえば、ひみつメモ帳は OpenSSL と(現在公開しているバージョンでは)wxWidgets を使っているのだけど、それぞれ自力でビルドしてプロジェクトの設定にマニュアルでパスを追加している。これが、コマンドラインで vcpkg install openssl wxwidgets とだけ叩けば、プロジェクトのソースで #include <openssl/crypto.h> といきなり書けるようになる。ビルドの設定じゃなくてコードに集中できてよい。

気になるのは、OSS のライブラリに交じって、ATL とか MFC とかのポートが含まれているところ。あんまり使う機会はなさそうだけど、やるとどうなるのだろう。

Visual Studio Code

WZ を離れて以来テキストエディタ難民状態だったけど、さいきんは VS Code に落ちついてきた。Sublime Text は開発ペースが遅すぎるし Atom は動作が遅すぎた。Code は Windows と Mac で動くし開発も盛んだし VCS 連携で Mercurial のプラグインがあるのもよい。

ためしてないけど Arduino のエディタとしても使えるらしい。

個人的には優先事項ではないけれどメニューが日本語化されているので会社でほかの人に勧めやすいのもある。