11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ビジュアルプログラミング的にBlenderのマテリアルを考える テラゾータイル編

Posted at

この記事の概要

プロシージャルテクスチャをご存知でしょうか。
3DCGでテクスチャというと、物体の質感を再現するために、3Dデータに貼り付ける画像と捉えることが多いです。
ですが、昨今の3DCGソフトでは計算により質感を再現する手段もあり、それがプロシージャルテクスチャです。

そして、Blenderにおけるプロシージャルテクスチャ作りが実質ビジュアルプログラミングである1ことに気がつきました。

というわけで、エンジニアとプロシージャルテクスチャは親和性が高いと考え、試しにQiitaにて記事にしてみました。

今回はテラゾータイルと呼ばれる人工大理石風のテクスチャを作成します。

完成形は次のような見た目です。

環境

Blenderのバージョンは3.5.0です。

制作

まずはテクスチャの適用先としてSpherePlaneを配置します。

次にShader Editorを開き、Materialの編集に入ります。
最初はこのようになっていると思います。

RGBノードを追加し、Principled BSDFBase Colorへ繋ぎます。
ここでは色を#569D6Bにしました。

現段階ではノードを追加する意味はないのですが、この後模様を増やすときにやりやすいため、追加しています。
特定の連想配列の中身を毎回取得するのは面倒だから変数として宣言しておく、みたいなイメージで捉えてください。

現時点ではこうなります。

次は、以下の工程を一気に説明します。

  • Volonoi TexutureMappingTexuture Coordinateを追加し、それぞれをつなぐ
    • Node Wranglerを有効にしている場合、Volonoi Texutureを選択してCtrl + Tを押すだけでOK
    • このときTexuture CoordinateObjectソケットから引っ張るようにする
  • 先ほど追加したRGBVolonoi TexutureMixで合成する
    • Node Wranglerを有効にしている場合、2つのノードをCtrl + Shift + 右ドラッグでなぞるだけでOK

現時点ではこうなります。

以下の2つのテクスチャを、Mixによって50%ずつ重ね合わせているため、このような模様ができあがります。
Mixは、2つの引数を合成してreturnする関数と捉えてください。

ちなみにFactorが0だとAのソケットの色、1だとBのソケットの色、0.5だと50%ずつ混ざります。
この仕組みも後に使用します。

RGB Volonoi Texuture

次に、Volonoi Texutureの設定をF1からN-Sphere Radiusに変え、Scaleを40とします。

これにより合成結果も変わります。

次にVolonoi TexutureMixの間にColorRampを挟みます。

  • グラデーションの仕方をLinearからConstantに変える
  • バーの左側の色を以下に変える
    • H:0, S:0, V:1, A:0
    • Position:0.000
  • バーの右側の色を以下に変える
    • Hex:C4D9DA
    • Position:0.450
  • ColorRampAlphaMixFactorにつなぐ

仕組みは次のようになっています。

ColorRampは、あるグラデーションを別のグラデーションに置き換えるようなものです。
配列を受け取ったら処理を加えて別な配列を返す、mapな関数に近いでしょうか。

今回は、閾値より明るいなら透明(H:0, S:0, V:1, A:0)に、暗いなら#C4D9DAとバッサリ分けていたためこのように2値化されました。

元々 ColorRampによる変換後

また、ColorRampAlphaソケットが出力するのは透明度の分布です。
透明が0で不透明が1のため、それが白黒に置き換わり、このような柄が生成されます。

この白黒の分布をMixFactorに繋ぐことにより、以下のように合成されます。

  • Volonoi Texutureの図柄がある場所 = 白黒の白 = Factorが1 = Volonoi TexutureにつないだColorRampで指定した色が描画される
  • それ以外 = 白黒の黒 = Factorが0 = RGBで指定した色が描画される

つまり、#569D6Bをベース色に、#C4D9DAの模様が描かれます。

ここから色を足すには同じ仕組みを繰り返せば良いだけです。
Volonoi TexutureColorRampを複製し以下のように設定を変え、もう1つMixを繋ぎます。

  • Volonoi Texuture
    • Scale:50.000
  • ColorRamp
    • Hex:2C6358
    • Position:0.480

ScalePositionは実際に作るオブジェクトを見ながら触るようなパラメーターです。
載せてはいますが、参考程度に見てもらえれば問題ありません。

白っぽい柄だけでなく、少し濃い緑の柄も加わりました。

表情を増やすため、もう1つ色を追加します。

  • Volonoi Texuture
    • Scale:60.000
  • ColorRamp
    • Hex:050F12
    • Position:0.510

かなり暗い色の柄が増えました。

ここで終わっても良いですが、今だと単に色を塗り分けたように見えるので、もう一手間加えてみます。
ベース色の部分と、柄の部分とでツヤツヤ感を変えて、柄の部分を少しだけ凹ませましょう。

仕組み的には先ほどまでと変わりません。

  • 追加した2つのMix
    • ColorRampAlphaを合成し、柄がある部分すべてを足し合わせた形状を取得
  • ColorRamp
    • Roughnessは値が小さい方がツヤツヤで、大きいとマットになる
    • Alphaの白黒に、それぞれ違う値を指定して材質の違いを表現する
    • Roughnessにつなげる
  • Bump
    • 表面に凹凸をつける
    • 今のままだと柄の部分が飛び出るので、Invertにチェックを入れて、Strengthを少し下げる
    • Normalにつなげる

これで、冒頭に示したものと同じテクスチャが完成しました。

最後に

理屈上の正しさというより「結果論でいい感じの見た目になっている」ようなテクスチャもたまに見かけます。
もちろん問題はありませんが、コードと同じで将来のバグの危険性を含んでいると言えるでしょう。

不要なノードを減らし、入出力の理屈をシンプルにしたい……と考えている最中に「コードを書いているときと同じような脳の使い方をしている」と気づきました。
そのため、もしかしてエンジニアの皆さんの方がテクスチャ作りが上手いのかもしれない、と思い半ば実験的に投稿してみました。

あと、一連の変化を載せておきます。


最後まで読んでくださってありがとうございます!
Twitterでも情報を発信しているので、良かったらフォローお願いします!

Devトークでお話してくださる方も募集中です!

  1. Blender以外の3DCGソフトを使ったことがないため、他のソフトがどうなのかは分かりません。Blenderのご了承ください。

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?