BlenderでOSLを使ってみる一歩一歩

Step by Stepってどう訳すのが良いんだろうね。なんてことはどうでもよくて。

この前の最後でBlenderでOpen Shanding Language(以下OSL)を使うとビルドインのノイズがあるから捗るみたいなことを書きました。

でもBlenderといえば変態だとか難しいだとか評判で、むしろどうやって使うのかわからないとかいわれそうなので軽くまとめてみます。

実は自分でもたまにちょっと忘れて、なんで出ないんだみたいになるのでその備忘録みたいなものを兼ねて。

Blenderの準備

OSLを使う場合、コンパイルエラーなどがコンソールに書き出されるため、Blenderコマンドラインから起動しておくのがお勧めです。

Mac OSXの場合は『パッケージの中身を表示』して Contents/MacOS/blender をダブルクリックするとか、Windowsの場合はコマンドプロンプトから起動するとかお馴染みの方法で。 Windowsは最初からコマンドプロンプトが開いたような気もしますが昔の話かもしれません。

さて、起動したらまずはレンダリングエンジンをCyclesに変更します。ヘッダーのEngineのプルダウンからCycles Renderを選びます。

f:id:c5h12:20141117034110p:plain

変更したらレンダリングパネルにOpen Shading Languageというチェックボックスが出てくるので、これをチェックします。

f:id:c5h12:20141117034116p:plain

以上でBlender本体の基本的な準備は完了です。

とはいえOSLはシェーダー言語なので、適当なマテリアルやシェーダーも設定しなければいけません。まあ普通にBlenderが使えるよという人は以下は読み飛ばしてさっさと書き始めれば良いと思います。

さて、説明するのに便利なので画面のレイアウトをScriptingに変更します。

f:id:c5h12:20141117034252p:plain

今回はOSLを使うのが目的なのでPythonコンソールは使いません。

しかしCyclesはマテリアルをノードで設定する必要があります。そこでこのスペースをノードエディターに変更します。

f:id:c5h12:20141117034305p:plain

これでBlenderの準備は完了です。

シェーダーの設定

とりあえず愛しのデフォルトキューブのマテリアルをOSL用に設定しましょう。

何もいじっていなければ立方体が選択されているはずですが、選択されていなかったら右クリックで選択します。

そして、マテリアルパネルを表示して Use Nodes ボタンを押します。

f:id:c5h12:20141117034317p:plain

ボタンを押すとノードエディタに簡単なマテリアルノードが現れます。

f:id:c5h12:20141117034331p:plain

妙に小さく出てくることがあったりするので、ノードエディタのViewメニューのView All(ショートカットはHomeキー)や、ホイールや中ボタンドラッグなどで見やすいようにノードエディタのビューを動かしましょう。

もしそれでも出てこなかったら、ノードエディターのヘッダーにあるボタンが『マテリアル(丸いアイコン)』と『オブジェクト(立方体のアイコン)』になっているかを確認して下さい。

シェーダーを書くにあたってプレビューが見られると便利なので、3D Viewで立方体がよく見えるように適当に視点を動かして表示をRenderedに切り替えておきましょう。

f:id:c5h12:20141117034341p:plain

さてやっとOSLの登場です。 テキストエディタのメニューの Templates にOSLのテンプレートがあるのでそこから始めると少し楽です。

f:id:c5h12:20141117034354p:plain

今回はノイズの話からきているのでNoiseというのを選んでみました。 色々なノイズをテクスチャとして出力するシェーダーです。

このスクリプトを使うために、ノードエディタで Script ノードを追加します。

f:id:c5h12:20141117034404p:plain

こんなノードが追加されます。

f:id:c5h12:20141117034412p:plain

上の Internal と External はテキストエディタに読み込んであるファイルを使うか、外部にあるファイルを使うかという設定です。 今回はすでにテキストエディタにあるのでInternalにしておきます。

メモ帳のようなアイコンをクリックすると読み込んであるテキストファイルのリストが出てきます。 目的のファイルを選択しましょう。

f:id:c5h12:20141117034422p:plain

ちなみにExternalにするとアイコンがフォルダになり、そこからファイルを読み込むダイアログが開きます。

スクリプトを選択するとOSLのコンパイルが行われ、成功するとノードの見た目が変わります。

noise.oslの出力は数値(灰色の端子)とカラー(黄色の端子)なので、スクリプトの出力をシェーダーに接続すれば3D Viewの立方体に反映されます。

f:id:c5h12:20141117034433p:plain

あとは好き勝手にOSLを書くだけです!

ご覧の通りノードの出力は既存のノードと組み合わせて使うことができます。 OSLモードでは既存のノードをOSLで再現したものが使われているようなので、Blenderのソースの中を探してみても参考になると思います。

OSLの言語仕様はGitHubのOSLのリポジトリsrc/docの中にosl-languagespec.pdfというファイルがあります。

BlenderのOSLの内容に関してはBlender WikiのRendering with CyclesのScript/OSLに使える機能や制限事項が書いてあります。

まあOSLを使おうと思うような人ならこの辺を見て、テンプレートにあるサンプルを眺めたりググったりすれば何となく書けるんじゃないでしょうか(無責任)。

スクリプトの編集

折角なのでちょっといじってみましょう。

デフォルトではカラーしか出力されないので、シェーダー出力をつけてみます。Shading Languageなんですからシェーダーの値だって出せるはずです。

というわけで、最初の方の output が並んでいるところに他の行を参考に closure color というものを追加します。 shader noise(...) の括弧の中に納まるように書きましょう。

shader noise(
    ...
    output color USimplex = 0.8,    // <- 最後に『,』をつけるのを忘れずに
    output closure color OutputBSDF = diffuse(N) )
{
    ...

追加したらシェーダーを更新するために、テキストエディタのヘッダーにある Script Node Update ボタンか、スクリプトノードのファイル名の横の矢印が回転しているアイコンのボタンを押します。

f:id:c5h12:20141117034452p:plain

シェーダーの更新に失敗した場合にはコンソールにエラーが吐き出されます。

上手くいっていればさきの図のようにシェーダー出力が付きますので、Material Outputにつなぎましょう。

これだけだとただのDiffuseなので、最後に少し追加します。

    OutputBSDF = diffuse(N) * USimplex;

f:id:c5h12:20141117034502p:plain

すでにある USimplex の色を乗算すると色がつきます。シェーダー言語らしくなってきました!もうこれでOSLで遊べますね!

いやまて diffuse(N) は文字通りdiffuseを計算してくれる関数だろうと見当はつくけど、この引数の N って何だ、と思った人がいるかもしれません。というか多分思ったでしょう。 これはデフォルトで用意されている法線ベクトルの値です。 OSLにはこのような暗黙で用意されているデフォルトの値がいくつかあります。 シェーダーの頭の方にある

point Point = P,

のPもデフォルトの位置ベクトルです。

これはOSLの仕様のどこかに書いてあったはずなので探してみて下さい。

余談ですが、このnoise.oslのような単純なカラーを出力するものではEmissionを使って色を確認するのがわかりやすいと思います。

f:id:c5h12:20141117034513p:plain

もちろんシェーダー内で emission() を使うこともできます。

それでは Happy Shading Time!