GPUを用いた高速レンダリング

GPUを用いた高速レンダリング

土橋 宜典 先生
北海道大学 大学院情報科学研究院 教授、​プロメテックCGリサーチ 副所長

1. はじめに

CGはリアルな画像を生成することを軸として発展してきました。
レイトレーシング法やラジオシティ法は代表的な二大手法と言えるでしょう。

​しかし、画像のリアリズムが向上するにつれて計算時間は指数関数的に増加していきました。
​そこで脚光を浴びたのがGPUです。

当初はGPUとは呼ばず、グラフィックスハードウェアと呼ばれていました。名前のとおり、3次元グラフィックス処理に特化した並列演算チップでした。
GPUと呼ばれるようになったのはずっと後のことですが、ここではGPUという呼び方で統一します。

CG分野においてGPUが注目を集め始めたのは2000年ごろです。ちょうどNVIDIA社がコンシューマ向けの安価なビデオカードの販売を始めた頃でした。
GPUはあっという間に広がり、さまざまな研究が行わるようになりました。

その理由は、CG画像の生成では、画素ごとに独立した処理が行われるため、並列計算との親和性が高かったからでしょう。
この当時のGPUは、現在のようにプログラマブルではなかったため、ポリゴン表示やテクスチャマッピングなどの描画機能を利用して目的の演算を行うという少しトリッキーな技術が開発されていました。

現在では、プログラマブルシェーダが普及し、また、CUDAに代表されるGPUを用いた汎用的な並列演算のための環境が整備され、それ以前のようなトリッキーな手法は少なくなりました。

本稿では、我々の研究グループにて開発したGPUを活用したレンダリング手法をいくつか紹介します。
我々の研究グループでは、光の散乱現象に関係するレンダリング手法を多く開発してきましたので、それらの研究を中心に概要を解説します。
より詳しい内容を知りたい方は、ぜひCGリサーチの研究紹介のページを訪れてみてください。→ 研究紹介のページ

2. 大気の表現

空間中にホコリなどの微粒子が浮遊しているとき、光源からの光は微粒子によって散乱・減衰を受けます。
​視点に届く光は物体からの反射光に加えて視線上に存在する微粒子の散乱光をすべて足し合わせたものになります。

数学的には視線上に散乱光を積分した値を求める必要があり、一般に計算時間がかかります。私たちの研究グループでは、GPUを利用してこの計算をリアルタイムに行う方法を世界に先駆けて開発しました。
ポリゴンの描画処理をうまく組み合わせて積分計算を行います。

図1(a): GPUを利用した散乱光の計算原理
図1(a): GPUを利用した散乱光の計算原理

​図1に示すように、スクリーンと平行な仮想的な平面を多数発生させ、平面上の各点の輝度を散乱光強度に設定します。

そして、これらの仮想平面を描画し、その輝度をフレームバッファに累積することで積分処理を描画処理に置き換えます。

これら仮想平面の描画におけるピクセルごとの処理、すなわち、散乱光強度の計算と累積計算はGPUにより並列に行われるため、非常に高速に散乱光を描画できます。

散乱光強度の計算部分にはテクスチャマッピングの機能を利用することで、さらなる高速化が実現できます。

​図1(b)はその計算例です。教会のステンドグラスを通過した美しいボリューメトリックな光が表現されています。

図1(b): ステンドグラスを通過した光の散乱効果
図1(b): ステンドグラスを通過した光の散乱効果

この考え方を発展させると光の散乱に関する様々な効果を表現できます。​図2(a)は、大気による光の散乱の計算に応用した例です。この例では、雲の表示もGPUを使って表示しています。
​そして、雲の隙間から漏れる光が大気中の微粒子により散乱することで生じる光線を表示しています。

また、図2(b)は、宇宙からみた地球の大気を表現した画像です。
この場合は、地球を薄く覆う複数の仮想的な球面を描画することで大気による散乱光の積分計算を行っています。

図2(c)では、視点を地球の付近まで移動し、宇宙から見た雲を合わせて表示した例です。
​この例では、雲のデータが膨大になるため、GPUメモリ・メインメモリ・ハードディスクの間でデータをやり取りしながら表示を行っています。

図2(a): 大気による光の散乱効果
図2(a): 大気による光の散乱効果
図2(b): 宇宙から見た地球の大気
図2(b): 宇宙から見た地球の大気
図2(c): 宇宙から見た雲
図2(c): 宇宙から見た雲

3. 水による光の散乱

水の表現においても光の散乱は重要な要素です。水分子によって光の散乱が生じます。
水分子は青をよく散乱しますので、水の色は青く見えます。水の表現において、水面は厄介な存在です。

水面での反射・屈折によって光は予期せぬ方向へその向きを変えてしまいます。
そのため、水中のある一点において、どこから光が到達しているかを求めることが非常に難しいのです。

しかし、一方で、この水面による反射・屈折はコースティクスという非常に美しい特徴的な光のパターンを生み出します。
​これは光が水面で反射または屈折することで集光が生じ、照射面の明るさが変化することにより生じます。

コースティクスを表現するためには、光源から光をトレースし、到達面での光の分布を求める必要がありますが、計算コストが高いものの一つです。
そこで、GPUを用いた並列計算によりリアルタイムで表現する方法を開発しました。

図3に示すように、水面を三角形メッシュで表現し、各三角形での頂点において光の屈折方向を計算し、三角柱のような形状を算出します。

そして、この三角柱と物体とが交差する部分を描画し、その輝度を累積することでコースティクスが表示できます。

図3: コースティクスのレンダリング方法
図3: コースティクスのレンダリング方法

この方法は、照射面におけるコースティクスパターンだけでなく、水分子による光の散乱効果も表現できます。三角柱の可視面の輝度を散乱光強度にして描画し、その輝度を累積すればよいのです。

三角柱の描画やピクセル単位での輝度の計算と累積処理は、GPUによって並列化されますので、高速にコースティクスをレンダリングすることができます。

図4(a): イルカとコースティクスパターン
図4(a): イルカとコースティクスパターン
図4(b): 反射光によるコースティクス
図4(b): 反射光によるコースティクス

図4は、この方法によってコースティクスを表現した画像です。
この方法のよいところは、ピクセル単位で輝度計算を行うことができますので、複雑な曲面形状も扱える点です。

図4(a)では、イルカの表面でのコースティクスパターンが表示されています。同時に、空間中の集光効果も表現されているのがわかります。このような映像をリアルタイムかつ正確に表現することはいま現在でも困難で、この方法を超えるものはいまだ現れていません。

​図4(b)は、この方法をさらに拡張し、反射光によるコースティクスを表現した例です。複雑な凹凸のあるビーナス像の表面のコースティクスをリアルタイムに計算しています。

4. パストレーシング

GPUは描画専用チップとして開発されたものでしたので、当初、その恩恵を被るにはラスタライゼーション(ポリゴン描画処理)を介する必要がありました。
これまでに紹介した方法は、輝度計算に伴う積分処理を仮想的な平面や三角柱の輝度を重ね塗りすることで実現していました。
しかし、プログラマブルシェーダや汎用的なCUDAのようなシステムの登場によって、そのような制約は取り払われ、GPUによって並列化できることは各段に広がっていきました。

ラスタライゼーションによらない手法の代表例はレイトレーシング法ですが、GPUにより高速化することが可能となりました。
実際、NVIDIA社はOptiXというGPUを用いたレイトレーシングのためのライブラリを公開しています。

​GPUによってレイトレーシングを高速化することができると、パストレーシングと呼ばれる光の相互反射を確率的に計算する手法も高速化することができ、実写並みのリアルな映像を高速に生成できるようになります。

​最近では、レイトレーシングでの使用を前提としたGPUも開発されています。
パストレーシングは非常に強力な手法で、あらゆる光学現象を考慮した輝度計算が可能です。また、重要な特性として、計算時間さえかければ必ず物理的に正しい画像へと収束することが数学的に保証されています。

​そのため、映画製作等でも多用されている代表的な手法の一つですが、開発された当初は計算時間がかかりすぎることが問題となっていました。
GPUの登場によりその問題が緩和され、パストレーシングの普及と発展に大きく貢献したといっていいでしょう。
図5は、GPUによるパストレーサを用いてCG画像を生成した例ですが、このような非常にリアルな画像が数秒で生成できます。

しかし、パストレーサだけでリアルタイムにこのような画像を生成するまでにはいまのところ至っていません。
計算時間が不足していると、画像にノイズが表れてしまいます。

​そこで、現在、機械学習と組み合わせてリアルタイムでフォトリアルな画像の生成を行う研究は多くの研究者が取り組んでおり、ほぼ実用化の域にまで達しつつあります。

図5: パストレーシングによる画像生成例
図5: パストレーシングによる画像生成例

5. 光の多重散乱

パストレーシングをGPUで高速化することができれば、我々の得意とする光の散乱現象に関するレンダリングにも応用できます。

本稿の始めに紹介した大気や雲の表示では、光の一次散乱のみしか考慮していませんでした。つまり、太陽などの光源からの光が大気や雲を構成する微粒子に一回だけ散乱した後に視点に届くものしか考慮できません。

薄い霧や大気のような場合にはこれで十分ですが、雲や煙のような濃い物体には不十分です。これらの物体の場合は、何回も繰り返し散乱した光を考慮しなければリアルな映像を作り出すことはできません。

この計算にはパストレーシングが利用されますが、物体間の相互反射に比べてはるかに高い計算コストを必要とするため、GPUの活用が必要不可欠です。しかし、それでもノイズのない高画質な画像を生成するためには数分から数十分、大規模なシーンでは、数時間から数十時間もの時間がかかってしまいます。

この問題を解決するため、アダプティブに散乱光をサンプルする手法を開発しています。
正確な計算を行うためには散乱光を評価する点(サンプル点)を非常に細かく設定しなければなりません。しかし、雲や煙では密度分布に粗密があるため、密度が低い領域ではそれほど細かくサンプル点を発生する必要はなく、無駄が生じてしまいます。

​そこで、計算領域をあらかじめ密度の粗密に応じてアダプティブに部分空間に分割しておき、それぞれの部分空間ごとに最適な数のサンプル点を発生させる方法を開発しました。パストレーシングの重要な特長である、必ず正しい画像に収束する、という性質は守るように手法を設計しています。

​我々の実験によると、シングルコアCPUでの実装では、それ以前の手法と比較して数百倍の高速化を達成しました。
​そして、GPUで実装することでさらに数十倍の高速化が実現できることが確認できました。

​トータルとして考えると、GPUを活用することで、なんと数千倍から数万倍の高速化が実現されたことになります。

この方法によって計算した画像の例を図6に示します。
​図6(a)の左半分は提案法で計算したもの、右半分は従来法で同じ時間をかけて計算したものです。

従来法の場合は、計算時間が足りないためにノイズの影響がひどく、使い物になりません。
​提案法ではそのようなノイズは全く見られません。​

図6(a): パストレーシングによる多重散乱の高速計算
図6(a): パストレーシングによる多重散乱の高速計算

図6(b)は同じシーンの夕方の画像です。

ところで、これらの画像では、雲だけでなく、空や大気、地面による光の相互反射など、ありとあらゆる光の経路をすべてトレースして輝度計算を行っています。

​光源は太陽のみです。つまり、屋外における光学現象をまるごと計算した驚異的な画像なのです。

図6(b): 夕方の例
図6(b): 夕方の例

6. 逆問題

もう一つ、これまで紹介したものとは少し違った観点からの研究を紹介します。

逆問題です。
これまでの研究では、3Dシーンを設定して、光のシミュレーションを行って画像を生成するというアプローチでした。
GPUをうまく活用し、どうやって高速に画像を生成するかというところに焦点がおかれています。

しかし、画像が速く計算されればそれでよいかというとそうでもありません。
3Dシーン、特に、物体の材質に関するパラメータを適切に設定しなければリアルな画像を作り出すことはできません。
また、映像産業においては、リアルであればよいということは少なく、目的の映像効果を実現できなければなりません。画像が速く計算できれば、それらのパラメータ調整の効率も上がりますが、試行錯誤は避けて通れません。これは想像以上に膨大な手間がかかり、大問題となっています。

この問題は逆問題を解くことによって解決されます。
作成したい目標画像に関する情報を与えてパラメータを逆算すればよいのです。雲のレンダリングについて、このような逆問題を解く方法を開発しました。雲の輝度計算は、前述したように多重散乱を考慮しなければならず、時間がかかります。

比較的小規模の雲の画像で、前述した高速化手法を用いた場合でも数秒から数十秒ほどかかります。それに対して、雲の輝度計算を行うために設定しなければならないパラメータは20個ほどあります。適切な値を設定するには、それらのパラメータの物理的な意味を熟知している必要がありますが、それでも20個ものパラメータを手動で調整して目的の効果や色味を表現することは至難の業です。

そこで、遺伝的アルゴリズムという最適化手法を用いて自動的にパラメータを決定する方法を開発しました。
目標画像として、実写の雲の画像を用意し、その色味を再現するようパラメータを決定します。
​具体的には、実写画像のカラーヒストグラムとCG画像のカラーヒストグラムが一致するようにパラメータを探索します。

​遺伝的アルゴリズムはランダム探索法の一種で、候補となるパラメータセットを複数生成して目的関数が小さくなるようにパラメータ値を逐次的に改善する方法です。

微分の計算が不要であるなど、汎用的で強力な手法ですが、複数のパラメータセットに対する画像と目的関数計算を繰り返し行わなければならず、計算コストが高いのが難点です。実際、我々の実験では、解を得るまでに1,000枚ほどの画像を生成しなければならず、1枚当たり30秒程度の画像生成時間が必要でしたので、そのまま実行すると8時間もの時間がかかりました。

​そこで、GPUを活用して高速化する方法を考案しました。

​​輝度計算のための数式を精査し、事前に計算した複数の画像の線形和で画像が合成できることを見出しました。
​画像の線形和はGPUの得意とする処理ですので、著しい高速化が達成できます。さらに、カラーヒストグラムの計算にもGPUを用いて高速化を行いました。
​その結果、6,000倍の高速化が達成でき、8時間の計算を5秒にまで短縮することに成功しました。図7は、この方法の計算例を示しています。
6枚の画像があり、左上に小さく示されているのが目標として与えた実写画像です。
​​
CG画像の雲はどれも同じ形で光源の方向のみが異なっています。適切なパラメータが選択され、実写の雲の色味や雰囲気が再現されているのがわかります。CGの雲は3次元ですから、視点を変更して観察することも可能です。

図7: 雲のレンダリングパラメータの逆算
図7: 雲のレンダリングパラメータの逆算

図8は、この方法のちょっと面白い使い方を示しています。
CG技術を使って穴の開いたドクロっぽい雲を生成し、その雲の輝度計算パラメータを左上に示す実写画像を使って調整します。
​そして、実写画像の雲を画像編集ソフトで除去し、そこにCGで作成したドクロ雲をはめ込みます。

実写を使ってパラメータが調整されているので、自然な合成が実現できます。あたかも実世界の中にドクロ状の雲が発生していくかのような映像を作り出すことができます。

図8: ドクロ雲の成長
図8: ドクロ雲の成長

7. おわりに

GPUを使った高速レンダリングに関する我々の研究事例を紹介しました。

GPUの登場によって、高速にCG画像を生成することが可能となりました。
ビデオゲームなどへの活用が広がり、身近な技術の一つになったと言えるでしょう。
逆問題への応用で示したように、GPUによる高速化はこれまで解くことができなかった問題を解くことを可能としました。

GPUが登場した当時は、GPUを使うこと自体が研究のオリジナリティとして評価されることもありましたが、現在では、GPUを使うことは当たり前になっています。GPUは現在も発展しています。

​GPUをどう活用するか、そして、それによってどんな新しい映像表現を実現するかを考え続けたいと思います。
​我々研究者にとっては楽しみの一つです。

著者紹介

土橋 宜典 先生

土橋 宜典 先生

北海道大学 大学院情報科学研究院 教授
プロメテックCGリサーチ 副所長​

1992年 広島大学工学部卒業.1994年,同大大学院工学研究科博士課程前期修了.
1997年 同大博士課程後期修了.同年,広島市立大学情報科学部助手.
2000年 北海道大学大学院工学研究科 助教授.
2004年 同大大学院情報科学研究科 助教授.
2008年 同大大学院情報科学研究科 准教授.
2020年 同大大学院情報科学研究院 教授.工学博士.
主としてコンピュータグラフィックスに関する研究に従事.
Eurographics Best Paper Award,芸術科学会国際CG大賞特別賞,文部科学大臣表彰科学技術賞他.