随分久しぶりの更新になりますが、実は生きてました。

今回はMayaでハードエッジ部分をレンダリング(ベイク)するシェーダについて紹介します。

この方法を使うとハードエッジのエッジ角に応じて、線に強弱を付けてレンダリングする事ができます。

▼ ハードエッジシェーダーサンプル
eb1d18a3.jpg

このシェーダーの最大の利点は、テクスチャ作成時に初期素材としてベイク出来る点です。

テクスチャ製作で、エッジハイライト部分を手描きで一本ずつ描いている所をたまに見かけますが、この方法を使えばその作業をスキップ出来るので時間を大幅に短縮できます。

オマケに手描きで描くよりシャープできれいな線が作れるので一石二鳥。
特に機械系モデルでは結構使えると思います。

なお、このシェーダーにはMentalray専用ノードが含まれているため、Mentalray以外ではレンダリングできません。

ダウンロード

ハードエッジシェーダー シーンファイル (ma: x64 2013)(右クリックで保存)

作成方法

シーンファイルがあるので要らないとは思いますが、一応作り方を説明しておきます。

▼シェーディングネットワーク
ハードエッジシェーダ チュートリアル01
  1. 上記のネットワークに必要なノードを全て作成する。
  2. mia_roundcorners.outValue >> layerdTexture.inputs[0].color 接続
  3. レイヤードテクスチャのアトリビュートで、接続したroundcornersのブレンドモードを「差の絶対値」に。
  4. layerdTexture.outColorのoutColorR, ..G, ..B をそれぞれplusMinusAverageのinput1D[0], ..[1], ..[2]へ接続。
    コネクションエディタではうまく接続出来ないので以下の様なスクリプトを使うと楽。
    // ノード名は必要に応じて変更
    connectAttr -f layeredTexture1.outColorR plusMinusAverage1.input1D[0];
    connectAttr -f layeredTexture1.outColorG plusMinusAverage1.input1D[1];
    connectAttr -f layeredTexture1.outColorB plusMinusAverage1.input1D[2];
  5. plusMinusAverageの操作を「合計」または「平均」に。
  6. plusMinusAverage.output1D を surfaceShader.outColorR, ..G, ..Bへそれぞれ接続。
これで完成です。

基本的な仕組みとしては、mia_roundcornersでハードエッジ部分のバンプ法線を出力。
法線にはマイナス値が含まれるので、layerdTextureの差の絶対値で全てプラスへ補正。
plusMinusAverageでRGB各値の平均値を取り、グレースケール化する。

というような感じです。

因みにグレースケール化でplusMinusAverageを使うのは、luminanceではRGB各値に重み付けが行われる為、完全な平均値のグレーにはならない為です。
ここで「操作」を「合計」にするとより濃いエッジが、「平均」にすると薄いエッジが出力されます。

また、roundcornersのRadiusパラメータでも線の太さをコントロールできます。
Radiusを上げれば太い線が、下げれば細い線が出力されます。

このへんは要調整です。