インテル® Open Image Denoise ライブラリーで、時間の節約と品質の向上

ゲーム開発者は、臨場感や没入感を高めるためにレイトレーシングを使用する際、複雑なトレードオフに直面しています。レンダリングは、高品質な画像に完全に収束するまでに数時間かかることがあるため、多くの場合、収束までの時間を数桁短縮するためにノイズ除去手法が使用されます。ノイズ除去フィルターは、ノイズを減らして画質を向上させることができますが、高品質・高性能なノイズ除去フィルターの開発は難しく、その分野の専門知識が必要です。

これらの課題を解決するために、インテルは、レイトレーシングでレンダリングされた画像用の高性能なオープンソースのフィルターを備えた完全なソリューションを開発しました。ベータ版として提供された時点で、ゲーム開発エンジン 「Unity*」 に統合されていました。このホワイトペーパーでは、ノイズ除去について説明し、インテルのソリューションを紹介するとともに、開発者がゲームに複雑さと画質を追加するのにどのように役立つかを示します。

新しいノイズ除去ライブラリー

インテル® Open Image Denoise は、インテル® レンダリング・フレームワークの一部であるオープンソース・ライブラリーで、Apache* 2.0 ライセンスで公開されています。その目的は、レンダリング時間を大幅に短縮する高品質なソリューションをオープンソースで開発者に提供することです。このライブラリーは、パストレーシングなどのレイトレーシング手法に共通するモンテカルロ・ノイズをフィルタリングすることで、レンダリング時間を大幅に短縮します。

ライブラリーの特長

  • 画素ごとに必要なサンプル数の削減に役立つ
  • 柔軟な C/C++ アプリケーション・プログラミング・インターフェース (API) を搭載
  • 充実したドキュメント
  • ほとんどのレンダリング・ソリューションに簡単に組み込むことが可能

David Bookout 氏がインテルに寄稿した記事によると、レイトレーシングとは、「光の通り道をイメージプレーン上のピクセルとしてトレースすることで画像を生成し、その光の通り道がさまざまなオブジェクトに遭遇したときの効果をシミュレートするレンダリング手法です。その結果は驚くべきものになりますが、計算量は膨大なものになります。」

画像のノイズは、多くの場合、計算機の限界に起因していると、インテルのグラフィックス・ソフトウェア・エンジニアである Attila Áfra は述べています。Áfra はコンピューター・サイエンスの博士号を持ち、レイトレーシング・ベースのレンダリングの専門家でもあります。また Áfra はビジュアライゼーションとレンダリングの問題解決に特化したオープンソース・ライブラリーの開発にも貢献しました。インテル® Embree レイトレーシング・ライブラリーと高忠実度のビジュアライゼーション・ライブラリーであるインテル® OSPRay プロジェクトに携わり、現在はインテル® Open Image Denoise ライブラリーに専念しています。

 

図1. Amazon Lumberyard Bistro のオリジナル画像を、1 ピクセルあたり 64 サンプル (spp) でレンダリングしたもの。窓にノイズが入り、粒状になっているのがわかる。(このドキュメントに掲載されている画像は、オリジナルとノイズ除去効果の違いをスライダーで確認できるようになっており、Open Image Denoise Gallery に掲載されています。)

 

図2. 窓のノイズが減り、全体的にきれいになったノイズ除去画像。

 

「レイトレーシングのアルゴリズムの多くはストキャスティック (確率的) です。つまり、基本的には乱数を使用するため、結果として画像にノイズが発生します。」 (Attila Áfra)。しかし、レンダリングを重ねることで、より多くのサンプルを集めることができ、ノイズは減少していきます。理論的には、十分な時間と計算能力があれば、画像はグラウンドトゥルースに収束し、ノイズは除去されます。

しかし、完全なノイズ・リダクションを行うには、時間的にも計算能力的にも非常にコストがかかります。「完全に収束した画像を作成するには非常に時間がかかるため、これをオフラインで行う必要があります。」 (Attila Áfra)

 

ライトマップでレンダリング時間を短縮

フォトリアリスティックな結果を得るための近道として、画像内の表面から反射する光をマッピングする方法があります。ライトマップは最終的なイメージではありませんが、レンダリングを高速化するために使用することができます。

「ゲームでライトマップが使われるのはこのためです。収束されたレイトレース画像をリアルタイムに作成することは、現在のハードウェアではほとんどの現実的なケースで不可能です。そこで、どのビューにも依存しないライトマップを事前に計算しておくという方法があります。」 (Attila Áfra)。マップはジオメトリーと光を表現したもので、開発者はライトマップが事前に計算されているため、リアルタイムにレンダリングすることができます。そして、そこからさらにエフェクトをかけて、画像を向上させることができます。Áfra は、事前に計算されたライトマップの使用例として、ゲームエンジンの Unity* や Unreal* などを挙げています。

もう一つの方法は、完全に収束した画像をレンダリングせずに、ノイズ除去ソリューションでノイズを除去することです。しかし、このような方法では、アーチファクトが発生する可能性があります。また、アルゴリズムによっては、理想的な画像 (「グラウンドトゥルース」と呼ばれる) の近似画像を作成するだけでも、かなりの計算が必要になります。「使用するノイズ除去アルゴリズムの品質によっては、かなりの時間を要することになります」 と Áfra は警告します。さらに、ほとんどの市販のノイズ除去ライブラリーは、独自のものであったり、ハードウェアに制限があったり、あるレンダリング・ソリューションに特化したものであったりします。

Áfra によると、高品質なノイズ除去アルゴリズムの実装は難しく、時間がかかるため、ほとんどの開発者は自身で行うことは難しいと述べています。だからこそ、Áfra の近年の研究はとても重要なのです。

インテル® Open Image Denoise ライブラリーは、過去 10 年間に製造されたほとんどの CPU で動作します。オープンソースなので、ユーザーはコードを分岐させ、必要に応じて微調整することができます。また、献身的な開発者による大規模なコミュニティーでは、洞察力、進歩、バグレポートなどを共有することができます。このライブラリーが成熟するにつれ、さらに多くのメリットが得られるようになるでしょう。

「オフラインでもリアルタイムでも、どのようなレイトレーシングを行っても、良いパフォーマンスを得るためにはノイズ除去が必要です。用途や時間の制約に関わらず、レイトレーシングをより実用的なものにするための技術です。」 (Attila Áfra)

このライブラリーは効率的なノイズ除去ライブラリーを使用することで、収束したライトマップの作成時間を数桁短縮することができ、開発者のアセット生成方法を大きく変えることができます。デザイナーがゲームレベルを編集する際には、ライティングを検査する必要があり、それを何度も繰り返すことになります。そして、最終的にはベイクを行い、究極のクオリティーを追求します。1 つのレベルのベイクに数時間、設定によっては数日かかることもあり、これではせっかくのインタラクティブなワークフローが台無しになってしまいます。新しいノイズ除去ライブラリーを使えば、その時間を大幅に短縮できます。

 

図3. ドブロブニクのアトリウム・スポンザ宮殿 (Marko Dabrovic氏のオリジナルからインスピレーションを得て、Crytek*のFrank Meinl氏が改装)。16pp でレンダリングし、粒子状の石積みと影を表現している。

 

図 4. よりきれいになったノイズ除去画像。(その他のノイズ除去の例はインテル® Open Image Denoise ページでご覧いただけます)

 

完全にトレーニングされた AI

インテル® Open Image Denoise ライブラリーの核となるのは、ディープラーニング・ベースのノイズ除去フィルターで、1 サンプル / ピクセル (spp) からほぼ完全に収束するまでの幅広い設定に対応できるようにトレーニングされています。そのため、プレビューと最終フレームの両方のレンダリングに適しています。

Áfra のチームは、ノイズ除去という課題に AI を適用し、優れた結果を得ました。レイトレーシングでも AI によるノイズ除去を行っていましたが、AI によるノイズ除去は、高品質・高性能という点で現在の最先端の技術です。

インテルのチームは、ノイズの多い画像とノイズのない完全に収束した画像のペアを使って AI をトレーニングしました。AI は、開発者から提供された例題から得た情報をもとに、画像をノイズ除去する方法を学習しました。インテル® Open Image Denoise ライブラリーには、パストレースされた画像を扱うために開発された、完全にトレーニングされた AI ネットワークが搭載されています。さまざまな用途、ノイズレベル、テーマ設定、照明設定に対して、AI は苦労してパラメーターを追加入力することなく解決策を導き出します。

このフィルターは、ノイズの多いカラー (“beauty”) バッファーだけを使って画像をノイズ除去することができます。また、可能な限りディテールを保持するために、”albedo” や “normal” などの補助的なバッファーを利用することもできます。このようなバッファーは、ほとんどのレンダラーで任意の出力変数 (AOV) としてサポートされており、通常は少しの努力で実装できます。

インテル® Open Image Denoise ライブラリーを使用してレンダリング時間を短縮することで、開発者はより複雑なシェーディングや高品質なグラフィックスを導入することができます。以前は、レンダリングに何日もかかってしまうため、開発者はシーンやレベルに複雑な要素を導入することを躊躇していました。この新しいソリューションにより、開発者のビジョンが許す限り、複雑さと創造性を導入することができます。

この機能は、インテル® 64 アーキテクチャー・ベースの CPU および互換性のあるアーキテクチャーをサポートしており、インテル® SSE4、インテル® AVX2、インテル® AVX-512 などの命令セットを自動的に利用します。このライブラリーは、ラップトップ、ワークステーション、およびハイパフォーマンス・コンピューティング (HPC) システムのコンピュートノードで動作します。また、柔軟な C/C++ API により、ほとんどのレンダリング・ソリューションに簡単に統合することができます。

 

シンプルであることが重要

API のメイン・オブジェクトは、実際にノイズ除去を行うデバイスです。CPU が唯一のデバイスである可能性もありますが、後にライブラリーが改良されると、オブジェクトが GPU デバイスになったり、あるいはまったく別の種類のデバイスになったりする可能性もあります。デバイス・オブジェクトが特定されると、開発者はノイズ除去のためのバッファーを作成することができます。これらのバッファーには、色やアルベドなどの属性が含まれます。

ライブラリーは基本的にフィルターのコレクションであり、いくつかは密接に関連しています。開発者は自分のニーズに合ったものを選ぶことができます。フィルター・オブジェクトは、実際のノイズ除去を行います。ライブラリーの初期バージョンには、RT というレイトレーシング用の汎用フィルターが搭載されています。その後のリリースでは、RTLightmap という名前のフィルターを搭載し、ライトマップの品質をさらに向上させる予定です。

フィルター・オブジェクトの作成後、開発者はバッファーを指定し、フィルターの入力画像と出力画像を指定します。実際のノイズ除去を行う関数を呼び出すと、フィルターが実行され、出力が作成されます。

つまり、API を使用するには、デバイスを作成し、そのデバイスから必要に応じてバッファーを作成し、入力画像と出力画像を指定してフィルター・オブジェクトを作成し、フィルターを実行します。

 

コードを解読する

インテル® Open Image Denoise ライブラリーは、C99 API (C++ とも互換性あり) と C++11 ラッパー API を提供しています。API はオブジェクト指向の設計になっているため、デバイス・オブジェクト (OIDNDevice 型)、バッファー・オブジェクト (OIDNBuffer 型)、およびフィルター・オブジェクト (OIDNFilter 型) が含まれています。

すべてのオブジェクトは、リファレンスカウントされます。ハンドルは、適切なリリース関数 (OIDNReleaseDevice など) を呼び出してリリースしたり、リファレンスカウント (OIDNRetainDevice など) をインクリメントして保持したりすることができます。

いくつかの例外を除いて、オブジェクトのパラメーターを設定してもすぐには効果がありません。パラメーターが更新されたオブジェクトは、そのパラメーターが明示的にオブジェクトにコミットされるまで使用できません。つまり、複数の小さな変更を一括して行うことができ、ユーザーはオブジェクトの変更がいつ行われるかを正確に指定することができます。

すべての API コールはスレッドセーフです。ただし、同じデバイスを使用する操作はシリアル化されるため、異なるスレッドからの API コールは最小限に抑える必要があります。

以下は、GitHub* に掲載されている、Áfra による C++ (バージョン 11) の簡単なコード例です。

#include <OpenImageDenoise/oidn.hpp>
...
// Create an Open Image Denoise device
oidn::DeviceRef device = oidn::newDevice();
device.commit();

// Create a denoising filter
oidn::FilterRef filter = device.newFilter("RT"); // generic ray tracing filter
filter.setImage("color",  colorPtr,  oidn::Format::Float3, width, height);
filter.setImage("albedo", albedoPtr, oidn::Format::Float3, width, height); // optional
filter.setImage("normal", normalPtr, oidn::Format::Float3, width, height); // optional
filter.setImage("output", outputPtr, oidn::Format::Float3, width, height);
filter.set("hdr", true); // image is HDR
filter.commit();

// Filter the image
filter.execute();

// Check for errors
const char* errorMessage;
if (device.getError(errorMessage) != oidn::Error::None)
  std::cout << "Error: " << errorMessage << std::endl;

時間と品質のバランス

ゲーム・プログラマーは膨大な時間の制約に直面していますが、最適化されていないシステムで毎秒 60 フレームを実現するには何日もかかります。「誰もそんなことは望んでいません。誰もがより速いレンダリングを望んでいます。リアルタイムであろうとオフラインであろうと、速い方がいいに決まっています。」 (Attila Áfra)

ノイズの多い画像とノイズを除去した画像を比較した場合、その差はわずかなものから劇的なものまであります。「何が描かれているのかほとんどわからないようなひどいノイズを含んだ画像から、非常にきれいな画像を得ることができます。」 (Attila Áfra)。しかし、その差はわずかなものかもしれません。なぜなら、その画像はすでに可能な限り最高の品質に近いものだからです。しかし、多少ノイズの多い画像であっても、インテル® Open Image Denoise ライブラリーの恩恵をすぐに受けることができます。「このノイズ除去は、完全に収束した画像を完全に再現することはできませんが、桁違いに速くなる可能性があります。」 (Attila Áfra)

デノイザーの仕事は、”グラウンドトゥルース” にできるだけ近づけること、つまり高速化です。

 

「ライブラリーの入手方法」

最新のインテル® Open Image Denoise ライブラリーのソースは、その GitHub* リポジトリーで公開されています。ドキュメントにはステップ・バイ・ステップの手順が記載されており、開発者はすぐに使い始めることができるでしょう。

Áfra は、開発者がこの最先端の AI ベースのノイズ除去ソリューションを試すのには十分な理由があると考えています。このソリューションは、オープンソースのコードベースで構築されており、ほぼすべての x86 CPU で動作し、優れた画像品質を実現します。「いくつかのノイズ除去ソリューションは、画像のノイズ除去に数分を要します。我々のソリューションは、ハードウェアによっては数秒で実行できます。」 (Attila Áfra)

その目的は、開発者が想像できる限りの複雑で没入感のある環境を構築することに集中し、それらのデザインを迅速かつ容易に反復することです。これは、開発者にとってもユーザーにとっても同様のメリットがあります。最新バージョンをダウンロードして、あなたのプロジェクトにどのような違いをもたらすことができるか見てみましょう。

 


インテル® Open Image Denoise はインテル® ベース & レンダリング・ツールキットに同梱され、弊社にてサポートサービス付きでご購入いただけます。

有効なサポートサービスをお持ちのお客様は、日本語でのサポート対応、最新バージョンのダウンロードをご利用いただけます。

さらに詳しいインテル® ベース & レンダリング・ツールキットに関する情報は弊社レンダリング・ツールキットのページからご覧いただけます。


記事参照:

Intel® Open Image Denoise Library Saves Time, Boosts Quality