記事の目次

    Materialをゼロから作成します。

    TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
    日本でも指折りのHoudini アーティスト。
    手がけてきた作品は数々の賞を受賞している。
    代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
    www.transistorstudio.co.jp
    blog.junichiakimoto.com


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)

    MaterialとMantraで実現するプロシージャルシェーディング

    前回の連載では、Mantraを中心に解説しました。今回は、Materialの視点から掘り下げていきたいと思います。Mantraの素晴らしいところは、Materialと密接に関わっていて、そのMaterialが非常に汎用性が高いと言う点です。

    近年ではサードパーティ製品の台頭により、Mantraの存在意義が薄れつつあります。速さが重視される風潮の中、レンダリング速度が非常に速いサードパーティ製のレンダラに比べると、Mantraはのんびりしたところがあるのは事実です。ただ、シチュエーションによってはMantraも捨てたものではなく、Materialの構築によりテクスチャワークのいらない完全にプロシージャルな質感をつけることが可能になります。

    これは、そもそもUVすらも必要としないようなオートマティックなシェーディングフローを組み上げられることを意味し、それはすなわち生産性の大幅な向上につながります。今回は、そのようなプロシージャルなシェーディングをゼロから組み上げて、MantraとMaterialの優れた機能を理解していきたいと考えています。

    今回のHoudiniプロジェクトデータはこちら

    01 Setup

    全体のセットアップを解説します。

    まず、全体のセットアップを開始します。Materialをビルドするために、最終的にレンダリングしたいものを準備します。Material Network【A】を作成し、この中にMaterialを作成していきます。デフォルトで用意してあるMaterial Networkでも問題ありません。Light【B】とCamera【C】を準備します。次に、ブランクなObject【D】を作成しレイアウトをします。プロシージャルなシェーディングをするためには、まず、世界の大きさがはっきりわかっていた方が良いので、最初にレイアウトをとっておきます。ここのネットワークには映っていませんが、Materialを詰める際に、あまり複雑で重たいジオメトリで作成すると時間の無駄になってしまいますので、テスト用のジオメトリを準備して切り替えながら作業すると効率が上がります。

    Material Networkの中では、Material Builder【E】を使って、新たにMaterialを作成します。ジオメトリはDelayed Load Procedural【F】を使ってキャッシュを読み込むようにし、Collect【G】を使ってShaderをまとめ、このCollectをGeometryが選択している状態にセッティングします。最後に、MantraをPhisically Based Renderingで設定すれば、準備は完了です。


    今回のMaterialは、木に対してペンキが塗られているような素材を作成していきたいと思います。Materialのフローは大きく4つあり、木目の作成【H】、ペンキの質感【I】、ペンキのマスク【J】、最後にそれらを合成【K】するながれになります。

    Materialの作成は、一見複雑なように見受けられますが、実際には要素をコンポジットしていくようなながれになりますので、NUKEなどノードベースの合成を経験している人にとってはそこまで難易度の高いものではありません。ただ、シェーディングを作成するノウハウがないと合成までたどり着けないため、その部分の理解が深まればと思います。Houdiniでは、ある程度汎用的なMaterialは用意されています。ただ、今回のように、プロシージャルな模様を作成したり、異なる質感を合成したりするためには、ゼロから作成できる技術を習得しておく必要があります。

    次ページ:
    02 Material Flow

    [[SplitPage]]

    02 Material Flow - Base

    シェーディングは、まずベースになる木材の質感から作成していきます。プロシージャルシェーダでは、導入的な位置にある木目のシェーディングも、本気で取り組もうとするとなかなかに難易度が高いものです。今回は、シンプルな構造である程度リアルに見えるよう模様をつくり上げたいと思います。


    まず、木目の生成に必要な座標系を作成します。PositionであるPは、Transform【A】を使ってObject Spaceに設定します。こうすることで、GeometryのTransform情報がシェーダに引き継がれます。もしDeformも必要であれば、Geometry側にRest Positionを設定することをオススメします。

    次に、木目の軸を作成します。XYZのいずれかの座標が0になるように設定し、今回はそれらをSwitchで選択できるようにしています【B】。この座標系から、指定した木目の中心となる座標との距離を算出します【C】。こうして作成した新しい座標を使ってNoise【D】を生成すれば、同心円状に広がる模様をつくり出すことができます【1】

    さらにリアルにするために、密度にNoiseを加え【E】、元々の空間にもNoise【F】を加えます。ここまでが、ベースとなる模様を生成するフローになります【G】。これでリアルな木目を作成することができました【2】


    さらにディテールを加えるためのフロー【H】を解説します。模様に対して、木の繊維の雰囲気を足すNoise【I】をつくります。これも先ほどの座標系から作成しますが、Frequencyに、軸によって伸び方が変わるようなしくみを追加します【J】。これは木目の軸を選択するSwitchと同期するようにセッティングします。これで、詳細なNoiseが作成できます【3】

    Ramp Parameterを使って、作成したNoiseのFloat情報を色情報へ変換します。中心から外側に向かって変化するグラデーションと、Noiseによって変化するグラデーションを作成します【K】。ただの木目【4】だけでは平坦な雰囲気ですが、ディテールが加わることでさらに情報量が増え、有機的になります【5】。この色情報に対してPBD Difuuse【L】を乗算し陰影を付けていきます【6】



    さらに、PBR Non-Metallic【M】を使ってReflectionを作成します【7】。Displace Along Normal【N】を使ってBumpを作成し、そのNormalを利用してDiffuseやReflectionを作成することで、凹凸の雰囲気をつくり出すことができます。最後にこれらを合成して木材の質感が完成です【8】。実際にGeometryに適用してレンダリングしてみると調整箇所がわかりやすいので、テストモデルと切り替えながらリテイクを重ねましょう【9】



    03 Material Flow - Curvature

    次に、Curvatureのマスクを作成します。HoudiniにはデフォルトでCurvatureを計算してくれるノードがありますが、今回はそれを使用せずゼロから組み上げています。まずコアになるのがGather Loop【A】です。これは、レイを複数飛ばしてサンプリングするためのノードですが、今回はNoise【B】を使ってDisplacement【C】させたNormalをサンプリングし、元々のNormalとの内積値【D】を取ることで擬似的にCurvatureをつくり出しています。Gather Loop内部では、空のNに対して、つくり出したNを加算していく方法を採っています【E】。トリッキーですが、今回のGeometryの場合はこちらの方が良い結果が得られたので、このようなアプローチを選択しました。


    さらに、Curvatureのエッジ部分から一部を取り出し、元々の木目とかけ合わせることで、エッジ部分にディテールを追加しています【F】。また、全体に木目のスレを入れることで、さらに説得力をもたせています【G】。これで、Curvatureマスクの完成です【1】


    次ページ:
    04 Material Flow - Paint

    [[SplitPage]]

    04 Material Flow - Paint

    最後に、ペイント部分のシェーディングを解説します。今回は、ベースとなるPBR Diffuse【A】【1】と、Reflection用にPBR Non-Metallic【B】【2】を使用しています。それぞれに、木目のBumpを計算したDisplace Along Normal【C】からNを使い、シェーディングにディテールを加えます。Diffuseのみペイントカラーを乗算しています。




    必要であれば、ここにもNoiseを使ったディテールや模様などを入れ込んでも良いでしょう。そうして、BSDF同士を加算してペイントを作成します【3】。最後に、木目とペイントを、CurvatureマスクでMixすれば今回の目的のMaterialの完成です【4】



    05 Operators

    主要ノードを解説します。

    ●Material Builder

    今回はMaterial Builder内部の詳細を解説してきました。Houdiniには、Principled Shaderと呼ばれる高機能なMaterialがすでに存在しており、基本的にはこちらを使えば、世の中に存在するほとんどのものは表現可能だと思います。ただ、今回のように、テクスチャやUVを使用せず、ある意味でSolidなテクスチャでもある、Noiseを使ったカスタムなプロシージャルシェーダを組み上げるためには、Material Builderが必須となってきます。

    Houdiniには、matとshopという2つのMaterial構築場所があります。shopはこれまでにも使用してきましたが、今回は使用せず1つのMaterial内で完結するように構築しています。一方、matであれば、Layerという機能が使えます。Layerを使うことで、異なるMaterial同士を合成したり、複雑に素材が入り組む質感なども効率的に再現できます。そのため、今後はshopからmatへの移行が進むと考えられます。


    • 「Houdini COOKBOOK +ACADEMY」
      Houdiniを基礎から楽しく学ぶオンライン講座

      公開日程:毎週金曜日公開(予定)
      価格:1,200円(税込)
      ※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
      受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
      cgworld.jp/special/houdinicookbookacademy