二進数コードで弾き語り

情報系大学生の徒然技術ブログ。

【自己紹介もかねて】Yafarayでコースティクスと光の分散(dispersion)をレンダリングしてみる

 初めまして。初投稿になります、drumathです。タイトルにある通り、自己紹介もかねまして、先日Blenderに導入したYafarayレンダラーについて少し記事を書こうと思います。

 

自己紹介

 PCいじりが好きな高校生です。最近はOpenGLで3Dソフトを作っていて、前はXamarinでスマホアプリを作ったり、Unityでゲームを作ったりしていました。どれも中途半端に初心者なのでどれか一つに絞って極めたい!と思いつつ、ほかの方面にも興味が出てしまう、なんていう贅沢な悩みを抱えています。他にも3DCGをやったり、アコギを弾いたり、ドラムを叩いたり、クトルゥフTRPGをやったり・・・と飽きっぽい性格なので趣味がどんどん増えていきます。はてなブログはプログラミングするときにいつもお世話になっていたので、いつか自分でも書いてみたいなぁなんて思っていました。文才がないので、まとまりのない文章になってしまうかもしれませんが、ぜひ興味のある記事にはコメント、シェア等してくださるとありがたいです。これからどうぞよろしくお願いします。

 

最近のマイブーム「レンダリング

 前述したとおり飽きっぽい性格なので、マイブームはちょくちょく変わります。次の記事を書くころにはまた変わってしまっているかもしれませんし、この記事を書くきっかけにもなったことなので、少しご紹介します。

 レンダリングとは、3Dで作られたオブジェクトを光の反射、屈折や陰影をコンピュータ内で計算、シミュレートし、2D画像に変換することを言います。3DCGの作品を作る時にはだいたいレンダリングし、ポストプロセス(コンポジットなど)を踏んで完成となります。レンダリングという作業は日常的にやっていたのですが、今使っているノートパソコンにグラボを積んでいないのでレンダリングはすべてCPUで行っている状態です。ゆえにレンダリング速度が遅くてあまり好きな作業ではありませんでした。

 しかし、最近見た『宝石の国』というアニメを見て、その美麗なCGに感銘を受けました。正確に言うと、

主題歌いいなぁ→ほう、オールCGなのか→内容めっちゃいい→(『アニメCGの現場』をみて)制作陣天才かよ・・・

という具合に自分の創作意欲を掻き立てるような、新鮮な感覚でした。

 こんなCGを作ってみたい!と思いました。宝石のようなモデルならBlenderで作り、Glass BSDFマテリアルで再現できます。ということでQiitaで記事を書きました。

qiita.com

 

Yafaray導入までの流れ

 Qiita執筆時はよくできたと思ったのですが、本物の宝石とはちょっと違うなぁって感じがしました。そんな疑問は、前述した『アニメCGの現場』で解決しました。

 自然の透明な材質に光が入るとその光は屈折し、ほかの表面に到達するときに特有の模様を描きます。これをコースティクスというのですが、BlenderのマニュアルによるとCyclesレンダラーはコースティクスをサポートしていない、というような記述が見れます。はて、どうしたものか。

entry.cgworld.jp

f:id:drumath:20180131133328p:plain

コースティクス



 「Blender コースティクス」みたいな感じで検索をかけると、それっぽい画像が出てきたり疑似的に再現していたりとデモはあるのですが、やはり新しいレンダラーを導入するのが得策だなと思い、Yafarayを導入することになりました。

 導入方法は、まず下記のYafarayの公式サイトからYafarayレンダラーのソースなどが入った.zipファイルをダウンロードし、Blenderで「ファイル」→「ユーザー設定」→「アドオン」の画面の下にある「ファイルからアドオンをインストール」をクリックして先ほどDLしたzipファイルを指定すれば完了です。

Download | YafaRay

レンダリングシステムについての話

 レンダリングとは光の計算をして3DCGを2Dの作品に変換する処理だということは前に話しました。光の計算とはレンダリング方程式というものをコンピュータが解くことにより行われるのですが、その方式にはいくつか種類あります。有名なものとしては、

などがあります。

 詳しい話は数学の知識が必要なのでしませんが、レイトレーシングは光源から出た光をカメラから逆にトレースすることで計算をします。逆に、フォトンマッピング方式は光源からの光線をカメラ、光線両方からトレースすることで大域証明(GI)やコースティクスを再現できます。まさに、フォトリアルな作品を作るにはもってこいのレンダリング方式です。また、透明な材質(例えばガラスや水)を通る光の屈折や散乱には適しているが、金属による鏡面反射は計算に時間がかかる、といった得意不得意があります。今回はコースティクスを再現したいので、Yafarayレンダラーでフォトンマッピング方式のレンダリングをしたいと思います。

 

シーンを作る

 それではシーンを作っていきます。こんな感じ。↓

f:id:drumath:20180131141013p:plain

設定としてはまずCubeで空間を作って、なかをポイントライトで照らします。そしてそれとはまた別にスポットライトでダイヤモンドのマテリアルを持ったオブジェクトを照らしてコースティクスを作ります。

f:id:drumath:20180131141425p:plain

部屋の中とダイヤモンドのかけらのオブジェクトです。ダイヤモンドのマテリアルは下記のような設定で作りました。

項目
Material Type Glass

IOR

2.42

 

IORには実際のダイヤモンドの屈折率を入力します。

次に空間を照らすポイントライトと、ダイヤモンドを照らすスポットライトの設定です。

項目
ランプのタイプ ポイント
カラー #ffffff
パワー 5

ポイントライトの設定です。

項目
ライトのタイプ Spot
パワー 30
Soft Shadows あり
サンプル 128
Shadow fuzzyness 1
サイズ 15.2°

スポットライトの設定です。

実際当てているスポットライトはめっちゃ明るいです。できるだけはっきりとコースティクスを描こうと思うのでこうしました。

さて、これでレンダリングしてみましょう。レンダリングの設定は以下の通りです。

項目
Ray depth 8
Shadow depth 8
Transparent Shadows TRUE
lighting Method Photon Mapping
diffuse photons TRUE
photons 1000000
caustic photons TRUE
1000000
バウンス 9
サンプル 128
AAーフィルタ Mitchell
パス 3
AAーサンプル 6
Color nois detection TRUE

 

f:id:drumath:20180131145142p:plain

レンダリング結果

見事にコースティクスが描かれていますね。ちなみに同じような設定でCyclesレンダラーでレンダリングすると、こうなります。

f:id:drumath:20180131150030p:plain

Cyclesレンダラーの場合


これでもサンプル数は4096なのですが、ノイズが走っていますね。この結果から、どうやらCyclesでもコースティクスは再現できるようですが、かなりのサンプル数が必要だということがわかります。もしこのノイズを消したい場合には、「間接値を制限」のところに「1.0」を入力すると消えますよ。

光の分散をレンダリング

 さて、次は光の分散をレンダリングしましょう。といっても簡単で、先ほどのダイヤモンドのマテリアルの設定に「dispersion」という項目があるのですが、そこに任意の値を入れれば分散をシミュレートできるみたいです。下の画像は「0.3」を代入したものになります。

f:id:drumath:20180131150637p:plain

dispersionを0.3にしたレンダリング結果

きれいですねぇ。宝石らしくなったのではないでしょうか。

まとめ

 Yafarayレンダラーを使うことによりフォトリアルなレンダリングをすることができました。またCyclesよりもYafarayのほうがレンダリング時間もはるかに速いので、今後重宝したいと思います。

 今回は以上になります。こんな感じの記事をたまに投稿しようと思うので、よろしくお願いします。

 

追記

 アニメーションレンダリングしてみました。よかったら見てください。↓

youtu.be