ParaView と NVIDIA OptiX による Scientific Visualization

Naruhiko Tan
NVIDIA Japan
Published in
13 min readAug 18, 2021

NVIDIA の丹です。この記事では、ParaView と NVIDIA OptiX による GPU で加速されたレイ トレーシングを用いた scientific visualization について紹介したいと思います。

はじめに

突然ですが、NVIDIA RTX テクノロジってご存知でしょうか。これは、コンピューター グラフィックスにおける NVIDIA の最新テクノロジで、いくつかのキー テクノロジから構成されています。その中の一つがレイ トレーシングで、NVIDIA OptiX、Microsoft DXR、Vulkan Ray Tracing といった、最適化されたレイ トレーシング API により、映画品質の映像、画像をリアルタイムでのレンダリングを可能にします。これらのテクノロジは、主にゲーム、VFX などのデジタル コンテンツ制作でのみ使われるものと思われがちですが、それだけにとどまらず、科学技術計算の可視化で RTX テクノロジ、さらに具体的には NVIDIA OptiX による GPU で加速されたレイ トレーシングを使うことができるのです。どういうことかと言うと、実はこの NVIDIA OptiX、ParaView にインテグレートされていて (Kitware Blog)、ParaView の中で NVIDIA OptiX を使ったレイ トレーシングによる可視化が可能になっています。加えて、RT コアが搭載された GPU であれば、RT コアによってさらにレイ トレーシングが加速されるのです。レイ トレーシングというとその演算量の多さから、一般にレンダリングには時間がかかることが知られています。一方、絵の品質にこだわりはじめると、光源やテクスチャなど様々な設定を変えて、レンダリングを繰り返すといった試行錯誤が必要になるので、科学技術計算で得られるような大規模なデータを使ったレイ トレーシングによる可視化は、ストレスフルな作業になることが想像に難くありません。これが、ParaView 経由で NVIDIA OptiX を使うことができて、さらにレイ トレーシングが RT コアで加速されるとなると、嬉しい方々も多いのではないでしょうか。しかしながら、ParaView と NVIDIA OptiX を使った可視化に関する情報は、必ずしも十分に提供されているわけではないと感じています。そこで、この記事では、簡単なサンプル データを使って、ParaView と NVIDIA OptiX による科学技術計算結果の可視化方法について、紹介したいと思います。本記事は、こちらのウェビナーをもとにしています。

可視化に使うデータ

この記事では、前記ウェビナーよりもシンプルなデータを使おうと思い、NVIDIA ロゴ周りの流れを計算する toy program を作成しました。この toy program は、格子ボルツマン法を採用していて、速度は D3Q19、単一緩和時間モデルを使っています。物体は level set 関数で表現していて、物体との境界条件は interpolated bouce-back という、極めてシンプルなものです。 ちなみに、OpenACC という指示行ベースのプログラミング モデルで GPU 化しています。こちらのデータを可視化していきます。

ParaView を使った NVIDIA OptiX によるレイ トレーシング

この記事執筆時点での最新バージョンである、ParaView 5.9.1 を使うことにします。早速、ParaView を起動したいのですが、前記ウェビナーでは streaming を有効にするために、以下のように--enable-streamingを付加するよう説明されていました。

$ paraview --enable-streaming

ですが、この方法はすでに deprecate されていて、ParaView 5.9.1 では、通常通り ParaView を起動した後に、GUI で streaming を有効にする必要があります。ParaView を起動すると、私の環境では、以下のようなメッセージが表示されます。ParaView が GPU を認識していることがわかりますね。

$ paraview
VisRTX 0.1.6, using devices:
0: NVIDIA GeForce RTX 3080 (Total: 10.5 GB, Available: 9.9 GB)

ParaView を起動した後に、Edit -> Settings と選択し、General タブの Enable Streaming という項目にチェックを入れます。そうすると、ParaView の再起動を促すようなメッセージが表示されると思うので、素直にそれにしたがって ParaView を再起動します。その後、Enable Streaming の項目を確認すると、チェックマークが入っているはずです。これで準備は整ったので、いよいよ可視化をしていきましょう。

ParaView の基本的な使い方の説明は割愛するとして、データを読み込んで適当な流線を描いてみました。デフォルトの OpenGL によるレンダリングでは、以下のように見えます。ここでちょっとした tips なのですが、流線に tube フィルターを適用しておきましょう。後ほど、レイ トレーシングを行う際に tube フィルターを適用しておかないときれいにレンダリングされません。

ここで、レイ トレーシングを有効にしてみましょう。プロパティ パネルの Enable Ray Tracing にチェックを入れて、バックエンドに OptiX pathtracer を選択し、Progressive Passes を 10000 に設定します。ここで少し操作をしてみると、CPU ベースのレイ トレーシングである OSPRay pathtracer と比べて、レスポンスがとても速いことに気づくと思います。OSPRay pathtracer の場合は、何らかの操作を行うと、その操作が反映されてレンダリングが完了するまでにタイムラグがあるのですが、RT コアで加速された OptiX pathtracer の場合は、ほぼリアルタイムでレンダリングが行われます。様々なパラメーターを調整しながら試行錯誤を繰り返すにあたって、このレスポンスの違いは作業の効率性、生産性に大きな違いをもたらすものと思われます。残念ながらこの記事ではレスポンスの違いを示すことは難しいので、ぜひ RT コアが搭載された GPU を入手していただいて、みなさま自身で体感していただければと思います。

続いて、光源の設定をしていきます。メニューバーから View -> Light Inspector を選択すると、以下のような画面が見えると思います。Light Kit のチェックを外すことでデフォルトの光源をオフにして、Add Light をクリックして新たに光源を追加します。光源の位置を決めて、Radius に適切な値を設定することで、面光源による soft shadow を表現することができます。

マテリアルの定義

ここでは、レイ トレーシングで使うマテリアルを定義する方法について紹介していきます。ParaView には、ospray_mats.json という予め定義されたマテリアル ファイルが同梱されていて、それをロードして使うことができます。ファイル名が示すとおり、JSON 形式で書かれた OSPRay のマテリアル定義ファイルで、バックエンドとして NVIDIA OptiX を選択した場合にも、このマテリアル定義ファイル使うことができます。さらに、これをカスタマイズすることで、新たなマテリアルの定義も可能です。ParaView 5.9.1 の場合だと、以下にマテリアル ファイルが格納されています。

…/ParaView-5.9.1-MPI-Linux-Python3.8–64bit/share/paraview-5.9/materials/ospray_mats.json

ospray_mats.json に新たなマテリアルを定義してみましょう。以下に示す Logo というマテリアルが、今回新たに追加したものです。NVIDIA_Logo.jpg という画像ファイルを適当な場所に格納しておいて、後ほど、この画像を ParaView 内のオブジェクトにテクスチャとしてマッピングしていきます。

{
"family": "OSPRay",
"version": "0.0",
"materials": {
"Checker_Alpha": {
"type": "OBJMaterial",
"textures": {
"map_d": "./textures/checker.png"
}
},
"Glass_Thick": {
"type": "Glass"
},
"Glass_Thin": {
"type": "ThinGlass"
},
"Glass_Water": {
"type": "Glass",
"doubles": {
"attenuationColor": [0.00, 0.467, 0.745],
"etaInside": [1.33]
}
},
"Logo": {
"type": "Principled",
"doubles" : {
"coatColor" : [1.0, 1.0, 1.0],
"coat" : [0.6],
"metallic" : [1.0],
"roughness" : [0.2]
},
"textures" : {
"baseColorMap" : "./textures/NVIDIA_logo.jpg"
}
},
...

各項目の意味については、公式のドキュメントを参照いただきたいのですが、とても雑にまとめると、以下のようなイメージかと思います。

  • type ; マテリアル タイプを指定。Principled は、最も詳細な(複雑な)パラメーターを設定できるマテリアル タイプ
  • coatColor ; クリアコートの色
  • coat ; クリアコート層の強さ
  • metallic ; 金属っぽさ(反射などの観点で)
  • roughness ; 物体表面の粗さ
  • baseColorMap ; テクスチャに使う画像

このマテリアル定義ファイルを ParaView でロードするには、メニューバーの File -> Load Path Tracer Materials… から、先程の ospray_mats.json を選択します。Pipeline Browser でマテリアルを適用する対象をハイライトして、所望のマテリアルを選択します。ここでは、先程新たに定義した Logo を選択します。それにより、以下のように金属のような反射をともなった床面に NVIDIA logo がマッピングされます。この記事では割愛しますが、前記ウェビナーのように、背景画像を設定することも可能なので、必要に応じて試してみて下さい。

被写界深度

注目部位を際立たせるために、被写界深度を設定することも可能です。下図で示すアイコンから、Adjust Camera パネルを開きます。Position と Focal Point を設定し、カメラ位置と焦点を決定します。Focal Distance はカメラからピントが合う位置までの距離、View Angle は焦点の範囲を調整します。Focal Disk は Aperture size を表していて、値が大きい方が、よりボケが強くなります。

これらを適当に設定すると、例えば以下のような絵を得ることができます。

科学技術計算結果の可視化において、このような絵が必要なのか、という点については様々な意見があると思うのですが、研究者、エンジニアの方々は、計算結果を「魅せる」必要がある場面に遭遇することが、少なくないのではないでしょうか。もちろん、計算結果が、科学的、工学的に有用なものであることは大前提ですが、せっかくの有用な結果がよりインパクトを持って伝わるように、このような可視化を適切に使うことは、とても効果的であると個人的には感じています。

おわりに

この記事では、ParaView と NVIDIA OptiX による、GPU で加速されたレイ トレーシングを用いた科学技術計算結果の可視化方法について紹介しました。レイ トレーシングを加速する RT コアを搭載した GPU を用いることで、ここで用いたサンプル データでは、ほぼリアルタイムでインタラクティブな操作が可能でした。加えて、NVIDIA OptiX の様々な機能によって photo-realistic な可視化が実現されることで、より効果的な計算結果の魅せ方が可能になることも紹介しました。とはいえ、ここでは主に ParaView を通しての NVIDIA OptiX の基本的な使い方にフォーカスして紹介したので、NVIDIA OptiX のポテンシャルを十分に引き出せているわけではありません。また、この記事では単相流の可視化を例にとりましたが、自由表面流や気液二相流などでは、レイ トレーシングがより活きる、映える絵が作れるのではないでしょうか。ぜひみなさまご自身のデータで試していただき、NVIDIA OptiX を最大限活用していただけるとうれしい限りです。

最後に完全な蛇足ですが、実はプラグインをインストールすることで、ParaView の中で NVIDIA IndeX によるボリューム レンダリングを行うこともできるのです。冒頭に示してあるアニメーションは、NVIDIA IndeX for ParaView プラグインを使って作成したものです。こちらもぜひ、お試しいただければと思います。

関連情報

--

--