夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Blenderでコードベースでシェーダーを書く

本日はBlenderモデリング枠です。

Blenderでは通常ノードベースでシェーダーを構築することができます。

このためユーザーは特にプログラミングの知識を求められず初心者でもフィーリングでシェーダーを構築することができます。

UnityについてもShaderGraphの登場によって同様にノードベースでのシェーダー構築が可能になりましが、プログラマー以外のエンジニアがシェーダーを触れることになったことでアーティストなどの参入や初学者の参入のハードルが低くなりました。

筆者はコードでの構築が好きですが、プロトタイプ開発などで使用することがよくあります。

特に前職時代ある仕事で顧客に見てもらいながらその場で見た目を構築することがあり、こういったライブコーディングにはノードベースのシェーダーは最適です。

と話題がそれてしまいましたが、今回はデフォルトがノードで構築するBlenderのシェーダーをコードで記述していきます。

〇OSLについて

BlenderではOSL(Open Shading Language)がシェーダー言語として使用されています。

OSLはもともとはソニー イメージワークスがArnold Rendererを動かすためのシェディング言語として開発したのが始まりです。

Arnold RenderはMayaなど同じくAutodesk製品で主に使用されているレンダリングエンジンで、BlenderではArnoldはデフォルトでは使用できませんがArnold自体でレンダリングすることは可能でBtoAと呼ばれるコミュニティ作成のアドオンを使用することでレンダリングすることができます。

〇注意点

BlenderではOSLのシェーダーはCPU及びOptixレンダリングバックエンドのみで実行されます。

Blenderのコードベースのシェーダー

Blenderでシェーディングウィンドウを開きます。

追加コマンドからスクリプトを追加します

スクリプトノードが作成されます。 

スクリプトノードには内部,外部のタブがあります。

これはUnityのShaderGraphを触ったことがある場合はイメージがしやすいですがBlender内部にテキストエディタとしてコードを記述するか、外部のディレクトリにスクリプトを記述するかを選択するものになります。

今回は最初に内部から試していきます。

スクリプトウィンドウで新規のテキストファイルを作成します。

④次のコードを貼り付けます。

shader simple_material(
    color Diffuse_Color = color(0.6, 0.8, 0.6),
    float Noise_Factor = 0.5,
    output closure color BSDF = diffuse(N))
{
    color material_color = Diffuse_Color * mix(1.0, noise(P * 10.0), Noise_Factor);
    BSDF = material_color * diffuse(N);
}

シェーディングタブに戻りスクリプトノードから先ほど作成したファイルを選択します。

スクリプトノードの更新ボタンを選択します。

これによって作成したコードがノードとして使用できるようになります。

⑦出力をBlenderのマテリアル出力に接続しレンダリングを行います。

結果が確認できます。

なおレンダープロパティでOpen Shading Languageをチェックを入れて有効化します。

このパラメータはCPUでのみ表示されGPUを使用している場合は表示されません。

GPUでなぜ使用できないかについては別途調べてみたいです。(気になる)

以上でBlenderでコードベースでシェーダーを書くことができました。

詳しい解説などはまた別途行いますが感覚としてはUnityのShaderGraphに近いものを感じます。

本日は以上です。

〇参考

docs.blender.org