2014年12月27日土曜日

マスクの形状を複雑化する方法

Twitterで少し書いた内容をこちらにまとめておきます。


解像度の低いテクスチャのマスクや頂点数の少ないVertexColorなど、
ぼんやりボケたグラデーションのブレンドはクオリティが低く感じます。

そんな時に使える、複雑な形のマスクの形状を作成するノードの組み方テクニックです。



VertexColorのマスクを複雑にする

岩の地面の上に草が生えているような箇所をVertexColorBlendで表現したい場合、
VertexColorだけの表現では自然に草が生えているように見せません。


岩の亀裂にそって草が映えるようにすると、
自然に草が生えているように見せることが出来そうです。


2014年12月25日木曜日

BCORE v2.0 Alpha2の読み込み方

WorldMachineで使えるマクロです。
地形に対していい感じのカラーテクスチャを作成することができます。

設定方法の備忘録として書きます。
マクロを使って見たかったけど断念した方が入ればこれを機会にまた挑戦してみてくださいませ。


詳細はPolycountのフォーラムにて。




2014年12月22日月曜日

UE4背景アーティスト勉強会 in 大阪 報告

スライドの加筆や動画の調整などで公開がおそくなりました。

12月14日(日)に大阪工業大学 うめきたナレッジセンターにて行われた
UE4背景アーティスト勉強会で使用したスライドに加筆をしたものと、
勉強会の時の動画をアップしました。


思ったよりも背景アーティストの参加人数が少ない印象ではありましたが、
おおむね好評だったようでよかったです。
自分の声を聞くと怒っているような声で怖いですね…(^_^;)
こわくないですよ~こわくないですよ~。 


このように公開するとちょっと恥ずかしい気持ちではありますが、
皆様のお役に立てれば幸いです。

これをきっかけに様々な方とワークフローについて色々お話したいと思っていますので、
ご意見、ご感想などありましたらぜひ送ってください。

また、私もまだまだ勉強中の身ですので、誤り等ございましたら、
ご指摘よろしくお願いいたします。


2014年12月16日火曜日

【AdventCalender】プロパティマトリクスについて

Unreal Engine 4 (UE4) Advent Calendar 2014に参加してみました。

毎日有志の方がUE4にまつわる様々な情報を公開してくれるというありがたい企画です。
皆さん素晴らしい様々に作ったものを公開しているというのに、
私ときたら地味にプロパティマトリクスという機能について解説するとか…。




まず、プロパティマトリクスってなんぞ?
から始めたいと思います。


2014年12月4日木曜日

PBRの種類

先日TwitterでPBRの話題が出ていましたので、
ちょっとまとめてみました。


PBRの基礎的な考え方は2012年のSQEXオープカンファレンスの内容が
個人的にはすごくわかりやすかったのでまだ見てない方は参考までにどうぞ。

insideGamesの記事



(補足)
この資料は物理ベースをわかりやすく解説している資料になるので、
厳密には金属もフレネル反射はしているのですが、ほぼ視認できないので、
フレネル”しない”という言い方になっています。

また、非金属も鏡面反射に色がつかないと書いてますが、
色がついてるものもあると考えられます。


今回はわかりやすく理解してもらいたいのでこの表の言い方で進めますが、
正確に言うと金属もフレネル反射はするし、非金属でも色付きの反射をするものもあります。


2014年12月2日火曜日

UE4のReflectionについて

UE4のReflection(反射)について調べてみたことをまとめてみました。

反射については公式ドキュメントに解説ページがあります。
【公式】反射環境
【公式】反射の事例


ふんふん、なるほど…ではあるのですが、
ちょっと理解ができなかった部分もあるのでテストしてみました。



テストで使用したレベルは以下の様なもの用意してみました。



このシーンにはReflection Captureは配置されていません。
しかし、自動的に反射が計算されています。

これは何で計算されているのかというと、
Screen Space Reflectionで計算された結果です。


2014年12月1日月曜日

NormalMapをベイクする時の知識 その2 (追記)

以前紹介したNormalMapをベイクする時の知識 その2で紹介したNormalの歪みの解決方法ですが、
Polycountにもっとスマートな解決方法が掲載されていましたのでこちらに追記しておきます。



以下に動画を貼りますが、限定公開とのことなので削除されてしまうかもしれないです。

3dsmax


Xnormal


2014年11月30日日曜日

【告知】UE4背景アーティスト勉強会 in 大阪

大分告知がおそくなりましたが、背景アーティストに向けたUE4の勉強会が開催されます。
恐れ多いのですが、私が発表者としてお話をさせて戴くことになりました。


■UE4背景アーティスト勉強会 in 大阪

2014/12/14(日) 13:00~17:00
大阪工業大学 うめきたナレッジセンター
(大阪府大阪市北区大深町3番1号 グランフロント大阪ナレッジキャピタル タワーC 9階)
 
https://atnd.org/events/59189


中に記載がある通り、内容は背景のワークフローに関する事になります。

UE4の勉強会でなぜこの題材なのかというと、
UE4は海外が作ったゲームエンジンなので、
海外で使われているワークフローが前提に設計されています。

海外のワークフローと言うのはすごく工程がしっかりしています。
しかし、日本の開発現場にはこの工程が明確に定義されていないというのが私の印象です。

2014年11月21日金曜日

NormalMapをベイクする時の知識 その4

そろそろNormalについても書くことも少なくなってきました。
書く事がないわけではないですが、大分細かい部分になってきたという感じですね。

Normalのベイクの方法にこれをやれば全てOKという方法はなく、
ケースバイケースの事例が多すぎるので説明するのもちょっとむずかしいものです。


今回はNormalをベイクする時に知っておくと、よりよいNormalを作成することができます。
ちょっとしたことですが、クオリティに差が出てきます。



角度をつける

溝や凹みなどをHigh modelで作成するときに90度でそのまま凹凸をつけたりしていませんか?
凹凸情報を認識するためにNormal mapは数ピクセルの情報が必要になります。

下はその例です。
左側は90度、右側は少し角度をつけて凹みを作成しています。








 これはNormalが貼ってある状態です。
左側に比べて、右側のほうがしっかりと凹んでいるのが確認出来ると思います。

Normalmapはこのような感じです。




角をシャープにしすぎない

ハードサーフェスモデリングで作ってたりすると、ついつい角をシャープにしてしまいがちです。
角をシャープにした時にどのような問題があるかというと、
テクスチャにmipがかかってきた時にエッジの部分にジャギーが出てくるというもの。

遠くでも綺麗に見えるNormalMapを作成しておくに越したことはありません。
下図はPolycount wiki より転載した画像ですが、
これを見るとわかるようにmipがかかるほどジャギーが入ります。

mipの最低解像度の設定によって緩和できるかも知れないですが、
表示エラーの原因は基本的に避けておく方が良いと思います。

ちょっと画像の品質があまり良くないのか見づらいかもしれないですね…



その1~その4までの内容を意識しながら作れば、大分失敗もなく、いい感じのNormalが作れるようになるのではないでしょうか。



2014年11月7日金曜日

NormalMapをベイクする時の知識 その3

今回は円柱形のベイクで起きる波型の問題についてです。

参考にしたサイトはこちら
【Polycount】Understanding averaged normals and ray projection/Who put waviness in my normal map?


波型の問題って何?


円柱形のモデルからノーマルマップをベイクした時に一定の角度から見ると綺麗な円が見えるが、
真横から見ると上下の部分に波型の形が見えてしまう問題です。



2014年10月31日金曜日

NormalMapをベイクする時の知識 その2

その1ではNormalをベイクするためのソフトエッジ、ハードエッジについて書きました。
今回はその結果を踏まえて新たに出てくる問題の解決方法について記述してあります。

(追記)
別の方法でも歪みを解決できる事がわかり、追記しました。
NormalMapをベイクする時の知識 その2(追記)


角付近にある形状が歪む問題の解決方法


ここではUDN-法線マップの加工の内容を実際にテストしてみたいと思います。
(わざわざ同じようなモデルを作成してみました…)

これは、角付近にある形状が歪んでしまう問題の解決方法です。


その1のEの方法を踏まえて、下図のようなHighModelのNormalをベイクしてみたいと思います。
LowModelの法線は複数のスムージンググループを使用しており、
それにあわせてUVを切り離してあります。
(実線はハードエッジ、点線はソフトエッジです)



NormalMapをベイクする時の知識 その1

いつまでたってもうまくNormalmapが作成できないので、
自分が勉強したNormalのベイクに関する情報を少しずつまとめてみたいと思います。

知識を得るたびに少しずつ更新して内容を充実させたいです…(^_^;)

ここで掲載するNormalMapはMayaのマップの転写を使用してベイクしたものになります。



情報収集は主に以下のサイトから。
Polycount Wiki NormalMap
UDN-法線マップの加工


ソフトエッジとハードエッジ


NormalMapをベイクする時の基本はローモデルを単一のスムージンググループ(全てソフトエッジ)にすることです。
しかしソフトエッジだけではきれいにベイクできない場合があります。

基本的なルールとしては

90度ほどの角度がつく場合その箇所はハードエッジにして、UVを切り離す
 それ以外はソフトエッジにする。

2014年10月15日水曜日

Object PositionとActor Position

ObjectPositionとActorPositionの違いについて調べました。

一見似たような機能になるのですが、異なるのは取得する座標位置が異なります。

ObjectPosition… アセットのバウンティングボックスの中心の座標位置を取得。
ActorPositon … アセットの基点の座標位置を取得。

マテリアルを使って違いを確認してみましょう。


2014年10月8日水曜日

WorldPosition(絶対ワールド位置)

AbsoluteWorldPositionノードについて勉強してみました。
日本語の名前にするとなんか… いや、いいんですけどね。


WorldPositionノードはその名前の通りワールドの位置を示してくれるノードです。
ワールドの位置とはどういうことなのかを確認してみます。


2014年10月5日日曜日

PixelNormalWSとVertexNormalWS

PixelNormalWSとVertexNormalWSについて少し調べてみました。

pixelのNormal情報まで計算するか、VertexだけのNormal情報を計算するかが大きな違いかなと。


WorldSpaceについて

まず、この2つのノードの最後にはWSの表記があります。
これはWorldSpaceの略です。

VertexNormalWSをEmissiveに接続してみます。


ビューでは以下のように、球体を8方向に分割し、それぞれに色が割り当てられています。
(ちょっとgifが汚いですが…)


これはメッシュに対して、ワールド空間の座標を示しています。
ワールドの座標はgifの左下に出ているものです。

[Tips]NormalMapのGチャンネルが反転する問題の解決

先日Substanceテクスチャワークフローのセミナーに参加したところ、NormalMapの反転の解決方法について知ることができたので、追記をさせていただきます。

多分、これが一番正しい修正方法。
元の投稿も何かの役に立つと思うので残しておきます。

NormalMapが反転する原因はベイクした環境はOpenGLかDirectXかによって異なるそうです。
これを3DViewの設定で変更することができます。

Materials>Default>Edit で3DViewの設定画面を開きます。


デフォルトではDirectXがTrueで有効になっています。



2014年10月3日金曜日

sineについてお勉強

今回はSubstance Designerではなく、UE4のMaterialについてです。

UE4には様々なサンプルが付属されており、マーケットプレイスからダウンロードが可能です。


Materialの数学的なことに関するお勉強をしたい場合は、
Contents Exampleに入ってるMath_Hall.umapを使うと良いです。

このようにたくさんの数学処理のサンプルがあります。
また、ひとつずつノードの解説があるのと、
それを使ってMaterialでどのような表現ができるかのシンプルな例もあるのでわかりやすいです。



それで最近学んだ事を少し備忘録的に残しておきます。
(私はまだ半分ぐらいまでしかみてないですけども…)


sine

sine, cosine, tangentって昔この3つをセットで学んだ記憶がありますが、
このsineはMaterialでよく見かけます。


sineとは-1~1の間を反復している波形のグラフです。
Googleでsin(x)と入力して検索するとこのように波形グラフが表示されます。
(ありがたい機能!!)



このノードの組み方の場合、後ろにTimeノードがついてるので、一定速度で時間が進みます。
つまり、この波形グラフでいうと、x軸に動くということですね。



Time と Sine をつないで返される数値はYの値になるので、
これをそのままBaseColorやEmissiveにつなぐと白から黒に周期的に変わるようになります。



なぜ白黒に変わるのかというと、ここで得られるYの値というのは-1~1の間で動く数値になります。
ConstantノードをBaseColorにつないだ時に0は黒、白は1になりますよね。

-1~1の値が周期的に得ることができるため、
色でみた場合黒から白へ変化し続けるということです。



DebugScalarValues

余談ですが、これを数値的にもっとわかりやすくする事ができます。
MaterialFunctionに DebugScalarValue というのがあります。


このノードを接続し、プレビュー表示にする、
もしくはBaseColorにつなぐと現在取得できている値を確認することができます。


数値を見ていると -0.9~0.9ぐらい (それ以下の数値は早くて見えないです) 
で動いてるのがわかりますよね。

数値で確認したい場合はこのノードを使うと便利です。
Scalarだけではなく、2~4Vectorもあります。




abs

カラーで表示した時に黒の時間が長く感じると思います。
それは0より下の値はカラーの場合0(黒)とみなされてしまうからです。

ここでつないでいるabsノードについて解説します。

absの意味は絶対値。
-の値がついたものを+にします。

-0.9 は 0.9
-0.333333 は 0.33333 


0より下に動いてたものがすべて+の方向になるので波形グラフは以下のようになります。



カラーの表示見ると少し黒くなってすぐ白くなるような緩急のついた変化を見ることができます。



ConstantBiasScale


absの代わりにConstatBiasScaleをつないでみます。

ConstatBiasScaleは入力された値(sineからの値)に
バイアスの値を加算してそれにScaleの値を乗算してくれるとのこと。
Biasが1でScaleが0.5であれば、-1~1の値を0~1に変換してくれるそうです。


つまり、受け取る値は0の場合、
0+1)/0.5 = 0.5

受け取る値が-1の場合
-1+1)/0.5 = 0

という計算をしてくれているということですね。



なかなか感覚的にわかりにくいですが、
これを使った場合の結果はこのような感じ。



0~1の周期で動いてるのが確認できますね。



このように後ろにつなぐノードを変えることで異なる動きを表現することができます。
更に様々な要素をかけていけばより複雑な動きも可能です。




数学はもうほぼ忘れてしまっているので、
Materialの勉強をしながら感覚的に理解を深めていきたいところ。

ブログにアウトプットしてみると自分も更に理解することができるので、
時間はかかるけど継続していけば複雑なのも作れるようになるのかしらね。(遠い目)




2014年9月30日火曜日

[Tips]作成したsbsファイルをライブラリに登録する方法

作成した金属塗装のグラフを今後も使い回しし易いように
ライブラリに登録してみたいと思います。



ライブラリのパスの追加

まずは、ライブラリに作成したsbsファイルを読み込ませるにはPrefarencesから設定が必要です。
Tool > Prefarences からひらき、Editorを表示します。

Libraryのところからパスを追加します。
パスはsbsファイルを保存するフォルダを指定します。



追加できたら、OKを押して閉じます。




sbsファイルの準備

テクスチャ制作中はライブラリのことなど考慮せずに作業をしていくと思うので、
以下のように新規でsbsファイルを作成し、
その中に制作したグラフをコピー&ペーストで入れます。

最初から作成されるグラフは削除し、リネームをします。
保存先は、先ほど指定したパスの中に保存します。




Attributesの設定/Filterの設定

グラフを選択し、アトリビュートを設定していきます。

設定できる項目は多いですが、私は以下の項目に登録しました。


Category
Label … ライブラリに表示される名前
Author … 作者の名前
Tags
Icon … ライブラリに表示されるサムネイル





















次にライブラリにフォルダを作成します。
フォルダから右クリックでEditを選択し、以下のように設定しました。



1つ目は、Author で Equal で自分登録した名前を入力します。
これで作成者が私のものを絞ることができます。

2つ目は Category で Equal で同様に登録した名前を入力します。

登録が完了したら☓をクリックして閉じます。
そしたらこのように表示されました。



アイコンの登録をしていない場合はDiffuseの情報が表示されるようで、
あまりわかりやすくないのでアイコンは手間ですが作成するのが良いと思います。

アイコンは3Dビューワー上で背景のキューブマップを非表示にし、
いい感じに見える辺りでスクリーンショットを撮り、
PSDファイルでアルファチャンネル付きで作成すればこのような感じで表示されます。

これは128*128のサイズで作成しました。




ライブラリが増えていくと少しテンションも上がるので
どんどん数を増やしていきたいですね~ヽ(=´▽`=)ノ

2014年9月29日月曜日

[Function]Contrastを設定

金属の塗装色の変更は設定できたので、
次はRoughnessの値を調整できるようにしたいと思います。

どうせやるならば経年変化のような表現がいいのですが、
さすがに色々なパラメーターをコントロールする必要があるので
今回はコントラストだけ調整できるようにしてみたいと思います。

正直これがなぜコントラストをコントロールすることになるのかはきちんと把握していません。

ただ、こう組むことでコントラストが調整できると
まずは覚える(メモしておく)のがよいかなと♪~(´ε` )


コントラストの設定

  1. まずは、FunctionのInput Parameterを作成します。

    IdentifierはContrastとします。
    Type/EditorはFloat 1にします。
    Minは-1まで入力できるようにしましょう。



    .
  2. コントラストを調整したいのは最後になるので、
    Outputの前につないでいるLevelに設定をしていきます。


    .
  3. Levelのパラメーターを見るとどこからFunctionをつないだらよいかわからないのですが、
    右上のValuesのところをクリックすることで作成することができるようになります。



    ここをクリックすると…



    見慣れたパラメーター画面に切り替わります。
    .
  4. 設定する必要のあるFunctionの数は4つあります。
    中身は似ていますが、すべて異なる設定を入れていく必要があります。
    ノードの組み方は以下のとおり。

    Level In Low


    Level In High




    Level Out Low




    Level In High



    Get FloatにはContrastを設定するのをお忘れなく!

    これは、カラーのコントラストでも同様に組むことで調整することができます。
    もしかしたらグレースケールのコントラスト調整だったら
    OutputはVector 4でなくてもよいのかもしれないですが、
    ノードの意味を理解していないので、そのまま組むしかありません(泣)

  5. このように組んだらあとは動作チェック
  6. Input ParameterのDefaultの値を動かしてみます。

    結果はこのような感じ。



  7. Roughnessテクスチャだけでみてもコントラストが調整できているように見えますね。



    以上で完成です。

Contrastは非常によく使うFunctionになると思うのですが、
もう少し簡単に設定できるようにならないかなと思うところ。




2014年9月28日日曜日

[Function]Colorを設定

グレネードのテクスチャを作成した時に使用した質感データを
他の場合でも使えるようにしたいなと思いFunction作成に挑戦です。

Instanceで使用するときにパラメーターを調整できるようにしておけば、
汎用がきくというものです。

作成した塗装された金属の質感はこのような感じ。





ノードもこれぐらいとあまり複雑ではありません。

今回調整できるようにしたいのは、
塗装されている色とRoughnessの値も調整できたらいいと考えています。



Colorの設定


  1. まずはInput Parametersを設定します。

    Input Parametersの+から追加します。
    Identifierは識別子でFunction作成するときの参照するパラメーターの名前になるので、
    わかりやすいのをつけておきます。

    今回はPaintColorと設定しました。

    次にType/Editorですが、ここでは色を設定したいのでFloat 3Color(RGB)を設定します。


    ここでColor(RGB)を設定しないとただの3つのパラメーターが出ているだけになり、
    調整はできるけど、非常に使いにくいものになってしまうので忘れないようにしましょう。
    .
  2. 金属の塗装色を設定しているUniform ColorからOutput ColorにEmpty Functionを作成します。
    .
  3. Functionは以下のようにノードを組みます。

    先ほど設定した塗装色の値を受け取りたいので、Get Float 3を置きます。
    そして、右側の値のところでVariables/Get Float 3にはPaintColorをセットします。


    次にFloatを配置し、Constant/Floatの値は1です。
    これはアルファチャンネルになるので1にしておくのがよいのだろうと思います。

    最後にVector Float 4に配置して、つなぎます。
    右クリックからSet as Output Nodeを設定します。


    これでひと通りのPaintColorのFunctionは完了です。
    .
  4. 最後にきちんと動くかを確認。

    新規のGraphを作成し、そこに作成したグラフをドラッグ&ドロップで
    Instanceとして読み込みます。



    パラメーターで自由に色を変えて反映されるかチェックします。
    こんな感じで問題なく色が変更できたのでOKですね。


    最後にInput ParametersのLabelやGroupなど使いやすいように設定したら終了です。



今回の工程で疑問がひとつ。

Vector Float 3ノードを配置してOutputにしてしまえば一番早いのでは?
と思うのですが、そのような接続はできないみたいなんですよね。

おそらくカラーはVectorで設定しないといけないというのと、
Vector Float系のノードにはInとLastというInputノードが付いているので、
必ず2つセットしないといけないんでしょうね。

そのためにVector Floatというのはなく、Vector Float 2,3,4の3種類になっています。

ここでVector Float 3を使うとするとGet Float 2とFloatを接続しなければならなく、
RGBではなくRGとBを別々に設定するというややこしいことになるので、
Vector Float 4を使うという風に自己解釈しています。

それでも、根本的なところでVector Floatが2つの値を受け取らなければならない理由はわからないので誰かご存知でしたら教えて下さい。



ブログはじめました。

日頃触ってるツールや背景制作に関する情報について、自分の知ってる範囲や自分の勉強をかねてアウトプットしていきたいと思います。

最近はSubstanceDesignerを試してるので備忘録の代わりにできたらいいかな。

内容が散乱しそうですが、ちまちま更新していく予定です。