【NVIDIA GVDB Voxels】GPUで動くスパースボクセルライブラリを触ってみる

#はじめに
[NVIDIA GVDB Voxels](https://developer.nvidia.com/gvdb)（以下、GVDB）は、[OpenVDB](https://www.openvdb.org/)のようなデータ構造を持ったボリュームをGPUで描画するライブラリです。
GVDBは2017年の「GPU Technology Conference」でリリースされ、2018年の「GTC 2018」でアップデートされました。
詳しくは[公式サイト](https://developer.nvidia.com/gvdb)を確認してみてください。

今回はライブラリに含まれるサンプルデータのビルドまでの私が行った手順を記述したいと思います。

#ライブラリのダウンロード
ライブラリはGitHubからダウンロードできます。
https://github.com/NVIDIA/gvdb-voxels

展開したフォルダー内には、

- binフォルダー：ビルドされたサンプルデータなど
- sourceフォルダー：ライブラリとサンプルデータのソースコード
- ドキュメント

があります。

###bin内のサンプルデータ(.exe)一覧

| ファイル名       |説明　|スクリーンショット|
|:-----------------|:------------------|:-------------------|
| g3DPrint.exe             |3Dプリントの積層構造を描画 |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/8ea9e573-71a4-9216-8a62-6447df69f9d8.png)
| gDepthMap.exe           |OpneGLシーンとボリュームのマージ|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/d95a1cdf-a58b-238e-ad39-32085e1098ac.png)
| gFluidSurface.exe             |動く流体モデルのボリューム化とレンダリング|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/d0b3e403-ae4c-5150-204d-2de6da21b534.png)
| gImportVDB.exe               |ボリュームの読み込み|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/2038b3e8-f9a3-ae43-45e5-e1790d496977.png)
| gInteractiveGL.exe             |OpenGLでのGVDBの描画|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/51650232-81d0-825b-a7b2-c93350fd4ecf.png)
| gInteractiveOptix.exe          |GVDBとOptiXのマージ|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/6a8ecb9f-0fec-67f3-f1d8-396d0edce08b.png)
| gPointCloud.exe             |ポイントクラウドのポリゴン化とレンダリング|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/77d820a2-92de-dc03-7e08-94ec254fa806.png)
| gPointFusion.exe           |ポイントクラウドのボリューム化|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/74144a99-a1c4-4ccf-1394-0295f6123f47.png)
| gRenderKernel.exe             |ユーザー定義のレンダーカーネル|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/566457fa-168d-12f6-5504-a9786e55f5fe.png)
| gRenderToFile.exe               |レンダリング画像の書き出し|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/7f0b33d4-977e-4ccf-5221-179afb196a07.png)
| gResample.exe             |MRIやCTスキャンの高密度なボリュームデータをGVDBで置き換える|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/e7049746-7cd7-3358-67e0-7a79a5cec901.png)
| gSprayDeposit.exe          |スプレーの塗料が堆積するシミュレーション|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/9d1488a5-1573-2655-664a-40f92f4704d8.png)
スクリーンショットは公式ドキュメント「[GVDB Samples Descriptions v1.1](https://developer.nvidia.com/designworks/gvdb/secure/1.1/GVDB_Samples_1.1-pdf)」より引用
#ビルド環境の構築
###各種ツールのインストール
- [Cmake](https://cmake.org/download/)
- [CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit)
- [OptiX](https://developer.nvidia.com/designworks/optix/download)
- [Visual Studio 2015](https://visualstudio.microsoft.com/ja/vs/older-downloads/)

#ライブラリのビルド
サンプルデータをビルドする前にGVDBライブラリをビルドする必要があります。

###Cmakeでビルドするためのファイルを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/79fd74e5-6cb2-cdce-8206-b5f00b46ab26.png)
![コメント 2019-12-09 175711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/2904e16b-c8fc-e5cf-703c-c0c0ea0c7b67.png)

- 「**Where is the source code**」にライブラリのソースコードのパスを指定
- 「**Where to build the binaries**」に生成されるファイルのパスを指定

**例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/b1035846-653d-0a95-b0f2-90367d00ba7f.png)

パスを指定し「**Configure**」を押すと、設定ウィンドウが開くので下図のようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/a6c5e0bc-347f-119d-939e-2345791c7500.png)

「**Finish**」を押すと自動的にファイルが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/44e5ffcd-7ccd-feb4-6147-dc89b8f8e3f5.png)

次に「**Generate**」を押すと「**Where to build the binaries**」で指定したパスに実際にファイルが書き出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/0fb75cac-0acd-add1-bfab-a208559a78f6.png)

Cmake上の「**Open Project**」を押すか、エクスプローラーから「**.sln**」ファイルをダブルクリックすると、Visual Studio 2015が立ち上がります。

###Visual Studio 2015でビルドする
Visual Studio 2015が立ち上がったら下図のようにスタートアッププロジェクトを「**libgvdb**」にして、ビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/b0151827-5fea-c58b-cf72-2236897b82ea.png)

ビルドが終わると、下図のようにライブラリが書き出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/a06e3c6c-c878-6a75-0ad9-e427d3e66ea7.png)

#サンプルデータのビルド
基本的にライブラリのビルドの手順と同じです。
一例として「**g3DPrint**」をビルドします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/62747106-50a9-e413-ce0f-937cd51c04ef.png)
Visual Studio 2015でサンプルデータをビルドし終えると、下図のように「**g3DPrint.exe**」が生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547740/124abc5c-37f1-97bb-7c19-7f214f9d41f8.png)

#おわりに
今回の手順はすべてNvidiaの公式ドキュメントを参照しながら進めたのですが、いくつかのサンプルはビルドエラーになったり、同梱されていた実行ファイルすら立ち上がらないなどありました。
GVDBライブラリを実際に使っている人が少ないのか、インターネットでも公式以外の情報は殆どありませんでした。

OpenVDBはHoudiniなどのソフトウェアでも使われていますが、CPUベースなので処理が遅いことがあります。
今後、このライブラリのようにGPUが活用されることを期待します。

#参考サイト

NVIDIA® GVDB Voxels | NVIDIA Developer https://developer.nvidia.com/gvdb
GitHub - NVIDIA/gvdb-voxels: Sparse volume compute and rendering on NVIDIA GPUs https://github.com/NVIDIA/gvdb-voxels
GVDB Samples Descriptions v1.1 https://developer.nvidia.com/designworks/gvdb/secure/1.1/GVDB_Samples_1.1-pdf （ログインが必要）