最近の3DCGは、驚くほどの速さで進化しています。 動画や静止画のような時間をかけてレンダリングされたものの中には、本物と見分けがつかないような写実的な画像も見受けられます。
少し前までは、人間や動物・植物などの命あるものはまだまだ違和感を感じていましたが、最近では人間でさえも一見すると本物にしか見えない映像もあります。
以下は、Chris Jones氏によって2014年に公開された作品です。
これほど技術が進歩した3DCGの世界ですが、物理現象を完全に再現することはできていません。 なぜなら、光の反射・透過・屈折・吸収・回折・干渉などを正しく計算しようとすると膨大な計算量になるためです。
光が物体に当たると、光は同じ角度で反射するだけではなく、他の方向にも反射して広がります。 つまり、拡散するのです。 表面がなめらかな物体なら拡散は少なく、ザラザラした物体であれば多くが拡散します。 また、ガラスのように光を透過する物質であれば、光の透過や屈折も起こります。
光源から出た光の動きを物理的に追跡しようとすると、物体にぶつかった時点で、拡散・透過・屈折により追跡すべき対象が増えます。
仮に、光源から100万方向に光が広がっていると仮定して計算するとします。 その100万本の光線のそれぞれが、物体の表面にぶつかった時点で拡散しますが、ここでは1万倍に拡散するとしましょう。 100万本の光線が1度だけ物体の表面にぶつかっただけで、直後には追跡すべき光線は100億本になります。
その後にさらに物体にぶつかると、さらに1万倍に増えるのです。 とても計算していられません。
3DCGの歴史は、『物理的には正しくない計算で、どれだけリアルに見せるか』を追求してきた歴史かもしれません。
ではここで、『物理的に正しくない計算』というのをBlender上で見てみましょう。 画面上部のプルダウンメニューの"File" -> "New"を実行して新規ファイルを開きます。
続けて、Propertiesウィンドウのマテリアルパネル切替ボタン()を押します。
上図のようにマテリアル関連のパネル群が表示されます。 注目すべきは、DiffuseパネルとSpecularパネルにある『拡散反射色』と『鏡面反射色』です。
光が物体にぶつかると、拡散して広範囲に反射します。 人間の目にある細胞がその反射した光を捉えらて色として認識します。 その色を『拡散反射色』で設定します。
つまり、拡散反射色は、その物体の基本色のようなものです。 なお、この項目が存在することには、筆者は違和感は感じません。
問題は鏡面反射色です。 光が物体にぶつかると、入射角と同じ角度で反射します。 その反射した光の先に視点があれば、それを色として認識します。 つまり、ハイライトです。 そのハイライトの色を『鏡面反射色』で設定します。
筆者は、初めて3DCGソフトウェアに触れた時に、鏡面反射色という項目があることに違和感を感じました。 なぜなら、反射によるハイライトの色は、光源の強さと色、そして物体の表面の色によって計算されるのだと思っていたからです。
表面が赤色の物体に光源からの白色の光があたったという情報をもとに、3DCGソフトウェアが自動的に、やや赤味がかった白色のハイライトという色を導き出してくれてもいいのではないかと思ったのです。
しかし、現実には『鏡面反射色』という設定項目が用意されています。 なんと、ハイライトの色を自分で指定しなくてはならないのです。
なぜかといえば、鏡面反射色を使うことで、軽い負荷でそれなりの結果を得られるからです。 物理的な再現はできないので、擬似的な計算を行うための設定項目を用意して、それなりの画像を作りだそうということです。
では、現在開いている新規ファイルを、何も変更せずにレンダリングしてみましょう。 キーボードのF12キーを押してください。
上図のようにレンダリング結果が表示されます。 見慣れた画像ですが、写実的では決してありません。
立方体の左手前の面が暗すぎます。 光源が右側にあるため、左の面には光は届かないという計算結果によるものですが、現実の世界ではここまで暗くならないでしょう。
もう少しだけ、この新規ファイルで遊んでみましょう。 Propertiesウィンドウのワールドパネル切替ボタン()を押します。
上図のようにワールドパネルが表示されますので、Ambient Occlusionパネルの同名のチェックボックス()をオンにします。
では、この状態でレンダリングしてみましょう。 キーボードのF12キーを押します。
上図のように少しだけ写実的になりました。 これは、Ambient Occlusionチェックボックス()をオンにしたことで、アンビエントオクルージョンが有効になったためです。
アンビエントオクルージョンとは、日本語では環境遮蔽と訳されます。 これは、次の記事で説明するグローバルイルミネーション(大域照明)を考慮した陰影の計算手法です。
立方体では効果がわかりづらいので、スザンヌのレンダリング結果を見てみましょう。
上図のように差は一目瞭然です。 右下の小窓は標準設定でのレンダリング結果です。 このように、アンビエントオクルージョンを使うことで写実的な陰影が表現できました。
では、アンビエントオクルージョンは物理的に正しい計算方法で陰影を計算しているのでしょうか。
残念ながら違います。 アンビエントオクルージョンもまた、物理的には正しくない計算で成り立っています。 そもそも、アンビエントオクルージョンは、光源の設定値すら参照していません。
Blenderの新規ファイルにはポイントライトが存在していますが、そのポイントライトの設定を見ていないのです。
アンビエントオクルージョンは、単純に、
という計算を行っているだけです。 『開けた場所は明るいはず、隅や凹んだ場所・他の面で囲まれた場所は暗いはず』というだけの話です。
3DCGに求められるのは写実的なレンダリング(フォトリアリスティックレンダリング)だけではありません。 イラストの素材やアニメーションのための『ノンフォトリアリスティックレンダリング』と呼ばれるレンダリングにも需要があります。
例えば、小学生向けに『パッションフルーツで緑のカーテンを作ろう』というパンフレットを作ることになり、そのイラストをBlenderで制作するとします。
イラスト素材をBlenderの標準設定でレンダリングしてしまうと以下のようになります。
上図のようにイラストにはふさわしくない中途半端な画像になりました。
続いてイラスト風にレンダリングしてみましょう。
上図のように明るい部分と暗い部分の差を少なくすることでイラスト風になりました。
さらに、セルアニメーション風にレンダリングしてみます。
上図のように陰影をくっきりさせ、輪郭線を足すことでセルアニメーション風になりました。
このようなイラスト風やセルアニメーション風のレンダリングにも需要があります。 写実的にレンダリングする技術も、イラスト風やセルアニメーション風にレンダリングする技術も身に着けたいものです。
現在のレンダリングの主流は、『物理ベースレンダリング』と呼ばれる物理的に正しい計算を行うレンダリング方法です。 この方法では、光の反射、透過、屈折、吸収などが物理的に正しく計算されます。
これは、先ほど説明した『物理的な現象を完全に再現することはできない』という内容と矛盾しているように感じますが、矛盾しているわけではありません。 全ての物理現象は再現できないが、一部だけを再現し、その部分の計算式は物理的に正いものを使うという手法なのです。
つまり、物理的に正しくない『擬似的な計算』から、全ては再現できないが物理的に正しい『簡略化された計算』へと変わっているのです。
Blender 2.61から、Cycles Renderという名称の新しい物理ベースのレンダリングエンジンが搭載されました。 新しいレンダリングエンジンであるCycles Renderを使用することでBlenderでも物理ベースのレンダリングが行えるようになったのです。
レンダリングとは、3次元の仮想世界にある物体を2次元の画像として投影する処理です。 ここでは、レンダリングを構成する各処理について簡単に説明します。
最終的に見えなくなる部分を描画対象から除外する処理です。 つまり、他の面によって隠れてしまう部分の消去です。
隠面かどうかの判断には色々な手法があります。
光源や視点との位置関係および面の質感、他の面との相互作用を考慮して陰影を付けます。 写実的な結果が得られるかどうかを左右する重要な項目です。
シェーディングの計算を行う機能をシェーダと呼びます。
Blenderの標準レンダリングエンジンであるBlender Renderには12種類のシェーダが、新しいレンダリングエンジンであるCycles Renderには19種類のシェーダが用意されています。
陰影の表現はシェーダによって決まります。 目的に応じて適切なシェーダを選択することが重要です。
表面の模様や凹凸を表現する処理です。
表面の模様を表現するためのテクスチャマッピング、擬似的に凹凸を表現するためのバンプマッピング、正確に凹凸を表現するためのディスプレイスメントマッピング、周囲からの映り込みを表現するための環境マッピングなどがあります。
現在の3DCGの技術では、全ての物理的現象を再現することはできません。 擬似的な計算や簡易的な計算で本物らしく見せています。
なお、ノンフォトリアリスティックレンダリングと呼ばれる、イラストやセルアニメーション風の非写実的なレンダリングにも需要があります。
近年では、物理的に正しい計算方法を用いた物理ベースレンダリング(PBR : Physically Based Rendering)が主流です。
レンダリング処理は、座標変換、隠面消去、陰影計算(シェーディング)、表面処理(マッピング)で構成されます。 陰影計算(シェーディング)の機能をシェーダと呼び、レンダリングエンジンごとに様々な種類が用意されています。