Substance Designerのディザノイズ削除

Category : CGTips · No Comments · by 2月 22nd, 2020

SubstanceDesignerのテクスチャですが、実は書き出すときに自動的にディザノイズがかかるという仕様になっています。
これは書き出して8bitテクスチャに落とし込まれたときのマッハバンドを抑えるための仕様なのですが、作成するものによってはひどく邪魔なときがあります。
今回はSubstanceDesignerで書き出す際のディザノイズをなくす方法について書きます。

ディザノイズはなぜ必要か?

まず、なぜ自動的にディザが入るという使用になっているのかについて解説します。

わかりやすいのがPerlinNoiseのように滑らかなグラデーションを持つテクスチャです。

SubstanceDesignerは内部的に32bitの深度を扱えるので非常に滑らかなグラデーションに見えるのですが、書き出す際にゲームなどで扱いやすいように8bitに変換するとマッハバンドが目立ってしまいます。

※ 正確にはこのような階調不足で発生する擬似輪郭をマッハバンドと呼ぶのは間違いです。トーンジャンプと呼ぶほうが意味合い的には合っていますが、なかなか言葉が通じないのでここではあえてマッハバンドと読んでいます。

このように階調不足を補うためにディザノイズを加えることは、CG屋的には慣習的に行うことですし複雑な絵の場合は気にならないので、デフォルトで有効になっているというのは気の利いた機能だということもできます。

ディザノイズが会って困るデータとは?

色情報のようなものは概ね問題がないのですが、SubstanceDesignerではそれ以外の、例えばUVを変異させるデータを作りたくなることもあります。

例えばこのようなデータです。

ここでやりたいことはグリッド状にUVを変異させるデータなので、各セルの中身が均等に塗りつぶされていなければならないということです。

当たり前ですが、SubstanceDesignerのInfomationWindowで表示しても、値に特に問題がありません。

ところが書き出した画像をPhotoshopでみてみると、一見同じ色に見える部分でも微妙に変化があります。これがディザノイズの悪影響です。

ディザノイズをなくすには?

結論からかくと8bitでエクスポートするときにディザをなくすというオプションはありません。

ですが逆に、8bit以上のテクスチャであればディザは入らないという仕様になっているので、設定を行えばディザのないテクスチャを扱えます。8bit以上のデータを書き出すためには複数の設定を変更する必要があるので気をつけてください。

outputノードの設定で8bit以上のデータを選択します。

書き出し設定で、フォーマットを8bit以上のデータを扱えるものに変更します。(TGAは8bitのみです)

outputノードの直前のノードで、OutputFormatを8bit以上に変更します。

以上になります。
ディザノイズは便利なのですが、仕様を知らないとハマることがあるので気をつけましょう!

チュートリアルやってみた1

Category : CGTips · No Comments · by 2月 17th, 2020

Creating Procedural Modular Level for Unreal Engine
https://www.udemy.com/course/draft/2503572/

UdemyのHoudiniチュートリアルをコツコツ進めます。

Houdiniでパスを書いただけで自動的に迷路を生成してUnrealEngineに最適な状態のモッシュを作るらしいです。
通路部分の生成の途中まで。角の判定はでき、角が外向きか内向きかをこれから取得しようというところです。

NormalMapを含む形状のベイクについて

Category : CGTips · No Comments · by 9月 18th, 2019

今回はNormalmapを含むメッシュを、UVを変更したメッシュにベイクして再利用する手段について記事を書きます。

ごく稀にですが、テクスチャ付きローポリモデルを編集して、別のモデルを作成するという作業が発生します。ゲーム制作では、雑魚モンスターのモデルを編集して別のモンスターにするといった作業がこれまでも多くありました。

かつては比較的単純だった仕事ですが、NormalMapを使用した場合、少しややこしい仕事になります。というのも、使いまわすときにテクスチャの向きなども変更したくなるものなのですが、BaseColorやRoughtnessはベイクすれば問題ないのですが、Normalmapに関してはそうはいきません。UVを回転させるとTangentとBinormalも同時に回転するため、回転に合わせた異なるNormalmapが必要になるからです。

Normlamapを回転させて使うにはいくつか方法があるのでご紹介します。

1.Photoshopを使う

一番単純な方法はPhotoshopを使用して赤成分(Tanget)と緑成分(Binormal)を入れ替る、もしくはそれぞれの値を反転するなどの編集を行う方法です。ただし90度よりも小さな単位で回転した場合にはお手上げです。

2.SubstanceDesignerのRotateTangetを使う

SubstanceDesignerのNormal Vector Rotationを使用すると、90度以外の角度にも回転できます。回転であればほぼ対応できます。

3.XNormalでBaseTextureをベイクする

上記2つの方法でも対応できるケースは多いのですが、UVを自在に回転させつつUVアイランドの結合をおこなってしまったようなケースでは、フェイスごとにタンジェントが代わってしまっているため対応できません。

そこでXNormalを使ってテクスチャをベイクする方法が使えます。

このようにUVを大幅に変更してみました。

変更前のモデルにタイヤ跡のような模様をつけました。こちらはHeightで作成したため、UVが切り離され異なった方向に回転している場合でも、ちゃんとつながってみえます。UVの向きが異なるので、Normalmapをみた場合には色がつながって見えません。

Mayaのマップの転写などの方法でNormalmapの値をそのままベイクした場合には、このように違う角度からライティングされたような結果になり、つながらないです。

そこで、XNormalを使用してベイクします。XNormalにはBase Texture to Bakeという機能があります。これはハイポリメッシュ(ベイクのソース)にテクスチャを割り当て、ローポリメッシュ(ベイクされるメッシュ)がそのテクスチャを拾うというものです。Mayaでいうマップの転写で拡散をベイクしたような状態で、ローポリメッシュはハイポリメッシュのカラーなどの情報を素直に拾ってくれます。

このBase Texture to Bakeという機能には、さらにBase Texture is a tangent-space normal mapというオプションのチェックボックスがあります。こちらを有効にすると、ハイポリに使用したテクスチャはTangentスペースのNormalmapとみなし、なおかつtangetの変化(UVの変化)に伴ってnormlamapを補正してベイクしてくれます!

Base Texture is a tangent-space normal map を有効にしてみました。
UVを大幅に変更してもNormalも正しくベイクできます。

同じくBase Texture is a tangent-space normal mapを有効にしたもの(右)、無効にしたもの(左)の比較です。
有効にした場合、モデルのUV(タンジェント)に合わせてNormalを再計算し、つながるようになっているのがわかります。

情報提供者はいたうさん(@t_itau)、MINOさん(@MINO_8601)でした。
ありがとうございますー!!

SubstancePainterで正しいcurvatureをベイクする

Category : CGTips · No Comments · by 9月 9th, 2019

curvatureとはどんなデータか?

curvatureとは曲率を表すデータです。
曲率に従って決まり、グレーの値は平坦であることを表し、暗くなるほど凹面、明るくなるほど凸面であることを表します。

曲率を表すので正しく生成できれば以下のような挙動になります。

  • 平面は全ての箇所で全く曲面がないのでニュートラルなグレーになります。
  • 球体は全ての箇所で均質な曲率ですので偏りのない明るさになります。(ニュートラルなグレーよりも明るいです)
  • 角丸キューブの場合、エッジが曲がり始めると一定の曲率になりますが、角は3面に曲がるのでより曲率が高いため明るくなります。
  • 小さい球体はより鋭い曲面といえるので、小さいほど明るくなります。

ベイクの準備

では実際にベイクを行いたいと思います。
正しくベイクするためにモデルのUVと頂点の法線の設定を行います。
ローポリゴンのエッジが90度のメッシュになる場合、ハードエッジの設定にしてUVを切り離す必要があります。この設定によってUVの向きが異なるが箇所を違う値をベイクできるようになり、Normalのシームが出なくなります。
ベイクする際のUVと頂点法線の設定はリンク先の画像がわかりやすいです。

https://forum.substance3d.com/index.php?topic=16416.0

今回はテストなので比較的シンプルな角丸キューブを作りますが、 すこしだけいじわるをしてUVは斜めに傾けておきます。

ベイク設定

データができたのでベイクしてみます。
デフォルト設定ですがで、データが単純なこともあり、Curvature以外はおおむね問題ないです。

問題のcurvatureですが、UV境界に均一な線が入ってしまいます。

ここからが本題です。なぜこんな線が入るのでしょうか?どうやったらこの線はなくなるのでしょうか?

この線の正体はCurvature Baker parameterのEnable SeamとSeams Intensityの設定です。Enable SeamがONになっているとき、Seams Intensityの強さで線を描画します。

Enable Seamのチェックを外すことで線は消えますが、やや隙間が目立ちます。そういった場合にはCommon ParameterのDilation Widthでベイクしたときの延長の幅を変えることで緩和されます。

もしくはSeams Intensityの値をいい感じに設定してなじませることで緩和することもできます。

そもそも、なぜ隙間なくベイクできないのでしょうか?

それはSustancePainterのCurvatureのベイクが、ローポリとベイクされたNormalを使った簡易的な処理だからです。

Enable Seamは癖のあるパラメーターですが、デフォルトでONになっているのは、エッジのシーム付近は角になることが多いので、ベイクの甘さをこれで誤魔化すためについているものだと思います。

SubstanceDesignerを使用する

ちなみにおなじSubstanceシリーズのSubstanceDesignerにはcurvatureのベイクの設定が二種類あります。

ひとつはCurvatureで、こちらの設定はSubstancePainterと同じものです。(ただし、より明示的にNormalMapを指定する必要があります)
もうひとつはCurvatureMap from Meshというもので、こちらはハイポリを使用してベイクを行うため、より正しくベイクを行うことができます。 角の明るさもはっきりと出ていますね!

CurvatureMap from Meshは便利ですが、万能というわけでもないようで、球体をベイクした際にはシワのようなものが出てしまいました。こちらはまだパラメーターを追いきれていないのですが、UVの変形度合いに影響するようです。( CurvatureMap from Mesh についての説明が、なぜかマニュアルに載っていないんですよね…)

SubstancePainterのフィルタの作成手順

Category : CGTips · No Comments · by 9月 4th, 2019

おひさしぶりですこんにちは。
今回はSubstancePainterのフィルターの作成手順について書きます。

SubstancePainterのフィルターを作れるツール

SubstancePainterのフィルター、ジェネレーター、シェイプなどもデータの形式はsbsarです。
これはSubstanceDesignerで作られたファイルですが、アーカイブされているのでノードを編集/閲覧することはできません。SubstanceDesignerとSubstancePainter、Achemistで使用することはできます。

SubstancePainterのフィルターとジェネレーターの違い

似たような機能ですが、意識していないと混乱するのでまとめておきます。

フィルターとは、主にマスク情報に対して使い、下のエフェクト(マスク情報)に対して影響を及ぼすものです。例としてブラーなどが挙げられます。

ジェネレーターとは、メッシュのトポロジに基づいてマスクを生成する機能です。マニュアルにはこのように書いているのですが、もう少し正確に言うとベイクされた各種マップを基にマスクを生成する機能です。そのため正しく使うにはあらかじめべいくを行う必要があります。例としてDrippingRustなどがあげられます。

フィルターの作り方

フィルタを作るには新しいグラフを作るときのテンプレートからPainterFilterを選びます。Emptyを選び、自分で作ることもできるのですが、プリセットで必要なノードが用意されているので使うと便利です。

作成すると下の画像のようにinputとoutputのノードが配置されたグラフが現れます。
inputで下のエフェクトを受け取り、outputで出力されるので、この間に処理を加えるとフィルターとして機能します。

今回は簡単に下のエフェクトに応じて星を表示するだけの機能を作ります。
TileSamplerを作りTileInput1にStarノードで作った星をつなぎ、PatternDistributionMapにPerlinNoiseをつなぎます。PerlinNoiseは後でInputに差し替えますが、確認のためにおいています。このままではTileSamplerでInputやPatternDistributionMapを使用してくれないので、PatternやPatternDistributionInputの設定を変更します。

設定ができたら、今後はある程度の調整機能を持たせたいので、 Scaleの設定などをExposeしましょう。Exposeした値はSubstancePainterから変更できます。

パラメーターのExposeができたらTileSamplerのPatternDistributionMapにInputをつなぎなおします。

最後に書き出し設定です。Explorerで.sbsarファイルとしてパブリッシュします。

出来上がったフィルターをSubstancePainterにインポートします。ドラッグするとダイアログが現れるので、種類はFIlterを選んでください。テスト中はインポート先をCurrentSessionにしておくとよいでしょう。

さっそく使ってみましょう。
何か適当なマスクを作りその上にフィルターを作成します。フィルター一覧に先ほど作成したSBSARファイルが見えますので選択します。

このように作るだけなら、非常に簡単にフィルターも作成できます!

UE4マテリアルの変数名の命名ガイド

Category : CGTips, UE4 · No Comments · by 12月 18th, 2018

おひさしぶりですこんにちは。

最近はお仕事で、UE4のマテリアルなど変数名を決める機会が増えてきました。

ですが、アーティストがこういったものの名前をつける機会は過去にはほとんどなかったことや、エンジニア向けにはネーミングルールはあるけれど使う用語がかなり違うことからそのままは転用しにくく、また日常的に使用するDCCツールのネーミングルールのパターンも様々であることから、わかりすい名前ってなんだろうとよく考えています。

わかりやすい名前をつければ怖がらずに使ってもらえますし、ドキュメントを書く手間を省けることもあるかもしれません。

今回、名前の付け方を以下のように統一してみようと考えました。

部位+(状態)+(影響を及ぼす要素)+数学的用語

括弧は省略可能
例 : BrickHeightRenge
例 : RustColor

【部位】とはマテリアルが複数の素材感を持つときにどこに影響を与えるかということです。例えば壁マテリアルの『レンガ』に影響を与えるといったことです。
【状態】とはその変数がマテリアルのどういった状態に影響を与えるのかということです。例えば壁マテリアルの『汚れ』に影響を与えるといったことです。
【影響を及ぼす要素】とはその変数がマテリアルのどのパラメーターに影響を出すのかということです。例えば壁マテリアルの『アンビエントオクルージョン』に影響を与えるといったことです。
【数学的用語】とはその変数がマテリアルのどういった状態をどうするのかということです。例えば壁マテリアルの汚れの『強さ』に影響を与えるといったことです。

数学的用語という名前の付け方はどうなんだというツッコミはナシでお願いします>< (いい言葉が浮かばなかった)

 

ほかには以下のことに気をつけるように心がけています

  • 実装ベースではなく具体的な効果で名前をつける
    例えば、TextureにMultiplyしている変数に対し、TextureMultiplyのような名前をつけることをやってしまいがちなのですが、そこは一呼吸おいて、これは汚れのテクスチャを強くするためにMlutiplyしているんだというところまで考えて、DirtIntensityのような『具体的な効果』に落とし込んだ名前をつけてあげると、使う人にとって優しいものになるのかなと思います。
  • キャメル法に統一
    UE4に倣ってキャメル記法(単語の頭が大文字)で統一します。そのためAOなどの通例として大文字で使われるものでもAoと表記して区切りをわかりやすくします。
  • グループを使う
    マテリアルが大きくなった場合、アルファベット順のソートだけに頼るとわかりにくいので、グループも積極的に活用します。個人的にはSortPriorityまで使うと管理が大変なので使ってないです。
  • なるべくなら20文字程度に収める
    ぱっとみてわかってもらえるくらいの文字数に抑えたいですね。20文字という制限に特に意味はないですが。
  • (将来的には)部位も省略できるなら省略する
    いまだと一つのマテリアルがレンガと木を持っているときに、BrickHeightRengeなどの名前を付ける必要があるのですが、あやゆるものにBrickとつけるのでなかなか取り回しが悪いです。将来的に実装されるレイヤードマテリアルを使えば部位ごとにマテリアルレイヤーを分けられます。そうなるとマテリアルレイヤー側にBrickという名前をつけてしまえるので、変数名もそれなりに簡潔になるのかなあとおもいます。
  • 触ってほしくない場所はなるべく定数+コメントにする
    マジックナンバーはあまり推奨したくはないのですが、マテリアルの場合、UVの中心をとりたいので0.5を足すなどのように、特にいじってほしくもない数字を決め打ちで入れることが多くあります。そういったものはなるべく定数化してコメントを入れておくと後で便利です。

用語集

個人的によく使う英語を集めてみました。

状態を表す用語

英語
日本語
Dirt ほこり(による汚れ)
Moss 苔(が生えた)
Moisture 湿り気
雨だれの表記として見かけたことがあるのですが、英語的に正しいのかは不明
Weathering 風化 BrickWeatheringIntencity
Crack ヒビ
Scratch ひっかき傷
Rust さび

影響を及ぼす要素

基本的にはMaterialの基本パラメーターのままですが、省略したりや例外的な書き方をしているので明記しておきます

英語
日本語
Color BaseColorの略
Rough Roughnessの略
Metal Metallicの略
DetailNormal
Wpo WorldPositionOffsetの略 GlassWpo
Ao AmbientOcclusionの略
Pdo PixelDepthOffsetの略

数学的用語

英語
日本語
Texture (どんな)テクスチャ(を貼るか) CrackTexture
Scale 大きさ
Max 最大
Min 最小
Intensity 強度
Amount
Frequency 頻度
Offset オフセット
Ratio 割合
Position 位置
Spread ひろがり AoSpreading:AOがどの程度広がるか
Shift ズレ HueShift

3DCoatで3Dプリント用データを作る~カラー石膏編~

Category : CGTips · No Comments · by 5月 25th, 2015

3DCoatでモデルデータを3Dプリント用データにするまでの手順解説を書きました。

3DCoatで3Dプリント用データを作る(カラー石膏編) from kurosaurus

UE4 読み込んだモデルのサイズや向きが異なっていたら

Category : CGTips · No Comments · by 3月 9th, 2015

UE4でモデルを読み込んだ際、使用しているDCCツールによって軸やサイズの扱いが異なるため、作った通りの方向を向いていなかったり、サイズが10倍単位で異なっていることがあると思います。
そういった場合、モデルの再インポートの変換オプションを使うことで簡単に修正できます。
(スケルタルメッシュでもスタティックメッシュでも可能です)

3D-Coatざっくり解説

Category : CGTips · No Comments · by 2月 15th, 2015

3DCoatの全機能をざっくり紹介するというスライドを作成しました。

3D-Coatざっくり解説 from kurosaurus

Bitmap2Materialで写真から簡単物理マテリアル

Category : CGTips · No Comments · by 12月 2nd, 2014

今回はUnreal Engine 4 (UE4) Advent Calendar 2014の3日目の記事です。

Bitmap2Materialというツールを使用して、写真から簡単に物理ベースのマテリアルを作成する方法について書きます。

物理ベースのマテリアルとはなにかということについては以下に詳細が書かれています。

Unreal Engine | 物理ベースのマテリアル

物 理ベースのマテリアルとは、簡潔に言えばエネルギー保存の法則に基づき、入射光と出射光とで光のエネルギーの総和が等しくなるように設定されたマテリアル です。物理ベースという言葉を聞く前から、デフューズが明るいマテリアルにはスペキュラの値を入れ過ぎないようにしたり、デフューズの値を0.8以上は入 れないようにしていた方は多いと思います。「入射光と出射光とで光のエネルギーの総和が等しい」というとなんだか難しいですが、リアルな絵をつくろうとし た際にある程度自然にやっていたことなんですね。

物理ベースに基づいたマテリアルを使用すれば上記のサイトのサンプルのようにリアルな反 射 表現を使用した絵を作れるようになることもさることながら、CG屋さんにとっての一番の恩恵はどのようなシーンでもマテリアルの再調整を行うことなくライ トの設定で対応できるということだとおもいます。また物理ベースのマテリアルはすごい勢いで標準化が進んでいるので、UE4などのゲームエンジンにかぎら ず、Maya,Maxなどの統合ソフト、3Dペイントツールなどで全く同じ結果が得られるというありがたい環境が整いつつあります。

しか し 物理ベースのマテリアルは、接続されるテクスチャがかなり整理されているとはいえ、BaseColorとRoughnessが必要で、質感表現には NormalMapも欠かせないので、それだけのテクスチャーを作るとなると結構な作業量なんですよね…。なおかつスタッフがおのおの見た目で明るさを合 わせるのではなく、物理的に正しい値を入れるとなると、これまで陰影もデューズカラーに描きこんでいたCG屋さんにとっては、なかなかハードルが高いので はないかと思います。

そこで今回は写真一枚からBitmap2Materialというツールを使用して、陰影を除去した BaseColor の作成とRoughnessとNormalMapの作成を行い、物理的に正しいマテリアルの計測値に(なんとなく)合わせて、簡単に物理マテリアル(っぽ いもの)を作る方法について書いてみたいと思います。

Bitmap2Materialは以下から購入できます。UE4やMaya,Max等に自動で書き出す機能を制限したインディー版は5000円程度で購入できます。登録が必要ですが体験版を落とす事もできます。

Bitmap2Material | Image to Material Generator | allegorithmic

※ Steamでも時々セールを行っているので、少しでも安く手に入れたいという方はセール期間中に覗いてみるといいでしょう。
では制作方法に入ります。