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なサンプルを開く。

https://developer.nvidia.com/usd

かなり重いが、しばらく待つと表示される(はず)
以下の画像は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?)やその他もろもろ対応していないが、一応動くことは動いているようだ