USDのビルド
USDのビルド
2021/4/17更新:現時点の最新版v21.05でのビルドを確認→AlembicがILM_BASEの設定か何かで詰まる
→逆にOpenImageIOのビルドが通るようだ
2020/12/28更新:v20.11 でのビルドに対応。
(更新内容:--build-monolithicを追加、curlのエラーに対応等。)
USDは公式でビルド済バイナリを取得できるが、
Embreeプラグインが入ったものが欲しかったので、ビルドしてみた。
環境
Windows10 最新
VS2017 Update最新
Python2.7 x64版 (Python3系では、下記の通り少しコツがいる)
CMake3.16 (偶然3.16が入っていたので使ったが、3系最新のほうがたぶん良い)
事前準備(Python2系の場合)
python.exeがあるディレクトリ(C:\Python36など)
pip.exeがあるディレクトリ(C:\Python36\Scriptsなど)にパスを通す。
(USDビルド時にpyside-uic.exeを使用するようなので両方必須)
以下のライブラリをpythonに追加でインストール。
> python -m pip install PySide
> python -m pip install PyOpenGL
↓ドキュメントに書いていないけど必要だった
> python -m pip install Jinja2
NASM というのをインストールし、PATHに追加しておく
https://www.nasm.us/
とりあえず現時点の最新のインストーラでインストールした
https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/win64/
また、ネットワーク経由でライブラリをダウンロードしてくるような処理が入っているので、ウイルス対策ソフトがブロックしないように、オフにするなり例外設定するなりしておく。
事前準備(Python3を使いたい場合)
Python3では、PySide2を使用する。
> python -m pip install PySide2
> python -m pip install PyOpenGL
> python -m pip install Jinja2
また、ビルド途中で、以下のようなエラーに見舞われるので、
STATUS: Installing zlib...
STATUS: Installing boost...
ERROR: 'utf-8' codec can't decode byte 0x83 in position 3: invalid start byte
build_usd.pyの中にある、ログを書きだしている場所のdecodeに、以下のように変更
(関連issue:https://github.com/PixarAnimationStudios/USD/issues/1165)
// 102行目付近
def GetCommandOutput(command):
"""Executes the specified command and returns output or None."""
try:
return subprocess.check_output(
shlex.split(command),
stderr=subprocess.STDOUT).decode(GetLocale(), 'ignore').strip()
except subprocess.CalledProcessError:
pass
return None
// 255行目付近
# Let exceptions escape from subprocess calls -- higher level
# code will handle them.
if logCommandOutput:
p = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
while True:
l = p.stdout.readline().decode(GetLocale(), errors="ignore")
if l:
logfile.write(l)
PrintCommandOutput(l)
elif p.poll() is not None:
break
else:
p = subprocess.Popen(shlex.split(cmd))
p.wait()
if p.returncode != 0:
# If verbosity >= 3, we'll have already been printing out command output
# so no reason to print the log file again.
if verbosity < 3:
with open("log.txt", "r", encoding="utf-8", errors="ignore") as logfile:
Print(logfile.read())
raise RuntimeError("Failed to run '{cmd}'\nSee {log} for more details."
.format(cmd=cmd, log=os.path.abspath("log.txt")))
また、最近Embreeが自動でダウンロードされてビルドされるようになったようだが、ビルド開始前に以下のようなエラーに見舞われるので、
curl -s -L -o v3.2.2.tar.gz.tmp https://github.com/embree/embree/archive/v3.2.2.tar.gz
ERROR: Failed to download https://github.com/embree/embree/archive/v3.2.2.tar.gz: Failed to run 'curl -s -L -o v3.2.2.tar.gz.tmp https://github.com/embree/embree/archive/v3.2.2.tar.gz'
See D:\USD\src\log.txt for more details.
curlでのダウンロードに失敗するので、以下を追加する
def DownloadFileWithCurl(url, outputFilename):
# Don't log command output so that curl's progress
# meter doesn't get written to the log file.
Run("curl {progress} --ssl-no-revoke -L -o {filename} {url}".format(
progress="-#" if verbosity >= 2 else "-s",
filename=outputFilename, url=url),
logCommandOutput=False)
ビルド
「VS 2017 用 x64 Native Tools コマンド プロンプト」
を開き、USDディレクトリの1個上に移動。
> python USD\build_scripts\build_usd.py
で、ビルドコマンドの引数を確認(画像のように表示される)
> python USD\build_scripts\build_usd.py --usd-imaging --materialx --alembic --build-monolithic --embree --tests D:\USD
出力先を引数にし、好きなオプションを加えてビルド。
なんと依存ライブラリのダウンロード&ビルドも、ほとんど勝手にやってくれる。ここではD:\USDが出力先としている。
--build-monolithic
を付けると、すべてのDLLを1つのDLLにまとめてくれるようだ。USDのDLLは膨大な数あるので、こちらのほうが自作アプリなどに組み込むには便利。
embreeは事前に手動でダウンロードして、引数で場所を指定する必要があるようだ。どうやらembreeは2系じゃないとビルドできない。
また、openimageioあたりは現時点で上手く行かなかったので気を付けたほうが良い。
成功すると以下のように Success! と出てくる。
書いてある通りPYTHONPATHとPATHを設定する。
無事設定したら、bin/usdviewを実行してみる。
まずは引数無しで叩くと、以下のようになる。
続いて、NVIDIAが公式で配っている、PublicDomainなサンプルを開く。
かなり重いが、しばらく待つと表示される(はず)
以下の画像はPython3でビルドしたものを実行している。
デバッグ版のビルド
ビルド時に、build_usd.pyに--debugフラグを付けるようなんだけど、
Release版の出力先に出力して、共存してくれるのか怪しいので、念のため別の出力先に出力する。
しかし、ゼロからやるともう一度ライブラリ群をネットからダウンロードしてくると思われるので、通信量&時間節約のために、Release版の出力先のsrcフォルダのみを、Debug版の出力先(予定)にコピーしておく。
> python USD\build_scripts\build_usd.py --debug --usd-imaging --materialx --alembic --embree --tests D:\USDDebug
それからデバッグオプションを付けてビルドを実行。
Release版がビルド出来ていたなら、特に問題なくビルド完了するはず。
VisualStudioでのデバッグ
出力先/build/USD の中に、slnファイルがあるので、それを普通に開いてビルド&デバッグできる。
CMakeが生成したプロジェクトとなっており、スタートアッププロジェクトはALL_BUILDになっている。
そのままでやる場合は、ALL_BUILDの構成プロパティ[デバッグ]の、コマンド、コマンド引数、作業ディレクトリを指定することで、VCからusdviewを起動してデバッグすることができる。
hdEmbreeプラグインを動かす
hdEmbreeプラグインは、USD/plugin/usd/hdEmbree.dllにあるものが、実行時に動的に読み込まれる。このとき、本家のembree自体のdll(つまりembree.dll)が読み込めないと、よくわからないエラーを吐いて、何事もなかったかのようにGL表示となる。
つまりは、USD/bin/にembree.dllを置くと、読み込めるはず。
なお、VSでプロジェクトを開いて、ビルドしたところ、USD/plugin/usd/hdEmbree.dllではなくて
USD\build\USD\pxr\imaging\plugin\hdEmbree\Release
USD\build\USD\pxr\imaging\plugin\hdEmbree\Debug
などにhdEmbree.dllが生成されていた。ブレークポイントで止めたい場合は注意(かなりはまった)
↓EmbreeでのNVIDIAシーン表示。このシーン用のマテリアル(MDL?)やその他もろもろ対応していないが、一応動くことは動いているようだ