3DCGで一般的なレンダリング方式について

トップ > レンダリング >
様々なレンダリング方式

 
 
 
-
-
-
-
 
 
 
 
 
 
 

レンダリング方式について

Blenderのレンダリングエンジンの解説に入る前に、3DCGの世界で一般的に利用されているレンダリング方式について説明します

具体的には、レンダリング処理の、

  1. 隠面消去
  2. 陰影計算(シェーディング)

の部分を、どのような理屈や計算で処理しているかを紹介します。

なお、解説するレンダリング方式は、

  1. Zソート法
  2. Zバッファ法
  3. スキャンライン方式
  4. レイトレーシング
  5. パストレーシング

の5種類です。

 

各レンダリング方式の説明に使用するサンプル

レンダリング方式の解説には以下のサンプルを使用します。

サンプルとして使用するシーン
サンプルとして使用するシーン

赤色・緑色・青色の3枚の板があり、カメラは板の方向を向いています。 赤色の板が一番遠く、次に近いのが緑色の板で、最も近いものが青色の板です。

大事な点は、緑色の板と青色の板が交差していることです。 緑色の板の中心は青色の板の中心よりも遠いですが、カメラから最も近い頂点を持っているのは緑色の板です。

この仮想世界をレンダリングして得られる画像は以下であるべきです。

サンプルのレンダリング結果
サンプルのレンダリング結果

上図のように位置関係を考慮したレンダリング結果が得られるべきです。

このような仮想世界を例に、それぞれのレンダリング方式がどうのような計算を行い、どのような結果が得られるのかを見ていきましょう。

 

Zソート法

Zソート法は、カメラから遠い位置にある面から順に描画する手法で、面の単位で描画されます。 遠い面から描画することで隠面消去の必要を無くす、という考え方です

では、Zソート法でのレンダリングの流れを見てみましょう。

Zソート法では、最初に全ての面のカメラからの距離が計算され、処理順の並び替えが行われます。 今回のサンプルでは、赤色の板・緑色の板・青色の板の順に並びます。

並び替えが終わったら、描画処理に移ります。 まずは、最も遠い赤色の板の描画処理が開始されます。 描画先であるレンダリングバッファに何が描かれているかは気にせずに、とにかく上塗りします。

  
この記事では、レンダリングエンジンが計算結果である2次元の画像を描き込む領域をレンダリングバッファと表現しています。
1. 赤色の板が描かれる
1. 赤色の板が描かれる

上図のようにレンダリングバッファに赤色の板が描かれます。

続いて、次に遠い面である緑色の板の描画処理が行われます。 レンダリングバッファの同座標に何が描かれているは気にせずに上塗りします。

2. 緑色の板が描かれる
2. 緑色の板が描かれる

上図のようにレンダリングバッファに緑色の板が描き足されます。

最後に、最も近い青色の板の描画処理が行われます。 これまでと同様に、レンダリングバッファの内容は考慮せずに無条件に描き込まれます。

3. 青色の板が描かれる
3. 青色の板が描かれる

上図のようにレンダリングバッファに青色の板が描き加えられます。 ただし、重大な問題が発生しており、正しいレンダリング結果にはなっていません

本来であれば、緑色の板の一部が青色の板と交差しているはずなのですが、無条件に上塗りされたためその部分がなくなってしまっています。

このように、Zソート法では交差している面を正しく扱うことができません。 また、交差していなくても、以下のように遠い面が近い面を隠すような位置関係の場合にも正しく描画することができません。

遠い面が近い面を隠す
遠い面が近い面を隠す
  
一般的に面の中心で距離を比較します。
 
<< 表現できること・できないこと >>

Zソート法は面の単位で処理され、描画対象の面と光源の位置関係だけを考慮して陰影が計算されます。 つまり、他の面との関係は考慮されません。 よって、光の反射や屈折を表現できません。

  
光の反射を計算できないため、鏡や磨き込まれた金属のように周囲の景色が映り込むものは表現できません。
  
レンダリングバッファに描き込む際に、既存の色と描き込もうとする色をブレンドすることで擬似的な透過を表現することはできます。 ただし、光の屈折を計算できないため、半透明の物体の後ろの景色に歪みは発生しません。
 

Zバッファ法

Zバッファ法は、Zソート法と同じく面の単位で処理を行う手法です。 ただし、隠面消去は面の単位ではなくレンダリングバッファに描き込むピクセルの単位で処理されます

つまり、レンダリングバッファに描き込む際に、ピクセルごとに、描き込むか・描き込まないかを判断します。 ピクセルごとに判断しようとすると、計算が増えて高い負荷がかかりそうですが、Zバッファ法では負荷の少ない技法で距離を判断しています。

Zバッファ法では、レンダリングバッファとは別に、『Zバッファ』と呼ばれる領域を持ちます。 Zバッファはレンダリングバッファと同じく描画用の領域ですが、描き込まれるのは面の色ではなく、仮想空間でのカメラからの距離を表す色です

  
遠い=白色、近い=黒色のように表現します。
  
レンダリング開始時に、Zバッファは無限遠を表す色で塗りつぶされます。

レンダリングバッファに色を描き込む際には、描き込みの前に、Zバッファの同じ座標から色を取得し距離に変換します。 その距離と、描き込もうとしているピクセルの仮想空間でのカメラからの距離を比較し、描き込もうとしているピクセルの方が近ければレンダリングバッファに色を描き込み、さらにZバッファの同座標にも距離から求めた色を描き込みます

Zバッファから取得した距離の方が近ければ、レンダリングバッファへの描き込みは行いません。 つまり、隠面消去されるわけです

では、Zバッファ法でのレンダリングの流れを見てみましょう。

まず、レンダリングバッファとZバッファが初期化されます。 レンダリングバッファは仮想世界の背景色で、Zバッファは無限遠を表す色で初期化されます。

  
今回の例では、無限遠は白色で表現されるものとして説明しています。
1. レンダリングバッファとZバッファが初期化される
1. レンダリングバッファとZバッファが初期化される

上図のようにレンダリングバッファとZバッファが初期化されます。 左下の小窓がZバッファの内容を表しています。

続いて、最初の面の描画処理が開始されます。 Zバッファ法では、面の処理の順序は決まっていませんが、ここでは青色の板が最初に処理されるものとして説明を続けます。

  
面の処理の順序は決まっていませんが、通常は近いものから描画することで無駄な描画を防ぎます。
2. 青色の板が描かれる
2. 青色の板が描かれる

上図のようにレンダリングバッファに青色の板が描かれます。 青色の板の各ピクセルが描かれたのは、Zバッファの同座標が白色、つまり無限遠だったためです。

描き込もうとする青色の板の各ピクセルの距離の方が近いため、レンダリングバッファに青色の板が描かれ、同時にZバッファには青色の板のカメラからの距離が色に変換されて描き込まれました。

さらに、緑色の板の描画処理が行われます。

3. 緑色の板が描かれる
3. 緑色の板が描かれる

上図のようにレンダリングバッファに緑色の板が描かれます。 Zソート法とは異なり、交差が正しく表現できています。

正しく交差を表現できたのは、ピクセルの単位で距離を比較できたからです。 Zバッファの画像は、レンダリングバッファの同座標のピクセルの仮想空間でのカメラからの距離を表しています。

つまり、Zバッファの同座標の色を取得するだけで、レンダリングバッファ上にすでに描かれている各ピクセルの仮想空間でのカメラからの距離が判断できるのです

最後に、赤色の板の描画処理が行われます。

4. 赤色の板が描かれる
4. 赤色の板が描かれる

上図のようにレンダリングバッファに赤色の板が描かれます。 青色の板で隠されている部分が正しく隠面消去されていることが確認できます。

 
<< 表現できること・できないこと >>

Zバッファ法もZソート法と同じく面の単位で処理されます。 描画対象の面と光源の位置関係だけを考慮して陰影が計算されるのもZソート法と同じです。 つまり、Zソート法と同じく、他の面との関係は考慮されていないため、光の反射や屈折を表現できません。

  
光の反射を計算できないため、鏡や磨き込まれた金属のように周囲の景色が映り込むものは表現できません。
  
Zソート法と同じ技法で擬似的な透過は表現することができます。 ただし、Zソート法と同じく光の屈折を計算できないため、半透明の物体の後ろの景色に歪みは発生しません。
  
また、擬似的な透過を表現するためには、描画の順序も考慮する必要があります。 不透明な面を最初に描画し、その後に半透明な面を遠いものから描画しなくてはなりません。
 

スキャンライン方式

スキャンライン方式は、すでに紹介したZソート法やZバッファ法とは異なり、スキャンラインの単位で処理を行います。 スキャンラインとは走査線のことで、仮想スクリーン上の横1ラインのことです。

つまり、レンダリングバッファに描き込む横1ラインの単位で処理を行います。 最終的に2次元の1ラインに収まる面を3次元の情報から探すということです。

  
Blenderの標準レンダリングエンジンのBlender Renderが、スキャンライン方式のレンダリングエンジンです。 ただし、後述するレイトレーシングも併用することができます。

スキャンライン方式では、視点となるカメラから処理対象の走査線を突き抜ける平面(走査面)を求めます。 その走査面と交差する面を探し出し、交差する部分の描画処理を行います。

スキャンライン方式の走査面
スキャンライン方式の走査面

レンダリングバッファに描画する際は、走査面と交差する面の位置を比較し、カメラに近いものを描画します。

では、スキャンライン方式でのレンダリングの流れを見てみましょう。

まずは、仮想スクリーンの最上部の走査線が処理の対象となります。 視点となるカメラから、その走査線を突き抜けた平面(走査面)が求められます。

求められた走査面と交差する物体の面があるかどうかが計算され、交差する面があればその部分の描画が行われます。

1. どの面とも交差しない
1. どの面とも交差しない

上図のように交差する面はありませんので、レンダリングバッファには何も描き込まれません。

処理が進み、走査面が赤色の板と交差するようになったとします。 交差する部分のレンダリングバッファへの描画処理が行われます。

2. 赤色の板が描き込まれる
2. 赤色の板が描き込まれる

上図のようにレンダリングバッファに赤色の板が描かれます。 走査面と交差するのは赤色の板だけですので隠面消去は関係ありません。

さらに処理が進み、走査面が青色の板とも交差するようになったとします。 交差する部分のレンダリングバッファへの描画処理が行われます。

3. 青色の板も描き込まれる
3. 青色の板も描き込まれる

上図のようにレンダリングバッファに青色の板も描かれます。 赤色の板と重なっている部分が正しく隠面消去されていることが確認できます。

正しく隠面消去されているのは、走査面と交差する座標の前後関係が比較されたためです。 赤色の板よりも青色の板の方が近いため、青色が描かれました。

 
<< 表現できること・できないこと >>

スキャンライン方式でも光の反射や屈折は表現できません。 処理対象の走査面と交差する面の情報と光源の位置関係だけを考慮して陰影が計算されるためです。

  
ただし、処理対象の走査面と交差する面がどれかを判断できるため光の透過を計算することはできます。
 

レイトレーシング

レイトレーシングは、光の反射・透過・屈折を表現できるレンダリング方式です。 その名の通り、光線(レイ)を追跡(トレース)する技法です。

  
つまり、グローバルイルミネーション(大域照明)を考慮した陰影の計算手法です。
  
Blenderの標準レンダリングエンジンのBlender Renderはスキャンライン方式のレンダリングエンジンですが、レイトレーシングも併用することができます。

ただし、光の反射については鏡面反射しか考慮していません。 拡散反射については考慮されていません。 拡散反射まで考慮すると、計算量が爆発的に増えてしまうためです。

処理の単位は、仮想スクリーン上のピクセルです。 つまり、レンダリングバッファに描き込む1ピクセルの単位で処理を行います。

なお、追跡は光源からではなく視点から逆にたどります。 視点となるカメラから処理対象のピクセルを突き抜ける仮想的な光線を放出し、その行方を追跡します。

視点から放出された光線は永遠に追跡されるわけではなく、

  1. 光を鏡面反射も透過もしない面にぶつかった
  2. 上限の鏡面反射回数に達した
  3. どこにもぶつからずに仮想世界の外に飛び出した

となったら、その光線の追跡は終了します。 上限の鏡面反射回数に達したら追跡をやめるのは、計算の負荷を下げるためです。

なお、色の計算は、『光を鏡面反射も透過もしない面にぶつかった』の時点で行われます。 ぶつかった面と光源の位置関係によって色が計算されます。

また、放出した光線は、半透明の面にぶつかった時点で分岐します。 半透明の面は、一部の光を鏡面反射し、残りを透過します。 よって、光線を分岐させてそれぞれ追跡する必要があるのです。

では、レイトレーシングの詳細な解説に移りますが、ここからの説明には以下の新たなサンプルを使います

ガラスの球体を追加
ガラスの球体を追加

上図のように赤色の板の前に半透明のガラスの球体を追加しています。 それ以外は、今までと同じです。

では、レイトレーシングでのレンダリングの流れを見てみましょう。

まずは、仮想スクリーンの左上のピクセルが処理の対象となります。 視点となるカメラから、そのピクセルを突き抜ける光線を放出し、追跡します。

追跡の途中で半透明の面のぶつかったら、光線を2本に分岐させ、それぞれ追跡します。

追跡している光線が、

  1. 光を鏡面反射も透過もしない面にぶつかった
  2. 上限の鏡面反射回数に達した
  3. どこにもぶつからずに仮想世界の外に飛び出した

となったら、その光線の追跡は終了です。 光を鏡面反射も透過もしない面にぶつかって終了したなら、色が決定され、レンダリングバッファに描き込まれます。

次に、隣のピクセルが同様に処理されます。 そのピクセルの処理が終了したら、さらにその隣のピクセルが処理されます。

以上の手順を仮想スクリーン上の全ピクセルに対して実施します。 仮想スクリーン上の全ピクセルの処理が終了したら、レンダリングは完了です。

では、光線の追跡の例を見てみましょう。 まずは、放出した光線がどこにもぶつからなかった場合です。

1. 放出した光線がどこにもぶつからなかった場合
1. 放出した光線がどこにもぶつからなかった場合

上図のように仮想世界から飛び出してしまっています。 この場合は仮想世界の背景の色がレンダリングバッファに描き込まれます。

続いては、放出した光線が『光を鏡面反射も透過もしない面』に最初にぶつかった場合です。

2. 放出した光線が『光を鏡面反射も透過もしない面』に最初にぶつかった場合
2. 放出した光線が『光を鏡面反射も透過もしない面』に最初にぶつかった場合

上図のように光線は分岐しないまま赤色の板にぶつかります。 ぶつかった面と光源の位置関係によって色が計算されます。 おそらくレンダリングバッファには赤色が描き込まれるでしょう

最後に、放出した光線が半透明の面にぶつかって分岐した場合の例です。

3. 放出した光線が半透明の面にぶつかって分岐した場合
3. 放出した光線が半透明の面にぶつかって分岐した場合

上図のようにガラスの球体にぶつかったため光線が2本に分岐しています。 分岐した2本のうち、鏡面反射した光線は緑色の板にぶつかって追跡が終了し、透過した光線は赤色の板にぶつかって追跡が終了しています。

レンダリングバッファに描き込まれる色は、赤色と緑色が合わさった黄色に近い色でしょう。 鏡面反射率が高ければ緑色に近く、鏡面反射率が低ければ赤色に近い色になるはずです

 
<< 表現できること・できないこと >>

レイトレーシングは放出した光線を追跡する技法であるため、光の鏡面反射や透過・屈折を表現することができます。 鏡や磨き込まれた金属のように周囲の景色が映り込むもの、ガラスのように後ろの背景が透けて見えるもの、水晶球のように後ろの景色が歪んで見えるものも表現することができます。

  
ただし、拡散反射が考慮されていないため、他の面からの拡散反射による間接光は表現できません。 よって、柔らかい影を表現するのは苦手です。
  
グローバルイルミネーション(大域照明)ではあるものの、拡散反射が考慮されていないことがレイトレーシングの弱点です。
 
<< 分散レイトレーシングという手法もある >>

レイトレーシングの手法から発展した『分散レイトレーシング』と呼ばれる技法もあります。 分散レイトレーシングでは、光線が物体にぶつかった時に周囲に複数の光線を発生させます。

つまり、擬似的な拡散反射を表現しているのです。 それにより、レイトレーシングでは表現できない柔らかい影を表現することができます。 ただし、追跡すべき光線が増えるため計算の負荷が高くなります。

 

パストレーシング

最後に紹介するのが『パストレーシング』と呼ばれるレンダリング方法です。 パストレーシングは、レイトレーシングを発展させた技法です

  
つまり、レイトレーシングと同じくグローバルイルミネーション(大域照明)を考慮した陰影の計算手法です。
  
Blenderの新しいレンダリングエンジンのCycles Renderが、パストレーシング方式のレンダリングエンジンです。

レイトレーシングとの違いはいくつかありますが、1つめは拡散反射を考慮することです。 レイトレーシングでは、光を鏡面反射も透過もしない面にぶつかると光線の追跡が終了していました。 一方、パストレーシングでは、

  1. 光源にぶつかったった
  2. 上限の反射回数に達した
  3. どこにもぶつからずに仮想世界の外に飛び出した

となるまで追跡を継続します。 拡散反射する面にぶつかっても追跡は終了しません

レイトレーシングとの違いの2つめは、放出した光線を分岐させないことです。 視点となるカメラから処理対象のピクセルを突き抜ける仮想的な光線を放出し、その行方を追跡するのはレイトレーシングと同じです。 ただしパストレーシングでは、物体にぶつかっても光線を分岐させず、最後まで1本の光線のまま追跡します

分岐させないという仕様で、どうやって拡散反射・透過を追跡するのでしょうか。 光線が面にぶつかったら、その光線の行き先をどう決めているのでしょうか。

実は、確率で決めているのです

  1. 表面がツルツルした面であれば、鏡面反射する確率が高いはず
  2. 表面がザラザラした面であれば、拡散反射する確率が高いはず
  3. 透明度が高い面であれば、透過する確率が高いはず

というように、確率で光線の進む先を決めているのです。

確率と聞いて、別の疑問が湧いくるのではないでしょうか。 『そんなやり方で、写実的な陰影が計算できるのか』と。

パストレーシングでは、放出した光線は最後まで分岐せず1本のままです。 ただし、処理対象の1ピクセルに対して、光線の放出と追跡の処理を何度も繰り返すのです。 何度も同じ方向へ光線を放出し、結果を蓄積していくのです。

光線の進む方向には確率が絡んでいるため、同じ結果の蓄積にはなりません。 ツルツルした面に向かって放出される光線は鏡面反射の経路をたどることが多くなるでしょうし、透明度の高い面であれば透過する経路をたどことが多くなるでしょう。 ただし、低確率でそれ以外の方向にも光は進みます。

予定された回数の光線の放出と追跡が完了したら、蓄積された結果から色を計算します

分散レイトレーシングのように光線が面にぶつかった時点で分岐させてしまうと、追跡対象の光線が爆発的に増えてしまいます。 しかし、光線を分岐させず1本のまま追跡し、それを複数回繰り返すというのであれば、指数関数的な増加という事態は避けることができます。

では、パストレーシングの詳細な解説に移りますが、説明には新たなサンプルを使います

光源を追加
光源を追加

上図のようにカメラの上に光源を追加しています。 それ以外は、今までと同じです。

では、パストレーシングでのレンダリングの流れを見てみましょう。

処理の大まかな流れはレイトレーシングと同じで、仮想スクリーンのピクセルごとに処理が行われます。 視点となるカメラから、そのピクセルを突き抜ける光線が放出され、追跡されます。

すでに説明したように、レイトレーシングとの違いは同じピクセルに対して繰り返し光線の放出と追跡が行われることです。

では、光線の追跡の例を見てみましょう。 全部で5回、同じ方向への光線の放出と追跡を繰り返します。 なお、この例ではガラスの球体に向かって光線を放出しています。

まずは、1回目の光線の放出と追跡です。

1. 光源にぶつかって追跡終了
1. 光源にぶつかって追跡終了

上図のようにガラスの球体を透過(屈折)し、赤色の板で拡散反射し、光源にぶつかりました。 光源に到達したら、それまでにぶつかった面ごとに計算された色の情報を蓄積します。 この場合は、赤色に近い色が蓄積されることでしょう。

続いて、同じ方向への2回目の光線の放出と追跡です。

2. どこにもぶつからず追跡終了
2. どこにもぶつからず追跡終了

上図のようにガラスの球体で鏡面反射し、緑色の板で拡散反射して仮想世界の外に飛び出しました。 この場合は色の計算は行われません。

続いても、同じ方向への3回目の光線の放出と追跡です。

3. 光源にぶつかって追跡終了
3. 光源にぶつかって追跡終了

上図のようにガラスの球体で鏡面反射して緑色の板で拡散反射し、光源にぶつかりました。 光源に到達したので、それまでにぶつかった面をもとに計算された色の情報が蓄積されます。 おそらく緑色に近い色でしょう。

さらに、同じ方向への4回目の光線の放出と追跡です。

4. 光源にぶつかって追跡終了
4. 光源にぶつかって追跡終了

上図のようにガラスの球体を透過(屈折)し、赤色の板で拡散反射し、光源にぶつかりました。 光源に到達したため、色の情報が蓄積されます。 赤色に近い色が蓄積されるはずです。

続いても、同じ方向への5回目、つまり最後の光線の放出と追跡です。

5. どこにもぶつからず追跡終了
5. どこにもぶつからず追跡終了

上図のようにガラスの球体で鏡面反射し、緑色の板で拡散反射し、さらに青色の板でも拡散反射して仮想世界の外に飛び出しました。 この場合は色の計算は行われません。

以上で予定していた5回の光線の放出と追跡が完了しました。 蓄積された色は、赤色・赤色・緑色ですので、オレンジ色に近い色がレンダリングバッファに描き込まれることでしょう。

 
<< 表現できること・できないこと >>

パストレーシングは放出した光線を追跡する技法であるため、光の鏡面反射や透過・屈折を表現することができます。 鏡や磨き込まれた金属のように周囲の景色が映り込むもの、ガラスのように後ろの背景が透けて見えるもの、水晶球のように後ろの景色が歪んで見えるものも表現することができます。

また、拡散反射も考慮されているため、他の面からの拡散反射による間接光も表現することができます。

  
レイトレーシングでは表現できない、柔らかい影も問題なく表現することができます。
ページの先頭へ
 
 

まとめ

一般的な3DCGのレンダリング方式には、

  1. Zソート法
  2. Zバッファ法
  3. スキャンライン方式
  4. レイトレーシング
  5. パストレーシング

の5種類があり、特徴は以下の通りです。

レンダリング方式 特徴 拡散
反射
鏡面
反射
透過 屈折
Zソート法 ・隠面消去は面単位
・交差している面は正しく描画できない
× × ×
Zバッファ法 ・隠面消去はピクセル単位
・交差している面でも正しく描画できる
× × ×
スキャンライン方式 ・仮想スクリーン上の走査線ごとに処理
・走査線の延長上の面を探し出して描画
・隠面消去はピクセル単位
× × ×
レイトレーシング ・視点から逆方向に光線を追跡
・拡散反射が考慮されていない
・鏡面反射で光線が分岐する
・透過(屈折)で光線が分岐する
×
パストレーシング ・視点から逆方向に光線を追跡
・拡散反射も考慮されている
・光線は分岐しない
・同じ方向に何度も光線を飛ばす
ページの先頭へ
 
Google+ GIMP Community
 
 
-
-
-
-