ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Blender】Blender2.8でセルシェーディングのコンポジットをやってみる

www.youtube.com

 今回はこの動画を見つつコンポジットをやってみました。基本的には動画の通りに進めていけば大丈夫です。

 ただしBlender2.8だと少し追加の手順が必要だったりしたのでその点も踏まえての備忘録になります。

 では始めます。


0:オブジェクトとマテリアルの準備をする
 動画にある通りにオブジェクトを並べてマテリアルで色の設定をして以下のようにします。
f:id:rikoubou:20190801163129p:plain

 面倒な場合はここまでできたファイルを以下に公開しておくのでダウンロードしてください。

 以降はこのファイルを使っていく前提で進めていきます。


1:Compositing画面を開いてノードを使えるようにする
 オブジェクトの準備ができたらCompositing画面を開きます。

「Compositing」のタブを選択します。
f:id:rikoubou:20190801165137p:plain

 コンポジット用の画面になるので下画面の「Editor Type」のプルダウンから「Image Editor」を選択します。
f:id:rikoubou:20190801165331p:plain

 下画面が「Image Editor」に切り替わったらプルダウンから「Render Result」を選択します。
f:id:rikoubou:20190801165542p:plain

 こうしておくことで下画面でコンポジットした結果を確認できるようになります。

 次にCompositor画面の上の方にある「Use Nodes」にチェックを入れます。
f:id:rikoubou:20190801165910p:plain

 すると以下のようにノードが表示されて使えるようになります。
f:id:rikoubou:20190801170014p:plain

 この状態で「Render Layers」の「Render」ボタンを押すとノードを使ってコンポジットした結果が得られます。
f:id:rikoubou:20190801170237p:plain
f:id:rikoubou:20190801170435p:plain

※注意:「Render」ボタンでの出力結果についてノードの処理が行われるので、オブジェクト、マテリアル、カメラ位置などの変更やレンダーエンジンを変更した際などは毎回「Render」ボタンを押してレンダリング結果を得る必要があります。


2:Cyclesレンダーに切り替える
 Eeveeレンダーだと動画通りに設定できない項目があったのでCyclesレンダーに切り替える必要があります。

「Render」アイコンをクリックして「Render Engine」のプルダウンから「Cycles」を選択して切り替えます。
f:id:rikoubou:20190801171057p:plain
f:id:rikoubou:20190801171149p:plain

 Cyclesレンダーに切り替えたら「View Layer」アイコンを選択してDateの「Normal」にチェックを入れ、Lightの「DiffuseのColor」を選択し、「Shadow」にチェックを入れます。
f:id:rikoubou:20190801172008p:plain

 するとRender Layersにチェックを入れた項目が追加されます。
f:id:rikoubou:20190801172305p:plain

 Cyclesレンダーに切り替え、項目も追加したので「Render」ボタンを押して再度レンダリング結果を得ておきます(Cyclesレンダーになっているのでレンダリングに時間がかかる場合があります)。
f:id:rikoubou:20190801172732p:plain

 これでようやく準備は終わりで実際にノードを作成していきます。


3:輪郭線を抽出する
※輪郭線を出すためには「Depth(深度)」と「Normal(法線)」があればできるので「Eeveeレンダー」のままでも可能です。

 Compositor画面上で「Shift + Aキー」を押して「Vector」→「Normalize」を選択します。
f:id:rikoubou:20190801173109p:plain

「Normalize(正規化)」のノードが追加されます。
f:id:rikoubou:20190801173251p:plain

 次に「Shift + Aキー」を押して「Filter」→「Filter」を選択します。
f:id:rikoubou:20190801173457p:plain

「Soften」というノードが追加されますが、これはプルダウンによって名前が変更される「Filter」ノードです。
f:id:rikoubou:20190801173621p:plain

 プルダウンから「Prewitt」を選択します。
f:id:rikoubou:20190801173938p:plain

「Shift + Aキー」を押して「Converter」→「ColorRamp」を選択します。
f:id:rikoubou:20190801174607p:plain

「ColorRamp」を追加したら動画と同じようにノードを繋ぎ、その結果が下画面に表示されます。
f:id:rikoubou:20190801174802p:plain

 輪郭線だけ抽出したいので以下のようにColorRampの範囲を調節します。
f:id:rikoubou:20190801175300g:plain

 スザンヌや球体の線が途切れたりしてますが、とりあえず以下のようになりました。
f:id:rikoubou:20190801175506p:plain

 次に「Shift+左クリック」で「Prewitt」と「ColorRamp」の両方を選択した状態で「Ctrl+C」、「Ctrl+V」でノードをコピペします。
f:id:rikoubou:20190801175925p:plain

 コピペしたら同じ場所にノードが重なった状態になるので、左クリックでドラッグして位置を移動させます。
f:id:rikoubou:20190801180042g:plain

 以下のようにノードを繋いで「ColorRamp」の値を調節します。
f:id:rikoubou:20190801180455p:plain

 動画にもあるようにこの「Depth(深度)」と「Normal(法線)」片方ずつでは抽出できない輪郭線を両方出して合わせることによって、全体の輪郭線を出すようにしています。

 ここまで出来たら「Shift+Aキー」から「Converter」→「Math」を選択して追加します。
f:id:rikoubou:20190801180810p:plain

 これもプルダウンによってノードの名前が変更されますが「Math」のノードです。
f:id:rikoubou:20190801181001p:plain

「Add」ノードの「Clamp」にチェックを入れて以下のようにノードを繋ぐと両方の輪郭線が合わさった状態になります。
f:id:rikoubou:20190801181319p:plain

 これで輪郭線の抽出ができました。


4:テクスチャ素材を作成する
 続いてテクスチャ素材を作成していきます。

 Editor Typeのプルダウンから「Texture Node Editor」を選択して画面を切り替えます。
f:id:rikoubou:20190802145104p:plain

 Texture Node Editor画面に切り替わったら「Texture Type」プルダウンから「Brush」を選択します。
f:id:rikoubou:20190802145306p:plain

 Brushを選択したら「New」ボタンをクリックして新規Textureを作成します。
f:id:rikoubou:20190802145510p:plain

 Texture名を「Cloud_Soft」に変更し「Use Nodes」にチェックを入れてノードを表示させます。
f:id:rikoubou:20190802145851p:plain

「Checker」ノードをクリックで選択して「X」キーで削除します。
f:id:rikoubou:20190802150109p:plain

「Shift + Aキー」で「Texture」→「Clouds」を選択して「Clouds」ノードを追加します。
f:id:rikoubou:20190802150404p:plain

 追加した「Clouds」ノードを赤枠の「Color」に切り替え、Outputと繋ぎます。バグなのか結果画像が表示されませんが、実際にはちゃんとテクスチャが作られています。
f:id:rikoubou:20190802150937p:plain

 次のテクスチャ素材を作るために「New Texture」ボタンをクリックします。
f:id:rikoubou:20190802151250p:plain

 先ほどと同様に「Cloud_Hard」に名前を変更してCloudsノードを追加して赤枠の「Hard」に切り替え、Outputに繋ぎます。
f:id:rikoubou:20190802151515p:plain

 最後に影部分の線のテクスチャ素材を作ります。

「New Texture」ボタンをクリックします。
f:id:rikoubou:20190802151250p:plain

「Line」に名前を変更し、Checkerノードを削除します。
f:id:rikoubou:20190802151901p:plain

「Shift + Aキー」で「Texture」→「Wood」を選択して「Wood」ノードを追加します。
f:id:rikoubou:20190802152111p:plain
 
「Wood」ノードの赤枠の「Tri」に切り替え「Turblenc」の値を0.5に変更してOutputに繋ぎます。
f:id:rikoubou:20190802152415p:plain

 すべてのテクスチャ素材ができたら、それぞれもテクスチャで「Fake User」ボタンを押してテクスチャ素材をblendファイル内に保存します。
f:id:rikoubou:20190806143032p:plain

 これでテクスチャ素材は完成したので「Editor Type」プルダウンから元の画面に戻します。
f:id:rikoubou:20190802152650p:plain


5:影にLineテクスチャを適応させ輪郭線を合成する
 Compositor画面に戻って「Shift + Aキー」から「Input」→「Texture」を選択してTextureノードを追加します。
f:id:rikoubou:20190802153155p:plain

 追加したTextureノードのテクスチャを「Line」に設定します。
f:id:rikoubou:20190802153410p:plain

 TextureノードのColorをCompositeに繋ぐと以下のような結果になります。
f:id:rikoubou:20190802153618p:plain

「ColorRamp」を間に追加して線の調節をします。
f:id:rikoubou:20190802153910p:plain

 このままだと線が太すぎるので「Shift + Aキー」から「Input」→「Value」を選択してValueノードを追加します。
f:id:rikoubou:20190802154102p:plain

 Valueノードの値を10に変更し、TextureノードのScaleに繋いで線を細くします。
f:id:rikoubou:20190802154335p:plain

 可読性を上げるために「Shift + Aキー」から「Layout」→「Frame」を選択してFrameノードを追加します。
f:id:rikoubou:20190802154655p:plain

 Frameノードを追加したらまとめたいノードを「Shift+クリック」で複数選択してFrameの中にドラッグすることでまとめられます。
f:id:rikoubou:20190802154844g:plain

 Compositor画面のItemタブの「Label」の項目を入力するとFrame名を変更できます。
f:id:rikoubou:20190802155217p:plain

 影部分のテクスチャ設定ができたので実際の影部分に適応させます。

「Shift + Aキー」から「Converter」→「Math」を選択してノードを追加します。
f:id:rikoubou:20190802155632p:plain

 追加したAddノードの「Clamp」にチェックを入れてShadowの出力と「Render Layers」の「Shadow」の出力を合わせると以下のように影部分が斜線になります。
f:id:rikoubou:20190802155820p:plain

 次にこの影と輪郭線を合わせていきます。

「Shift + Aキー」から「Converter」→「Math」を選択してノードを追加します。
f:id:rikoubou:20190802161641p:plain

 追加したMathノードをプルダウンから「Subtract」(減算)に変更します。
f:id:rikoubou:20190802161843p:plain

 影の出力を上側、輪郭線の出力を下側に繋ぐと以下のように輪郭線と影の斜線が合成された状態になります。
f:id:rikoubou:20190802162157p:plain


6:線をボカす
「Shift + Aキー」から「Input」→「Texture」を選択してノードを追加します。
f:id:rikoubou:20190802163644p:plain

 追加したTextureノードに「Cloud_Hard」を設定します。
f:id:rikoubou:20190802163845p:plain

 続いて「Shift + Aキー」から「Filter」→「Bokeh Blur」を選択してノードを追加します。
f:id:rikoubou:20190802163957p:plain

 追加したBokeh Blurノードの「Variable Size」にチェックを入れて以下のように繋ぐと線がボケていることがわかります。
f:id:rikoubou:20190802164241p:plain

 ボケを調節するために「Shift + Aキー」から「Converter」→「Math」を選択してノードを追加します。
f:id:rikoubou:20190802164447p:plain

 追加したノードを「Multiply」(乗算)に変更し「Clamp」にチェックを入れて以下のように繋ぎ、Bokeh BlurのMax Blurを8にします。
f:id:rikoubou:20190802164834p:plain

「ColorRamp」を追加して調節して線の幅を調節します。
f:id:rikoubou:20190802165136p:plain

「Frame」を追加して「Bokeh Blur」としてまとめます。
f:id:rikoubou:20190802165437p:plain


7:線を歪める
 次に線を歪める処理を入れていきます。

「Shift + Aキー」で「Input」→「Texture」を選択してノードを追加します。
f:id:rikoubou:20190806143253p:plain

 追加した「Texture」ノードのテクスチャを「Cloud_Soft」に設定します。
f:id:rikoubou:20190806143515p:plain

「Shift + Aキー」で「Distort」→「Displace」を選択してノードを追加します。
f:id:rikoubou:20190806143657p:plain

 続いて「Shift + Aキー」で「Color」→「Mix」を選択してノードを追加します。
f:id:rikoubou:20190806143946p:plain

 追加したノードのプルダウンから「Subtract」(減算)を選択します。
f:id:rikoubou:20190806144209p:plain

 次に「Shift + Aキー」で「Input」→「Value」を選択してノードを追加します。
f:id:rikoubou:20190806144413p:plain

 これらのノードを以下のように繋ぐと、色がまだらな感じの画像になります。
f:id:rikoubou:20190806144629p:plain

 Displaceノードに6の結果をImageに、まだらな画像の結果をVectorに繋いで、XScale、YScale共に10に設定すると以下のように線が少し歪みます。
f:id:rikoubou:20190806145150p:plain

 ノードを選択した状態で「M」キーを押すことで選択ノードの影響あり/なしを切り替えて確認することもできます。
f:id:rikoubou:20190806145419p:plain

「Frame」を追加して「Displace」としてまとめます。
f:id:rikoubou:20190806145711p:plain


8:色をつける
「Shift + Aキー」で「Color」→「Mix」を選択してノードを追加します。
f:id:rikoubou:20190806150149p:plain

 追加したMixノードの「Fac」にDisplaceの結果を、Mixノードの下の「Image」に「Render LayersのDiffCol」を繋ぎます。
f:id:rikoubou:20190806150706p:plain

 以下のように色がつき、線が白くなります。線が白いのは上の「Image」に設定されている色が白色になっているためです。
f:id:rikoubou:20190806150934p:plain

 線の色を変更するために上のImageにあるキャンバスをクリックし、Hexを選んで「2F2F2F」と入力します。
f:id:rikoubou:20190806151253p:plain

 線の色が変更されました。
f:id:rikoubou:20190806151404p:plain


9:ボカす
 線がはっきりしすぎているのでさらにぼかします。

「Shift + Aキー」で「Filter」→「Blur」を選択してノードを追加します。
f:id:rikoubou:20190806151823p:plain

 追加したノードのプルダウンで「Fast Gaussian」を選択し、X、Yの値を両方1に設定、Sizeを2に設定します。
f:id:rikoubou:20190806152021p:plain

 以下のように線が少しぼけた感じになります。
f:id:rikoubou:20190806152214p:plain


10:ノイズをつける
 最後にノイズをつけます。

「Shift + Aキー」で「Color」→「Mix」を選択してノードを追加します。
f:id:rikoubou:20190806152938p:plain

 追加したノードのプルダウンから「Soft Light」を選択します。
f:id:rikoubou:20190806153129p:plain

「Shift + Aキー」で「Input」→「Texture」を選択してノードを追加します。
f:id:rikoubou:20190806153237p:plain

 追加した「Texture」ノードのテクスチャを「Cloud_Soft」に設定します。
f:id:rikoubou:20190806153414p:plain

 ノードを以下のように繋いで「Soft Light」のFacを0.7に設定します。
f:id:rikoubou:20190806153701p:plain

 すると以下のようにCloud_Softの画像が反映された画面になります。
f:id:rikoubou:20190806153800p:plain


11:完成
 実際にレンダリングした結果画像は以下のようになります。
f:id:rikoubou:20190806154219p:plain


 以上がセルシェーディングでのコンポジットをやってみた結果です。

 紹介した動画にはより詳しく説明されているので、より知りたい場合はそちらをご覧ください。

 一応今回作成したblendファイルを公開しておきます。


・参考資料