トップ > レンダリング >
レンダリングの基礎

  

物理的な現象を完全に再現することはできない

最近の3DCGは、驚くほどの速さで進化しています。 動画や静止画のような時間をかけてレンダリングされたものの中には、本物と見分けがつかないような写実的な画像も見受けられます。

少し前までは、人間や動物・植物などの命あるものはまだまだ違和感を感じていましたが、最近では人間でさえも一見すると本物にしか見えない映像もあります

以下は、Chris Jones氏によって2014年に公開された作品です。

Ed - Chris Jones氏 -

これほど技術が進歩した3DCGの世界ですが、物理現象を完全に再現することはできていません。 なぜなら、光の反射・透過・屈折・吸収・回折・干渉などを正しく計算しようとすると膨大な計算量になるためです。

光が物体に当たると、光は同じ角度で反射するだけではなく、他の方向にも反射して広がります。 つまり、拡散するのです。 表面がなめらかな物体なら拡散は少なく、ザラザラした物体であれば多くが拡散します。 また、ガラスのように光を透過する物質であれば、光の透過や屈折も起こります。

光源から出た光の動きを物理的に追跡しようとすると、物体にぶつかった時点で、拡散・透過・屈折により追跡すべき対象が増えます。

仮に、光源から100万方向に光が広がっていると仮定して計算するとします。 その100万本の光線のそれぞれが、物体の表面にぶつかった時点で拡散しますが、ここでは1万倍に拡散するとしましょう。 100万本の光線が1度だけ物体の表面にぶつかっただけで、直後には追跡すべき光線は100億本になります

その後にさらに物体にぶつかると、さらに1万倍に増えるのです。 とても計算していられません。

擬似的な計算でいかに美しく見せるか

3DCGの歴史は、『物理的には正しくない計算で、どれだけリアルに見せるか』を追求してきた歴史かもしれません。

ではここで、『物理的に正しくない計算』というのをBlender上で見てみましょう。 画面上部のプルダウンメニューの"File" -> "New"を実行して新規ファイルを開きます。

続けて、Propertiesウィンドウのマテリアルパネル切替ボタン(マテリアルパネル切替ボタン)を押します。

1. 拡散反射色と鏡面反射色
1. 拡散反射色と鏡面反射色

上図のようにマテリアル関連のパネル群が表示されます。 注目すべきは、DiffuseパネルとSpecularパネルにある『拡散反射色』と『鏡面反射色』です。

光が物体にぶつかると、拡散して広範囲に反射します。 人間の目にある細胞がその反射した光を捉えらて色として認識します。 その色を『拡散反射色』で設定します。

拡散反射
拡散反射

つまり、拡散反射色は、その物体の基本色のようなものです。 なお、この項目が存在することには、筆者は違和感は感じません

問題は鏡面反射色です。 光が物体にぶつかると、入射角と同じ角度で反射します。 その反射した光の先に視点があれば、それを色として認識します。 つまり、ハイライトです。 そのハイライトの色を『鏡面反射色』で設定します。

鏡面反射
鏡面反射

筆者は、初めて3DCGソフトウェアに触れた時に、鏡面反射色という項目があることに違和感を感じました。 なぜなら、反射によるハイライトの色は、光源の強さと色、そして物体の表面の色によって計算されるのだと思っていたからです。

表面が赤色の物体に光源からの白色の光があたったという情報をもとに、3DCGソフトウェアが自動的に、やや赤味がかった白色のハイライトという色を導き出してくれてもいいのではないかと思ったのです。

しかし、現実には『鏡面反射色』という設定項目が用意されています。 なんと、ハイライトの色を自分で指定しなくてはならないのです。

なぜかといえば、鏡面反射色を使うことで、軽い負荷でそれなりの結果を得られるからです。 物理的な再現はできないので、擬似的な計算を行うための設定項目を用意して、それなりの画像を作りだそうということです。

では、現在開いている新規ファイルを、何も変更せずにレンダリングしてみましょう。 キーボードのF12キーを押してください。

2. レンダリング結果(標準設定)
2. レンダリング結果(標準設定)

上図のようにレンダリング結果が表示されます。 見慣れた画像ですが、写実的では決してありません

立方体の左手前の面が暗すぎます。 光源が右側にあるため、左の面には光は届かないという計算結果によるものですが、現実の世界ではここまで暗くならないでしょう。

もう少しだけ、この新規ファイルで遊んでみましょう。 Propertiesウィンドウのワールドパネル切替ボタン(ワールドパネル切替ボタン)を押します。

3. Ambient Occlusionをオンにする
3. Ambient Occlusionをオンにする

上図のようにワールドパネルが表示されますので、Ambient Occlusionパネルの同名のチェックボックス(Ambient Occlusionチェックボックス)をオンにします。

では、この状態でレンダリングしてみましょう。 キーボードのF12キーを押します。

4. レンダリング結果(アンビエントオクルージョン使用)
4. レンダリング結果(アンビエントオクルージョン使用)

上図のように少しだけ写実的になりました。 これは、Ambient Occlusionチェックボックス(Ambient Occlusionチェックボックス)をオンにしたことで、アンビエントオクルージョンが有効になったためです。

アンビエントオクルージョンとは、日本語では環境遮蔽と訳されます。 これは、次の記事で説明するグローバルイルミネーション(大域照明)を考慮した陰影の計算手法です。

立方体では効果がわかりづらいので、スザンヌのレンダリング結果を見てみましょう。

5. スザンヌのレンダリング例
5. スザンヌのレンダリング例

上図のように差は一目瞭然です。 右下の小窓は標準設定でのレンダリング結果です。 このように、アンビエントオクルージョンを使うことで写実的な陰影が表現できました

では、アンビエントオクルージョンは物理的に正しい計算方法で陰影を計算しているのでしょうか。

残念ながら違います。 アンビエントオクルージョンもまた、物理的には正しくない計算で成り立っています。 そもそも、アンビエントオクルージョンは、光源の設定値すら参照していません。

Blenderの新規ファイルにはポイントライトが存在していますが、そのポイントライトの設定を見ていないのです。

アンビエントオクルージョンは、単純に、

  1. 対象の面の表側の半球の範囲に他の面がどのくらいあるかを調べる
  2. 他の面が多くあれば遮蔽されているはずだから暗くする

という計算を行っているだけです。 『開けた場所は明るいはず、隅や凹んだ場所・他の面で囲まれた場所は暗いはず』というだけの話です。

  
アンビエントオクルージョンの計算結果だけで陰影が計算されているわけではありません。 光源から届く光の明るさに、アンビエントオクルージョンで計算された明るさが加味され、それを元に陰影計算が行われます。
  
つまり、アンビエントオクルージョンの計算部分には光源は影響しなくても、最終的な陰影計算の結果には光源の設定が反映されます。

ノンフォトリアリスティックレンダリングという需要もある

3DCGに求められるのは写実的なレンダリング(フォトリアリスティックレンダリング)だけではありません。 イラストの素材やアニメーションのための『ノンフォトリアリスティックレンダリング』と呼ばれるレンダリングにも需要があります

例えば、小学生向けに『パッションフルーツで緑のカーテンを作ろう』というパンフレットを作ることになり、そのイラストをBlenderで制作するとします。

イラスト素材をBlenderの標準設定でレンダリングしてしまうと以下のようになります。

1. 標準設定でのレンダリング
1. 標準設定でのレンダリング

上図のようにイラストにはふさわしくない中途半端な画像になりました。

続いてイラスト風にレンダリングしてみましょう。

2. イラスト風にレンダリング
2. イラスト風にレンダリング

上図のように明るい部分と暗い部分の差を少なくすることでイラスト風になりました。

さらに、セルアニメーション風にレンダリングしてみます。

3. セルアニメーション風にレンダリング
3. セルアニメーション風にレンダリング

上図のように陰影をくっきりさせ、輪郭線を足すことでセルアニメーション風になりました。

このようなイラスト風やセルアニメーション風のレンダリングにも需要があります。 写実的にレンダリングする技術も、イラスト風やセルアニメーション風にレンダリングする技術も身に着けたいものです。

物理的に正しい計算を行うのが主流

現在のレンダリングの主流は、『物理ベースレンダリング』と呼ばれる物理的に正しい計算を行うレンダリング方法です。 この方法では、光の反射、透過、屈折、吸収などが物理的に正しく計算されます。

これは、先ほど説明した『物理的な現象を完全に再現することはできない』という内容と矛盾しているように感じますが、矛盾しているわけではありません。 全ての物理現象は再現できないが、一部だけを再現し、その部分の計算式は物理的に正いものを使うという手法なのです。

つまり、物理的に正しくない『擬似的な計算』から、全ては再現できないが物理的に正しい『簡略化された計算』へと変わっているのです。

Blenderでの物理ベースレンダリング

Blender 2.61から、Cycles Renderという名称の新しい物理ベースのレンダリングエンジンが搭載されました。 新しいレンダリングエンジンであるCycles Renderを使用することでBlenderでも物理ベースのレンダリングが行えるようになったのです。

  
それまで使われていたレンダリングエンジンのBlender Renderも残されており、標準ではこちらが使用されます。
  
レンダリングエンジンについては後ほど、レンダリング > レンダリングエンジンについてで詳しく紹介します。
  

レンダリングの各処理

レンダリングとは、3次元の仮想世界にある物体を2次元の画像として投影する処理です。 ここでは、レンダリングを構成する各処理について簡単に説明します

座標変換

3次元の仮想世界にある物体の各座標が、仮想スクリーン上のどの位置に対応するかを計算する処理です。

座標変換
座標変換

つまり、最終的に完成する画像上のXY座標へ変換する処理です。

隠面消去

最終的に見えなくなる部分を描画対象から除外する処理です。 つまり、他の面によって隠れてしまう部分の消去です。

隠面消去
隠面消去

隠面かどうかの判断には色々な手法があります。

  
隠面消去の手法については後ほど、レンダリング > 様々なレンダリング方式で詳しく紹介します。

陰影計算(シェーディング)

光源や視点との位置関係および面の質感、他の面との相互作用を考慮して陰影を付けます。 写実的な結果が得られるかどうかを左右する重要な項目です。

陰影計算(シェーディング)
陰影計算(シェーディング)

シェーディングの計算を行う機能をシェーダと呼びます。

Blenderの標準レンダリングエンジンであるBlender Renderには12種類のシェーダが、新しいレンダリングエンジンであるCycles Renderには19種類のシェーダが用意されています。

陰影の表現はシェーダによって決まります。 目的に応じて適切なシェーダを選択することが重要です

  
影を落とす付影処理(シャドウイング)とは区別されます。
  
Blender RenderとCycles Renderが持っている各シェーダについては後ほど、レンダリング > 各シェーダの紹介で詳しく紹介します。

表面処理(マッピング)

表面の模様や凹凸を表現する処理です。

表面処理(マッピング)
表面処理(マッピング)

表面の模様を表現するためのテクスチャマッピング、擬似的に凹凸を表現するためのバンプマッピング、正確に凹凸を表現するためのディスプレイスメントマッピング、周囲からの映り込みを表現するための環境マッピングなどがあります。

  

まとめ

現在の3DCGの技術では、全ての物理的現象を再現することはできません。 擬似的な計算や簡易的な計算で本物らしく見せています。

なお、ノンフォトリアリスティックレンダリングと呼ばれる、イラストやセルアニメーション風の非写実的なレンダリングにも需要があります。

近年では、物理的に正しい計算方法を用いた物理ベースレンダリング(PBR : Physically Based Rendering)が主流です。

レンダリング処理は、座標変換、隠面消去、陰影計算(シェーディング)、表面処理(マッピング)で構成されます。 陰影計算(シェーディング)の機能をシェーダと呼び、レンダリングエンジンごとに様々な種類が用意されています。

メニュー