Blenderでそれなりにフォトリアルな画像を生成する
この記事は富士通クラウドテクノロジーズ Advent Calendar 2021 9日目の投稿です。
8日目は @SogoK さんの「Kubernetes クラスターを自力で組んでトラブルシューティングしてみる【The Hard Way】【ニフクラ】」でした。
チュートリアルがニフクラを使ったものに置き換えられており、各READMEも丁寧に書かれていてとても進めやすそうという印象を受けました。
さて、今回は自社サービスとは全く関係ないのですが、3DCGについて書いていきたいと思います。
目次
ゴール
Blender上でIBLとPBRの設定を行い、自作した3Dモデルを使ってそれなりにフォトリアル(写実的)な画像をレンダリングすることが目的です。
モチベーション
3DCGを作成するためのソフトウェアとしてBlenderがあります。
趣味でこのBlenderを使った3Dモデリングをはじめました。
いくつかモデルを作っていくうちにレンダリング(3Dのモデルから2Dの画像などを生成すること)の方にも興味が湧き、「自分の作った3Dモデルを現実の世界の中にあるかのように見せたい」と思うようになってきました。
どのようにすれば写実的なレンダリングができるのかを調べていくうちに、リアルな環境光の表現はIBL、質感の表現にはPBRという技術が使われることが多いらしいということがわかりました。
今回の記事は、写実的な画像を作る上で必要な技術的要素やBlenderの設定方法について調査した内容や、実際に作成した3Dモデルを使ってレンダリングするまでの過程を書きます。(Blenderの具体的な操作方法にはあまり触れません)
環境
Blender 2.83 LTS を使います。
レンダリングエンジンはCyclesを使います。
準備
Blenderのオブジェクトを用意します。
デフォルトで用意できるものでも良いですが、自分で作成しておくとうまくできたときの喜びもひとしおかなと思います。
用語の紹介
はじめに、IBLとPBRについて軽く触れておきます。(かなりかいつまんで書いています。)
IBL (Image Based Lighting、イメージベースドライティング)
画像の持っている明るさの情報を光源として利用する手法のことです。
IBLとは - digital-notes jimdo page!
jpegやpng画像などでも行うことができますが、輝度幅が広く、実際の明るさを表現することが可能なハイダイナミックレンジイメージ(HDRI)が使われることが多いです。
PBR (Physically Based Rendering、物理ベースレンダリング)
PBRとは、現実世界の光の散乱・反射・吸収・屈折などの物理現象を元にレンダリングをする手法のことです。
今回は、BlenderでこのPBRに基づいたレンダリングをするためにPrincipled(プリンシプル) BSDFというシェーダーを使います。
シェーダーとは、3Dのモデルの描画のされ方を記述するプログラムのことです。Blenderでは以下のようなノードとして扱います。
このシェーダーのパラメーターを調整してレンダリングを行うことによって、物理的に(計算の都合上省略している部分があるらしいのでだいたい)正しい質感が表現できるということです。
今回はそれなりに写実的な画像をレンダリングすることが主目的なのでIBLとPBRについて適度に理解した気持ちになって先に進めます。
IBLの設定
ここから環境光であるIBLの設定をしていきます。
画像を元に光源を設定するので画像が必要です。
こちらのHDRIの素材を使わせていただきます。 polyhaven.com
好きな画像をダウンロードしてきます。
Blenderを開き、Shadingタブを開いて Shader Type
をWorldにします。
Add -> Texture -> Environment Texture
と選択してノードを追加し、Openボタンを押して先程ダウンロードした画像を選択します。
以下のようにノードを接続します。すると選択した画像が背景に設定されます。
Blender上でIBLの設定は以上で終わりです。
Monkeyのオブジェクトを追加して試しにレンダリングしてみます。
Render -> Render Image
からレンダリングします。
他の画像も背景に設定して試してみます。
背景画像からの環境光を受けてモンキーの色が変わっていることがわかります。(夕方の牧草地の例がわかりやすいのですが、Monkeyの上向き面は青い空の影響を受けて青みがかり、下向き面は緑色の草の影響を受けて緑がかっています)
Blender 2.83時点では新規追加したオブジェクトのノードツリーにデフォルトでプリンシプルBSDFシェーダーノードが組み込まれているために、すでにPBRに基づいたレンダリングがされています。
では、このモンキーに金属などの質感や木目などの模様を持たせたい場合はどうすれば良いでしょうか?というところで次項に進みます。
PBRの設定
Blenderでは、オブジェクトのマテリアル(材質)を編集するためにシェーダーエディタというものを使います。シェーダーエディタ上でノードをつなげたり(ノードをつなげたものをノードツリーとよびます)、ノード内のパラメータを編集したりすることでレンダリングされるオブジェクトの材質を変更することができます。
PBRに基づいたレンダリングをするにはシェーダーエディタ上でプリンシプルBSDFノードが持っているパラメータを編集することになります。 ですが、表現したい質感になるようなパラメータを自分自身で一から作るのは大変です。
そこで有志の方が公開している素材集やadd-onを使わせていただくことにします。
PBR Materials add-on
金属やプラスチックや岩などの質感をPBRで表現するためのadd-onです。
PBR Materials add-onをBlenderにインストールします。 3d-wolf.com
「DOWNLOAD」のリンクを押すとzipファイルが落ちてきます。
Blenderを開き、Edit -> Preferences -> Add-ons
と進み、Installボタンを押します。新しいウィンドウが開くので先程ダウンロードしたzipファイルを選択しInstall Add-on
を押します。
インストールが完了したら以下のようにAdd-on名の横のチェックボックスにチェックを入れます。アドオンが有効化された状態になります。
すると以下のようにMaterial PropertiesタブにPBR Materialsの項が追加されます。 好きな材質を選択するとそれに応じたノードツリーが作成されパラメータが設定されます。
こちらもMonkeyのオブジェクトを追加して試しにレンダリングしてみます。
それぞれPlacticとGoldのマテリアルを設定してIBLの環境光の元でレンダリングしました。
モンキーが環境光の影響を受けつつ、PlacticとGoldの質感が表現されています。
ただ、木目や岩など複雑な模様や材質をもつ表現はこのままだと難しいです。
PBR Texture集
複雑な模様や材質を扱いたい場合は以下のような配布サイトからテクスチャ(オブジェクトに貼り付ける画像)をお借りしました。 polyhaven.com
好きな材質を選んでダウンロードするとzipファイルが落ちてくるので展開します。
ファイルの中にはオブジェクトの色を表すため(Base Color)の画像だけでなく、オブジェクト表面の粗さや法線などの形状の情報(Displacement、Normal、Roughness)を表すための画像が含まれています。
これらをプリンシプルBSDFのパラメータとして扱うことで複雑な材質を表現します。
一緒に入っているblendファイルをBlenderで開いてシェーダーエディタ上のノードの接続を真似したりコピー&ペーストすれば自分のオブジェクトに材質を割り当てることができます。
または、textureフォルダ以下に入っている画像ファイル名のサフィックスを見て画像の種類を推測しつつ接続していきます。
シェーダーノードの接続は以下のサイトなどを参考に接続しました。
例
- _diff_4k -> Base Color
- _disp_4k -> Displacement
- _nor_gl_4k -> Normal
- _rough_4k -> Roughness
(このあたりはもっと楽なTextureの導入方法があるのかもしれません。)
こちらもMonkeyのオブジェクトを追加して、ノードツリーを組み立てて試しにレンダリングしてみます。
木目と岩のテクスチャを設定してIBLの環境光の元でレンダリングしました。
モンキーが環境光の影響を受けつつ、木目や岩の質感や模様が表現されています。
ここまできたら現実世界にある材質はだいたい表現できるので、自分で作成した3DモデルにPBRのマテリアルを設定していきます。
自作3DモデルにPBRのマテリアルを適用する
今回はペンとノート(金属部分あり)とマグカップと机にそれぞれマテリアル(材質)を設定します。
ペンはプラスチックの材質、ノートの金属部分は金属…というように先程紹介したPBR Materials add-onやPBR Texture集から選択して割り当てました。
IBLの設定もしておきます。
設定が終わったらレンダリングします。
成果物
(少しカメラの被写界深度をいじりました)
それなりに現実味のある画像になったかなと思います。
まとめ
この記事ではPBRやIBLについて簡単な説明をし、Blender上でこれらの技術を用いたレンダリングをするまでの設定について説明しました。
PBRやIBLについて表面的な理解しかできていなかったり、レンダリングに関する他の技術について足りていない部分は多々ありますが、なにはともあれ当初の目的であったそれなりに写実的な画像を生成することができました。
明日は @Tortoiseshell さんの「APIを叩いて家電の遠隔操作をしてみる[SwitchBot]」です。
お楽しみに。