UE4の勉強記録

UE4の勉強の記録です。個人用です。

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する  マップの作製 Part 5

f:id:kazuhironagai77:20210411224752p:plain

<前文>

<Matt Gaetz氏とアジア人への迫害について>

米国下院議員であるMatt Gaetz氏の児童買春疑惑は大変なスキャンダルですが、Foxニュースを代表とする宗教右派の人達から、彼に対する批判は全く聞かれません。宗教右派の人達は、アニメの絵にすらケチつける位、児童買春に対して厳罰を求めていたのですから、今回のスキャンダルには責任もって対処して貰いたいです。

しかし、残念な事ですが、宗教右派の人達は、自分たちの仲間が行ったと思われる児童買春疑惑を追及する代わりに、アジア人を迫害する事に熱心な様です。今、アメリカ国内におけるアジア人への暴行件数はウナギ登りです。

勿論、このアジア人への迫害には、韓国系と黒人が仲が悪い傾向があるとか、中華街からコロナが流行ったなどの根拠の無い噂などの理由もありますが、根本は宗教右派がFOX NEWSを使って流行らせた手法「事実じゃない事を、さも事実であるかのようにうそぶいて、だから差別や暴行しても良いとの論調に持っていく。」が主な原因です。

私は昔から主張していましたが、Foxニュースを代表とする宗教右派の連中が嘘を言っているのは全てのアメリカ人が知っていたのです。知っていたのですが、それによる被害者が自分達でないから娯楽として受け入れていたのです。それが今回、コロナや連邦議会での暴動によって初めて自分達に害が及ぶ可能性が出て来たので、宗教右派を切り捨てる事に決定したのです。

大体、キリスト教自体が、罪を犯してしまった自分を悔いてその罪を背負って生きる。と言う人間の内面の問題を扱った宗教なので、人間の外面を扱う政治問題に介入する時点で、その組織がカルト化している証拠でしょう。潰されても仕方ないと思います。

罪を犯してしまったと言えば、嘘をついている事は結構、罪深く感じます。しかし彼等にはそれが無かったのは何故なんでしょうか?

多分ですが彼らが通う教会で「嘘をつく事をキリストが望んでいる。」と洗脳していたんでしょうね。それで嘘をつく事に対して無感性になってしまったんでしょうね。

そう言えば、今、日本でもネトウヨとかjアノンとか呼ばれている一団がいます。彼らは、PCR検査は無駄と主張したり、特定の政治団体の人(例えば、先週出て来たSidney Powell氏)を嘘をつきまくって擁護したりし、又その逆に非難していますが、彼らもまたカルト化した宗教団体の信者なんでしょうか?

そんな気がします。

Matt Gaetz氏の児童買春疑惑について興味を持ったせいで、最近、Redditばっかし読んでいたんですが、何で全てのアメリカ人が、Foxニュースを代表とする宗教右派の連中が嘘を言っているの知っていたのか分かりました。彼らが嘘をついているのは何となく、彼らの顔や彼らの話を聞いている人の表情から推測出来たのですが、一つ一つの具体的な問題に対してどこまでが本当で、どこから嘘なのかまでは私には分かりませんでした。アメリカ人が一つ一つの嘘を見抜けたのはRedditで全部のニュースのトピックについて徹底的に議論しつくしていたからだったんです。

Matt Gaetz氏の児童買春疑惑についてもあらゆる角度から議論されていて大変勉強になりました。こんだけ一つのニュースに対して、みんなで議論したら嘘ならたちまちばれる訳です。

それでは今週も勉強を始めます。

<本文>

1.今週の予定

今週もLandscapeの勉強と作成を行います。以下の事を行います。

  • Displacement mappingの実装
  • 針葉樹用の緑と沼用の地面のMaterialの追加
  • 沼の整理
  • ゲーム内のlandscapeの作成。

今週でLandscapeの作成は終わらせられるように頑張ります。

2.Displacement mappingの実装

Displacement mapping を実装します。

2.1 Displacement mappingの勉強

取りあえず、Plane上でDisplacement mapping をやってやり方を完全に理解します。

Tutorialを探したのですが、これと言うヤツは見つかりませんでした。その中でこのTutorial(Easily Set Up Displacement Maps in Unreal Engine using Quixel Bridge)[1]が一番簡潔に、MegascansのDisplacement mappingの使用方法を説明していました。しかし途中でPolygonを増やしたplaneを作成するためにCinema 4Dを使用しています。この部分はBlenderで置き換える必要があります。

その後でlandscapeのDisplacementを作成します。取りあえず見つけたTutorialがこれ(How to Use Megascan Displacement for Landscapes in Unreal Engine 4)[2]です。

Blender からUE4にMeshをexportするのはどうしましょう?私はBlender2.8以降の新しいバージョンのやり方は知りません。このTutorial([New] Blender To Unreal Plugin!)[3]がBlenderからUE4へMeshをExportするやり方を説明していました。ざっと見た感じでは詳しく解説していそうです。

今のBlenderのバージョンを調べたら2.92が最新みたいです。昔2.80をdownloadした後、全く勉強していません。

Meshをsubdivideする方法さえ分かればそんな勉強する必要はないと思いますが、どうしましょう?この機会にBlenderの使用方法も勉強しましょうか?勉強するなら、2.92を入れた方が良いんでしょうか?

Tutorial([New] Blender To Unreal Plugin!)[3] ではBlender 2.83 を使用していました。ここで使用しているAdd-onであるBlenderToolが2.80に対応していれば、特に何もしなくても良いかもしれません。まあ最新のBlenderをここでDownloadしても別に良いですけど。

2.2 Easily Set Up Displacement Maps in Unreal Engine using Quixel Bridge[1]の勉強

先にこのTutorialを途中までやってから考えます。

使用しているTextureですが、MegascansからではなくGameTexture.comからBridgeにImportしてそれを更にUE4にexportしていました。

f:id:kazuhironagai77:20210411224910p:plain

そのやり方は前のTutorialを見てね。って。

あー。

凄い分かり易いと思ったのに。

しょうがないですので、前のTutorialである、Converting Your Favorite Render Engine Materials for Unreal Engine[4]を見たら、最初の5分で滅茶苦茶分かり易く説明されていました。例に使用されていたのはRd-Textures社からのdownload方法ですが、多分同じでしょう。

これなら出来そうです。

f:id:kazuhironagai77:20210411224932p:plain

あれ、無料じゃないの。

f:id:kazuhironagai77:20210411224946p:plain

フェエエー。

この人がTutorialを作成した時はFreeになっている。

f:id:kazuhironagai77:20210411225003p:plain

今はPremiumです。

ちょっと考えます。

他の会社のTextureをQuixel BridgeにImportしてそれをUE4にExportする方法は試してみたいです。

これがFreeなのでこっちで試してみます。

f:id:kazuhironagai77:20210411225019p:plain

Downloadしました。

f:id:kazuhironagai77:20210411225033p:plain

Quixel Bridgeを開きます。

f:id:kazuhironagai77:20210411225046p:plain

Converting Your Favorite Render Engine Materials for Unreal Engine[4]ではZipの状態でImportするよりは、開いてImportした方が良いと言っていますが、

面倒なのでImport Zip Filesでやってしまいます。

f:id:kazuhironagai77:20210411225100p:plain

f:id:kazuhironagai77:20210411225108p:plain

となっています。

f:id:kazuhironagai77:20210411225124p:plain

四角で囲ったMrao.pngだけImportしませんね。これは何なんでしょうか?

Metalness-Roughness-Ambient Occlusionの略だそうです。となるとこれもImportする必要がありますね。

以下の様に変更しました。

f:id:kazuhironagai77:20210411225139p:plain

Importします。

2kでUE4にexportします。

f:id:kazuhironagai77:20210411225155p:plain

普通に出来ました。

と思ったら、Tutorial([New] Blender To Unreal Plugin!) [3] でEnable Displacementにチェックを入れてからImportしろと言っています。

f:id:kazuhironagai77:20210411225214p:plain

更に、Quixel BridgeでもDisplacementにチェックが入っているかを確認しろとあります。

f:id:kazuhironagai77:20210411225232p:plain

もう一回Importし直しました。

Material instanceを開くと以下の様になっています。

f:id:kazuhironagai77:20210411225254p:plain

サンプルの様な銀ピカではないですね。

それはともかく、

以下のDisplacement Amountの値を変化させればDisplacementが起きるそうです。

f:id:kazuhironagai77:20210411225311p:plain

だいたい8くらいから以下の様に飛び出してきました。

f:id:kazuhironagai77:20210411225327p:plain

以上でした。

これはこれで知らなければならない事なのですが、Displacement mappingの実装 (implementation) についての解説、つまりBPの書き方についての解説が全くなかったです。

このTutorialでも述べられていましたが、MegascansからTexture をUE4にExportする時にMegascansがDisplacement mappingを実装したMaterial とそのInstanceを作成してくれるので、BPを敢えて触る必要はないからです。

これは、そのMaterial Instanceのパラメーターを調節して最適値を見つける事が仕事であるdesignerにとっては適切な勉強範囲ですが、ゲーム制作でEngineerになるためにUE4を勉強しているProgrammerにとっては正しくないです。UE4を使用したゲーム制作でEngineer を名乗るためには、UE4におけるDisplacement mappingの実装方法を知る必要があります。

ちょっと考えます。

後、おまけですがMaterialの実装を変更してもっと銀色にしてみました。

元のMaterialの実装を見てみたらMetalnessのoutputにRPGを使用していました。

f:id:kazuhironagai77:20210411225347p:plain

新しいMaterialを作成してMetalnessにR、RoughnessにGを接続しました。

f:id:kazuhironagai77:20210411225403p:plain

銀色に光りました。

f:id:kazuhironagai77:20210411225426p:plain

2.2 Displacement mappingのBP内における実装について

考えた結果、判明したんですが、確かにUE4におけるDisplacement mappingのBPの実装  (implementation) そのものについては勉強出来ませんでしたが、それ以外でUE4でDisplacement mappingを使用するために必要な事は全て勉強出来ました。

もう一つ大事な事を忘れていたのですが、先週、Displacement Mappingについて自分でまとめていました。

この内容を読み直してみたら、displacement mappingの実装 (implementation) 方法について書いていました。

これを復習します。その後で、Megascansが提供しているMaterial内でどのようにDisplacement mappingが実装されているのかを確認してみます。これで多分、UE4におけるdisplacement mappingの実装方法について勉強出来ると思います。

2.2.1 先週のBlogにおけるDisplacement mappingのまとめ

先週のblogにおけるDisplacement mappingは簡単でした。

MaterialのOutputは以下の様になっています。

f:id:kazuhironagai77:20210411225502p:plain

この中でDisplacement Mappingに必要なのは、World Displacement とTessellation Multiplierです。

この二つを使用するためには、以下の事をする必要があります。

f:id:kazuhironagai77:20210411225521p:plain

World Displacementはverticesの位置を移動させます。Tessellation MultiplierはLandscapeの表面のポリゴンの量をどれくらいにするかを指定します。

のでWorld Displacementの値を変化させます。

f:id:kazuhironagai77:20210411225608p:plain

Displacement Mappingが出来ました。

2.2.2 World Displacement とTessellation Multiplierについて

ちょっと古いですが公式のDocumentでWorld Displacement [5]とTessellation Multiplier [6]が解説されていました。

World Displacementについてですが、

f:id:kazuhironagai77:20210411225636p:plain

と書かれています。

Tessellationってポリゴン化する事でしょう?Tessellation Verticesってどういう意味なんでしょうか?ポリゴン化した後のVerticesを動かすと言う事なんでしょうか?

このサイト (What is Tessellation in computer graphics )[7] によると

f:id:kazuhironagai77:20210411225701p:plain

Tessellationとはポリゴン化するだけではなく、ポリゴンを更に細かく分割する行為も含まれるようです。

この意味から推測するとTessellation Verticesは、ポリゴンを更に細かく分割した際に生成された頂点を指すと思われます。

最初はポリゴン化した後のVerticesをTessellation Verticesというのではないかと予測しましたが、どっちが正しいのでしょうか?

What is Tessellation in computer graphics [7] のDragonseel氏の解答にほとんど答えが書かれていました。

彼の解答によるとTessellationはTessellation Control Shader, Tessellation Primitive Generation, そして Tessellation Evaluation Shaderの3つのShaderで行われるそうです。

そんなShaderは知りません。初めて聞きました。

それぞれのStageでは、

  • Tessellation Control Shaderでは、頂点を更に細かくするために、細分化のタイプと新しく作成する頂点の数を指定します。
  • Tessellation Primitive Generationでは、Tessellation Control Shaderで指定した条件で実際に細分化します。この過程はHardwareが勝手にやる為Programmerは関与出来ません。
  • Tessellation Evaluation Shaderでは、細分化した際に発生した新しい頂点を呼び出して色々な事をしますが、どのようにポリゴン化するのか、とその呼び出した頂点の位置を指定したりもします。

が行われるみたいです。

はい。

分かりました。

順番が逆になってしまいますが、Tessellation MultiplierがTessellation Control Shaderにおけるポリゴンの細分化の条件を指定して、World DisplacementがTessellation Evaluation Shaderにおける細分化した際に発生した新しい頂点の位置の指定を担当していると考えると辻褄があいます。

となるとTessellation VerticesはTessellation Evaluation Shader内で呼び出されるTessellation Primitive Generationで新しく作成された頂点を指しているはずです。

もう一度、公式のDocumentのWorld Displacement [5]を読み直してみると

f:id:kazuhironagai77:20210411225742p:plain

Meshのベースの頂点ではなくて…とわざわざ述べています。

やっぱりこの文章からもTessellation VerticesはTessellation Evaluation Shader内で呼び出されるTessellation Primitive Generationで新しく作成された頂点を指していると考えられます。

はい。

ところでTessellation MultiplierがTessellation Control Shaderにおけるポリゴンの細分化の条件を指定できるならBlenderで予め細かくしたplaneを作成してUE4にimportする必要もないんじゃないでしょうか?

ムム…。

検討してみましょう。

ですがその前にMegascansが提供しているMaterial内でどのようにDisplacement mappingが行われているのかを確認します。

2.2.3 Megascansが提供しているMaterialのDisplacement mappingについて

以下の様な実装になっていました。

f:id:kazuhironagai77:20210411225809p:plain

MF_DisplacementノードのHeight(s)がどうなっているのか次第ですね。

以下の様になっていました。

f:id:kazuhironagai77:20210411225830p:plain

私が先週適当に作成したのか以下のヤツです。

f:id:kazuhironagai77:20210411225850p:plain

最初の掛け算の部分は、50のConstantを賭けているのがDisplacement Amountに変更されただけでほぼ同じです。Megascansの方はその後で、Displacement Amountを2で割った値を引いています。更にVertexNormalWSをかけています。

そう言えば、公式のDocumentのWorld Displacement [5]でもVertexNormalWSを掛けていました。

f:id:kazuhironagai77:20210411225913p:plain

VertexNormalWSって何の値なんでしょうか?

VertexNormalWSの公式のDocument [8] を見てみました。

f:id:kazuhironagai77:20210411225938p:plain

World座標における頂点の法線のデータみたいです。

しかし超大事な事をその後で言っています。この値はvertex shader内で実行される場合のみ使用出来ますと。

となると、以下の部分の計算はVertex Shader内で行っているはずです。

f:id:kazuhironagai77:20210411225958p:plain

ここで頂点の法線で掛けている訳ですからこの時点で頂点以外のDisplacement mappingの値は消えてします訳です。

つまり、先程考えていたTessellation VerticesにDisplacement mappingの値を直接パスする事は出来ないと言う事になります。

勿論、UE4のMaterialの使用方法を極めれば出来るのかもしれませんが上記のような組み方では無理でしょう。

ただしTessellation Verticesの分割具合とDisplacement mappingの変化を見ると、

以下の様にTessellation VerticesがBaseのVerticesと同じ時は、

f:id:kazuhironagai77:20210411230020p:plain

全くDisplacementが起きていませんが、

f:id:kazuhironagai77:20210411230039p:plain

以下の様にTessellation VerticesがBaseのVerticesより沢山生成された場合は、

f:id:kazuhironagai77:20210411230058p:plain

Displacementが起きています。

f:id:kazuhironagai77:20210411230123p:plain

BaseのVerticesの法線のみがDisplacementのデータを持っていてこんな結果になるんでしょうか?

実際はTessellation Verticesの法線とDisplacementのデータを掛けているんじゃないんでしょうか?と思いました。

直接、Shader code見れば何か分かるかもと試してみましたが以下の量のShaderが表示されました。

f:id:kazuhironagai77:20210411230141p:plain

流石に、今の私ではこれを読んで理解するのは無理です。

これはあきらめます。

最後にですが、私が先週作成したDisplacement mappingの実装にVertexNormalWSを掛けた所、

以下の結果が、

f:id:kazuhironagai77:20210411230157p:plain

こんな風になりました。

f:id:kazuhironagai77:20210411230211p:plain

Displacementの高さ以外の軸に対する値が0になったみたいです。

2.3 Tessellation Multiplierの使用方法について

厳密に言えばTessellation Multiplierを使用する目的は、Meshの分割をカメラからの距離に応じて指定するもので、Displacement Mappingとは違います。しかしLandscapeにDisplacement Mappingを使用する時は、必ずTessellation Multiplierも指定する必要があるので一緒にここで勉強します。

公式のDocumentのTessellation Multiplier [6]で解説されていますが、今まで勉強した以上の情報は書かれていません。

以下にMegascansから提供されたMaterialの実装部分を示します。

f:id:kazuhironagai77:20210411230234p:plain

3つのparameterがあります。Distance Offset, Distance Fade, そしてTessellation Multiplierです。

まずこれらのParameterの意味を調べます。

以下の様なセットを作成しました。

f:id:kazuhironagai77:20210411230251p:plain

これでParameterをいじって配置してある銀色の球のmeshの変化を見ようと思います。

まずは何もしていない状態です。

f:id:kazuhironagai77:20210411230307p:plain

Distance Offsetを1000まで上げました。

f:id:kazuhironagai77:20210411230321p:plain

最初の球のmeshが細かくなりました。

数字を挙げると奥の球のMeshも更に細かくなりました。

Offsetと言う名前から考えても、この数字が高くなるとMeshが細かくなり始める位置がカメラにもっと近づくのではないでしょうか?多分ですが。

次はDistance Fadeの値を変化します。

500から5000に変えました。

f:id:kazuhironagai77:20210411230336p:plain

これも最初の球のMeshが更に細かくなりました。Distance Offsetの時と違い、次の球のmeshも少しだけ細かくなっています。

距離によってMeshの細かさが減少しますが、その減少の割合を操作するParameterみたいです。数値が大きい程減少する割合が小さくなるみたいです。

最後はTessellation Multiplierです。これは見なくてもMeshの細かさを調節するParameterと予想出来ます。

初期値からTessellation Multiplierの値を変えたら、何も変化しませんでした。

良く考えたら、Tessellation Vertices がbase のmeshと同じなら分割の数をいくら増やしても0*(分割の数)なので変化ないのは当たり前でした。

以下の条件でやってみます。

f:id:kazuhironagai77:20210411230353p:plain

Tessellation Multiplierの値を2にしました。

f:id:kazuhironagai77:20210411230410p:plain

明らかに頂点の分割が細かくなっています。

此処まで理解したのでもう一回以下の式を参考にして考えてみます。

f:id:kazuhironagai77:20210411230425p:plain

Distance Offsetの値を凄く高くすると、Subtractで値がマイナスになりDivideでDistance Fadeがどんな値でもマイナス。よってSaturateで0に補正され1-xでは1となるはず。

ので、Distance Offsetの値がある程度以上の大きくなると全ての球のメッシュの分割が同じ様に起きると考えられます。

実際は、

f:id:kazuhironagai77:20210411230444p:plain

Distance Offsetの値を幾ら大きくしても近いmeshの方が細かく分割されています。

うーん。分からない。

How to Use Megascan Displacement for Landscapes in Unreal Engine 4 [2]を見たら、完璧に説明されてました。

2.4 How to Use Megascan Displacement for Landscapes in Unreal Engine 4 [2]で学ぶTessellation Multiplierの使用方法について

このTutorialで説明されていた通りに説明します。

まずDistance fadeですが、カメラのある位置からどれくらいの距離まで、Meshを細分化するかを決定します。

以下の例ではDistance fadeの値が5000です。

f:id:kazuhironagai77:20210411230507p:plain

Distance fadeの値を10000に増やしました。カメラから更に遠くのMeshまで細分化されています。

f:id:kazuhironagai77:20210411230522p:plain

Distance Offsetはこの細分化の距離を更に遠くに伸ばします。

f:id:kazuhironagai77:20210411230539p:plain

正直、Distance fadeとの違いが分かりません。

最後にTessellation Multiplierですが細分化の割合を細かくします。

f:id:kazuhironagai77:20210411230554p:plain

これは前から分かっていました。

Distance OffsetとDistance fadeの違いが分かりました。

Distance Offsetを3000、Distance fadeを0にした場合です。

f:id:kazuhironagai77:20210411230611p:plain

Meshの細分化のされ具合が距離に全く影響されていません。

一方で、Distance Offsetを0、Distance fadeを5000とした場合、

f:id:kazuhironagai77:20210411230626p:plain

Meshの細分化のされ具合が距離よって変わっています。

Distance Offsetを1000、Distance fadeを5000とした場合、最初の1000の部分は全て均等に細分化され、その後、距離に応じて細分化が減少しています。

f:id:kazuhironagai77:20210411230650p:plain

はい。完璧に理解しました。

Distance Offsetについてですが、何で球のmeshで試した時は距離に応じてmeshの細分化が変化したのでしょうか?

f:id:kazuhironagai77:20210411230711p:plain

多分ですが、meshの細分化はLODなどの別の要素の影響もあると思います。

その結果、球のmeshのこの条件では上手く出なかったのでしょう。

2.5 How to Use Megascan Displacement for Landscapes in Unreal Engine 4 [2]で解説された重要な点について

<Displacement Amountの正しい値の見つけ方>

Bridgeからmaterialを選択して3Dを表示させます。

f:id:kazuhironagai77:20210411230738p:plain

そのイメージと同じ位のデコボコになるようにDisplacement Amountの値を調節します。

f:id:kazuhironagai77:20210411230752p:plain

<Landscapeに今回の方法でTessellationをする場合の注意>

LandscapeにかかるTessellationはMaterial Instanceからだけではなく、LandscapeのLODからも影響されます。

LODからの影響を無くしたい場合は、LODのMax LODLevelの値を0にセットします。

f:id:kazuhironagai77:20210411230814p:plain

更にTessellationのTessellation Component Screen Sizeを0.01、Use Default Falloffのチェックを外します。

f:id:kazuhironagai77:20210411230830p:plain

こんな感じです。

f:id:kazuhironagai77:20210411230846p:plain

Materialの設定を変えないとDisplacement mappingはLandscapeを一枚の大きなタイルとしてみなすそうです。

その設定は、MaterialのTessellationにあるCrack Free Displacementです。これのチェックを外します。

f:id:kazuhironagai77:20210411230902p:plain

結構重要な情報が説明されていました。

2.6 LandscapeにDisplacement mappingを実装します。

それでは実装します。

まずLandscapeに使用しているMaterial instanceの元のMaterialである、Landscape4のTessellationのD3D11Tessellation ModeをFlat Tessellationに変更します。

f:id:kazuhironagai77:20210411230931p:plain

Landscape4では3つのMaterial functionが使用されています。

f:id:kazuhironagai77:20210411230945p:plain

まず、一番使用面積の大きいMF_GroundにDisplacement mappingを追加します。

MF_Displacementを使用する事にしました。

f:id:kazuhironagai77:20210411230959p:plain

Displacement TextureをMF_DisplacementのHeight(s)につなげます。

f:id:kazuhironagai77:20210411231014p:plain

UVsにつなげるTexCoordのサイズが分かりません。取りあえず、

f:id:kazuhironagai77:20210411231030p:plain

と繋げました。

Tessellationが効いているのは確認出来ますが、

f:id:kazuhironagai77:20210411231047p:plain

値を弄っても全く変化しません。

f:id:kazuhironagai77:20210411231111p:plain

別なMapにMF_Groundのみを使用したMaterialを作成してLandscapeに適用して確認します。

f:id:kazuhironagai77:20210411231127p:plain

f:id:kazuhironagai77:20210411231138p:plain

普通に効いています。

Landscape4に直接、MF_Displacementを追加してみます。

f:id:kazuhironagai77:20210411231205p:plain

今度はLandscape4_Instの値から操作出来ました。

f:id:kazuhironagai77:20210411231222p:plain

良く分かりませんが、Landscape4の場合はMF_GroundだけにMF_Displacementが在る場合は効かないようです。

Play画面から確認しようとしたら、8000枚位のShaderをCompileし直す必要があると出て来て、5分位ずっと計算しています。

f:id:kazuhironagai77:20210411231241p:plain

足が浮いています。

f:id:kazuhironagai77:20210411231255p:plain

うーん。

Displacementを切っても浮いていました。

f:id:kazuhironagai77:20210411231311p:plain

Displacementは関係なかったです。

以下の条件でマイルドにしました。

f:id:kazuhironagai77:20210411231331p:plain

f:id:kazuhironagai77:20210411231339p:plain

f:id:kazuhironagai77:20210411231349p:plain

一応出来ました。

後は負担がどれくらいなのかをAssessmentしたいです。

2.7 Displacement mappingの実装についてのまとめ

一応、Displacement mappingの実装が出来ました。出来ましたが結構な問題や分からない事は山積みですので、後で見直す時に忘れない様に、ここにまとめて置く事にします。

  • MF_Ground用のDisplacement mappingLandscape全体に使用している。
  • Displacement mappingのコストが分からない。
  • Characterの足が浮いている。

Displacement mappingの理論でも以下の部分は良く分かりません。

  • World Displacement に繋ぐノードでVertexNormalWSを使用しているが、これらはVertex shaderで実行されるのかそれともTessellation Evaluation Shaderで行わるのか不明。
  • Materialから生成したShaderのコードが複雑すぎて読めない。

頂点を沢山持つPlaneをImportしてDisplacement mappingを試す必要なくなったので、[New] Blender To Unreal Plugin! [3]は勉強する必要は無くなりました。しかしBlenderの新しいVersionも勉強する必要があります。それも考えておきます。

3.針葉樹用の緑と沼用の地面のMaterialの追加

3.1 沼の作成

以下の部分が沼です。

f:id:kazuhironagai77:20210411231457p:plain

今は、地面がむき出しですが、沼用の新しいMaterial functionを追加してここにPaintしようと思っています。

f:id:kazuhironagai77:20210411231515p:plain

沼用のMaterialをMegascanからimportしました。

f:id:kazuhironagai77:20210411231534p:plain

上記のTextureを使用したMaterial Functionを作成します。

MF_Groundを複製してTextureだけ交換しました。

f:id:kazuhironagai77:20210411231551p:plain

Texture SamplerのSampler sourceの設定がShard:Wrapになっているかの確認も行いました。

f:id:kazuhironagai77:20210411231620p:plain

Landscapeに使用しているMaterial、Landscape4に先程作成したMF_Swampを追加しました。

f:id:kazuhironagai77:20210411231637p:plain

一回、何かをBPに追加するたびにShaderがcompileを始めて、4000~7000位のShaderがCompileするまで待たなくてはいけないのですが、これって普通なんでしょうか?

後、Landscapeが完成したらCompileにこんな時間はかからなくなるのでしょうか?

以下のようにPaintしました。

f:id:kazuhironagai77:20210411231657p:plain

Parameterを調整します。

f:id:kazuhironagai77:20210411231720p:plain

良いんじゃないでしょうか?

実際にPlayしてみました。

f:id:kazuhironagai77:20210411231737p:plain

良い感じです。

このLayerに枯れ木をFoliageとして追加します。

Foliage4のLandscapeGrassOutputにSample’Swamp’を接続します。

f:id:kazuhironagai77:20210411231759p:plain

更にLandscape Grass Type、Swamp_Foliageを作成して

f:id:kazuhironagai77:20210411231832p:plain

f:id:kazuhironagai77:20210411231844p:plain

LandscapeGrassOutputにセットします。

f:id:kazuhironagai77:20210411231904p:plain

以下の様になりました。

f:id:kazuhironagai77:20210411231924p:plain

枯れ木の数を減らして、サイズを大きくします。

最終的に更に2種類枯れ木を追加して以下の様になりました。

f:id:kazuhironagai77:20210411231947p:plain

Play中の画面です。

f:id:kazuhironagai77:20210411232011p:plain

大変重いです。

3.2 Componentの削除

一々Compileするたびに3000枚のShaderをCompileしていて大変、イライラします。

以下のlandscapeから要らないComponentを削除します。少しはCompileにかかる時間が短縮するでしょう。

f:id:kazuhironagai77:20210411232125p:plain

あんまり削れませんでしたが、一寸はマシになるでしょうか?

f:id:kazuhironagai77:20210411232157p:plain

テストして気が付いたんですが、Foliageで生成した木とは衝突しません。

f:id:kazuhironagai77:20210411232219p:plain

どう直せばいいんでしょうか?

このサイト[9]の解答を見ると無理みたいですね。

f:id:kazuhironagai77:20210411232239p:plain

なるほど。

もう十分勉強したのでCh4に戻って本番用のLandscapeを作成します。

4.ゲーム内のlandscapeの作成。

4.1 Height mapからLandscapeをImportする

久しぶりにCh4_3を開きました。

Map1を以下に示します。

f:id:kazuhironagai77:20210411232313p:plain

ここに前節で作成したLandscapeとほぼ同じ物を作成したいと思います。

まず、前に作成したLandscapeを消します。

f:id:kazuhironagai77:20210411232335p:plain

これは予想外でした。こんなにLandscape小っちゃかったんですね。

やっぱり別なMapにします。

となると先程作成したMapを丸ごとExportすればいいんじゃないでしょうか?

f:id:kazuhironagai77:20210411232408p:plain

出来ました。

こっちはこっちで別なLandscapeを作成しましょう。

f:id:kazuhironagai77:20210411232425p:plain

5.Map1Landscapeの作成

以下の様な地形を作成します。

f:id:kazuhironagai77:20210411232453p:plain

上の地形を元に以下の様なLandscapeを作成しました。

f:id:kazuhironagai77:20210411232512p:plain

Landscape4で使用したMaterialでPaintしました。

f:id:kazuhironagai77:20210411232532p:plain

Play中の画像です。

f:id:kazuhironagai77:20210411232551p:plain

6.Environmentの勉強

今週は思っていたよりも早く予定した内容が終わってしまったのでUE4 の勉強をする事にします。

2021-03-22のブログで以下のTutorialは光に関するものだから勉強しませんでした。

  • Becoming an Environment Artist in Unreal
  • Constructing Believable Environment

久しぶりにCH4_3を開いてPlayしたらcharacterの陰影の付き方が別のProjectと違うような気がします。ちょっと気になるのでUE4におけるLightingを先に勉強する事にします。

2021-03-22のブログを見ると、Landscapeの作成が終わったら以下の事をやると述べていました。

  • Widget内のBPの整理
  • Effectの勉強と作成

これは来週やります。

BlenderからUE4にExportするTutorialについては新しいBlenderの使用方法を別に勉強しないといけないので後に回します。

6.1 Becoming an Environment Artist in Unreal

< Introduction to Environment Art >

このコースで何が勉強出来るのかを説明しています。この説明を聞く限りあんまりLightingはやらないみたいです。後かなり初心者向けみたいです。まあ、軽い気持ちで映画でも見る気分で見て行きましょう。

<Department Interactions in Development

Environmental artistがゲーム制作に関して何を担当するのかを説明しています。

  • PropとAssetの作成。
  • Textureの作成。
  • Materialの作成。
  • Level Artistとの密接な連携
  • AssetのCollision、LODs、そしてLightmappingの作成。
  • Level制作に必要なパーツの作成

と説明されています。

これを見ると「Unreal Engine 4 で極めるゲーム開発」で述べられている職種は、少なくともUE4を使用したゲーム開発では一般的な概念のようです。

後、Lightingに関してはLight Mapの作成ぐらいしかここでは述べられていませんね。

<Names and Terminology

ここではゲーム制作で使用される専門用語の内、Environmental artistが知っておかなければならない用語とその意味が紹介されていました。

ここで、面白いのがこの用語の説明がArtist向けな所です。

例えば、C++のProgrammerがBuildについて説明するならば、Compile+linkingと言うでしょうが、ここではBuildとはVersion、特に最新のVersionを指していると説明されています。私も最初は、それはBuildで作成されたCode(のVersion)でBuildじゃないでしょう。と思ったんですが、ArtistにCompiler と Interpreterの違いかを説明したって彼らには必要ない事ですし、こっちの説明のほうが分かり易く、かつ実用的です。

これで思い出したのが、化学における有機、無機の違いと意識高い系の人のおける有機、無機の違いです。化学を勉強する人にとって有機、無機の違いは炭素原子を中心に構成されている分子かどうかですが、意識高い系の人にとっての有機、無機の違いは農薬を使用して栽培されているかどうかです。

<Setting Up Your Folders

作成したFileやFolderの整理の仕方についてです。

以下にFileの名前の付け方の例を紹介しています。

f:id:kazuhironagai77:20210411232703p:plain

今度はTextureの種類についての名前の付け方です。

f:id:kazuhironagai77:20210411232720p:plain

これは直ぐに実行しましょう。大変分かり易いです。

Quiz 1

Mipについて間違えてしまいました。

うーん。

Mipmapって色んなサイズのtextureを準備してそれぞれを距離に応じて使い分ける事でしょう。何で間違いだったんでしょうか?

Scale Prep for Unreal Usage

1 unreal unitが1 cmであると明言されていました。

更に単位の設定方法について説明されていました。

Project Setting -> Editor -> Appearance -> Distance/Length でCentimetersにセットされています。

f:id:kazuhironagai77:20210411232756p:plain

XYZ軸についてです。UE4ではz軸が上を向いています。(これについては昔、このブログで相当調べました。)

Pivotについてです。Pivotはmeshの中心点の事ですがmeshによって底の中心だったり底の右端だったりします。

Using the Grid and Snapping Tools

Gridとは何かについての解説です。

その中で以下のToolの使用方法について説明しています。

f:id:kazuhironagai77:20210411232829p:plain

いますが、

f:id:kazuhironagai77:20210411232848p:plain

この升目上のチェックを外すと設定が100になっていても自由に動かせる事についての説明がありませんでした。

これって結構重要だと思うんですがどうでしょう。

Mouseの真ん中のボタンを押しながらDragすると距離が測れるそうです。

やってみます。

f:id:kazuhironagai77:20210411232915p:plain

おお。出来ました。

これは中々良い事を学びました。

この距離を示す白線の始点と終点の位置も

f:id:kazuhironagai77:20210411232934p:plain

によって強制されていますね。自由に位置を選択したい場合は升目上のチェックを外すと出来ます。

Texture Settings, Density and Exporting

Textureについての解説です。

Base、Normal、 Metalness、 Roughness、Ambient occlusionそしてChannel Packedについての説明です。

いつも思うんですが、PBRを説明するのにこのBase、Normal、 Metalness、 Roughnessの4つのTextureが必要であるRendering方法とすると非常に分かり易くなります。

ここでの説明も非常にスッキリしていて短時間で本質が理解出来る仕組みになっています。

Textureのサイズについてですが、UE4は最大で8192x8192ですが、4096x4096以上を使用するのはかなりレアな場合だそうです。

2021-03-28のブログで、

f:id:kazuhironagai77:20210411233003p:plain

と述べていますが、この辺の確証が得られましたね。

Texture density についてですが、そのTextureのsizeではなくそのtextureのsizeとそのtextureが張られるmeshのサイズで決まるそうです。

以下の様にです。

f:id:kazuhironagai77:20210411233025p:plain

これってTextureをMeshに貼りつける時にかなり大切ですよね。あんまり細かいTextureを小さな面に貼っても誰も気が付かないですし。

Texture densityを可視化する機能とかあるんでしょか?

Importing Meshes and Textures Into Unreal

FBXをUE4にImportする時に、表示される以下のヤツの中で大切な項目の説明を行っています。

f:id:kazuhironagai77:20210411233052p:plain

BlenderからStatic meshをImportする時にいつも無視していました。

ここで勉強してしまいましょう。

f:id:kazuhironagai77:20210411233113p:plain

MeshをImportする時に一個だけとは限りません。この項目はどのMeshに対しての設定をするのかを示します。

f:id:kazuhironagai77:20210411233134p:plain

Skeletal Meshかどうかです。

f:id:kazuhironagai77:20210411233158p:plain

ここにCheckを入れておくと最低のCollision(多分以下に示したようなタイプ)は生成してくれるそうです。

f:id:kazuhironagai77:20210411233231p:plain

f:id:kazuhironagai77:20210411233239p:plain

Importする時に幾つかのAssetを同時にImportしていますが、それを一つのMeshとしてImportするそうです。

幾つかのAssetを同時にImportって例えばイスをImportする時に背もたれとか足を別々のAssetで作成しているんでしょうか?

それともイスとテーブルを同時にImportしてそれを一つのMeshにする事を指してるんでしょうか?

現状の私の3Dの知識では今一意味が分かりませんでした。

f:id:kazuhironagai77:20210411233303p:plain

ここの二つの項目、かなり力を入れて解説しているんですが、今一良く分かりません。

カーソルを上に乗せたら詳しい説明が表示されました。

Normal Import Methodは

f:id:kazuhironagai77:20210411233319p:plain

と書かれています。

つまりFBXは元々、頂点に対してか、その頂点が作成したポリゴンに対してかは分かりませんが、法線の値を保持しています。それをそのまま使用するか、もしくはImportした頂点のデータからUE4側で法線の値を計算し直すのかを聞いてるようです。

Normal mapに対して聞いている可能性もない訳ではありませんが、今の所それは不明です。

Normal Generation Methodは

f:id:kazuhironagai77:20210411233334p:plain

Meshの法線を計算するのにMikkTSpace tangent space generatorを使って計算せよ。と指定しています。

となるとFBXは元々保持している法線の値は頂点に対してと言う事になりそうですね。

MikkTSpaceなんてどっかで聞いた事がある言葉です。しらべればすぐに分かるでしょう。

このサイト(Tangent Space Normal Maps)[10]に詳しい解説がありました。

このサイトを読むとつまり、tangent space normal mapの作り方と戻し方を同じ方法でやらないと値が変わってしまう事やorder dependencyなどの問題があり、それらの問題をMikkTSpaceでやると避ける事が出来る。と言う事のようです。

そういう解釈でもう一回説明を聞いたら、そんなような事を説明していました。

f:id:kazuhironagai77:20210411233420p:plain

f:id:kazuhironagai77:20210411233428p:plain

これってXYZ軸の変換の事でしょうか?

f:id:kazuhironagai77:20210411233458p:plain

f:id:kazuhironagai77:20210411233509p:plain

こっちは単位の変換みたいですね。

f:id:kazuhironagai77:20210411233541p:plain

f:id:kazuhironagai77:20210411233549p:plain

ImportしたMeshにMaterialが無い時にどうするかを聞いています。

Tutorialの解説では、ほとんどのゲーム制作でUE4内で新しいMaterialを作成するそうです。

f:id:kazuhironagai77:20210411233605p:plain

f:id:kazuhironagai77:20210411233615p:plain

これは解説そのままですね。

これでFBX import optionの解説はお終いです。

正直、カーソルを分からない項目の上に合わせるのが一番分かり易いと分かりました。

次はImportしたTextureの設定についてです。

f:id:kazuhironagai77:20210411233633p:plain

圧縮の方法についての選択ですが、Base Colorとそれ以外ではそれぞれ最適なやり方が違います。

f:id:kazuhironagai77:20210411233656p:plain

これは流石に知っています。Base colorの時はチェックしてそれ以外は外すはずです。

f:id:kazuhironagai77:20210411233729p:plain

ここはImportしたFileがどこからImportしたのかの記録です。

f:id:kazuhironagai77:20210411233744p:plain

OpenGL用に作成されたNormal mapを使用する時にチェックします。これは2021-03-28のブログでも勉強しました。

結構勉強になりました。

Quiz 2

満点でした。でしたけどgrid snapping option valuesが何をいっているのか分からなくてこのブログを読み直して回答しました。

Blockouts and Stand-in Meshes

Blockoutとは仮のアセットでLevel上に取りあえず配置してLevel artistが全体のイメージが掴めるようにするためのものです。

Blockoutの例として紹介されていた地下鉄のドアですが、私には完成品に見える位の質でした。

ここは正直何を勉強すべきなのか良く分からないです。

Collison Setup

Collison用のmeshの作成方法についての解説でした。

Polycount, Optimization and Draw Calls

最適化についてです。

Polycountとは使用しているポリゴンの数です。少ないほど良いです。

Draw CallはRenderingのためにGPUやCPUからTextureを呼び出す回数を指しているようです。説明を聞きましたがこれ以上の理解は出来ませんでした。GPUに一端Textureやmeshのデータを渡してGPU内だけで呼び出すならそんなに負担にならないんじゃないの?と思ったんですがその辺をDraw Callが数えてるのか分かりません。

Draw Callの数を減らすためにはUE4のRenderingを理解したProgrammerが必要で、ArtistはDraw callを減らす事が最適化につながる事を理解する事と

  • Meshの数を減らす事
  • Materialの数を減らす事
  • 同じmaterialを使用しているMeshは結合できないか検討する事

だそうです。

LODについてです。

LODはアセットがカメラから遠くの時にmeshの数が少なる事だそうです。LODについてしっかり勉強した事ないので、どうやって実現しているのか全く分かりません。

MeshのLOD Settingから作成していました。

f:id:kazuhironagai77:20210411233835p:plain

更にReduction Settingでポリゴンに使用されてる三角形の数を減らす事も出来ます。

f:id:kazuhironagai77:20210411233851p:plain

カメラからの距離でどのLODを使用するかはUE4が自動で設定してくれるそうです。

以下のチェックを外すとその自動化が止まるそうです。

f:id:kazuhironagai77:20210411233907p:plain

自分で設定する時は以下のScreen Sizeで指定するそうです。

f:id:kazuhironagai77:20210411233919p:plain

Meshに使用されるMaterialの数が増えるほどDraw callも増えるそうです。LOD2などの遠くでのみ使用さるMeshのMaterialの数はLOD0より少なくする事も考えるべきだそうです。

かなりLODについて勉強になりました。

Quiz 3

満点でした。

Footprintって何ですかと一瞬なりましたが、解答読んだら理解出来ました。

Basic Material Creation and Application

Materialの作成方法についての実演でした。

大体知っている事でしたが、TextureSampleのSampler TypeにそのTextureがどのタイプが表示されているのかを示しているそうです。

f:id:kazuhironagai77:20210411233945p:plain

GameTexture.comからBridgeにImportしたMrao.pngですがLinear Colorにセットされていました。

f:id:kazuhironagai77:20210411234010p:plain

これってMASKをセットすべきですよね。

Material Masters and Instances

Material Instanceの作り方を実演しています。

Master Materialは一つのProjectで2,3個しか作らないと言っていますが本当なんでしょうか?

時間が無くなってしまいました。

今週はここまでとします。

7.まとめと感想

今週は、

  • Tessellation Multiplier を使用したDisplacement mappingの勉強と実装
  • Landscapeの沼の作成
  • 作成したLandscapeGame用のProjectMigrate
  • Game用のProject内で新しくLandscapeを作成
  • 時間が余ったのでEnvironment artist用のTutorialを勉強

を行いました。

来週は、

  • Environmental artist用のTutorialの続き
  • Widget内のBPの整理
  • Map1からLandscape4にWarp出来るようにする。
  • Landscape4で戦闘出来るようにする。

を行います。

8.参考文献(Reference

  1. (2021b, January 2). Easily Set Up Displacement Maps in Unreal Engine using Quixel Bridge [Video]. YouTube. https://www.youtube.com/watch?v=f7q7btWDYOc
  2. MR3D-Dev. (2020, November 23). How to Use Megascan Displacement for Landscapes in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=uTKap2aJbI8
  3. Smart Poly. (2020, July 28). [New] Blender To Unreal Plugin! [Video]. YouTube. https://www.youtube.com/watch?v=PNGAoKhrBls
  4. (2021a, January 1). Converting Your Favorite Render Engine Materials for Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=5vpDFGJEsNw
  5. Epic Games. (n.d.-a). 1.11 - World Displacement. Unreal Engine Documentation. Retrieved April 11, 2021, from https://docs.unrealengine.com/en-US/Resources/ContentExamples/MaterialNodes/1_11/index.html
  6. Epic Games. (n.d.-b). 1.12 - Tessellation Multiplier. Unreal Engine Documentation. Retrieved April 11, 2021, from https://docs.unrealengine.com/en-US/Resources/ContentExamples/MaterialNodes/1_12/index.html
  7. E., A., & D. (2016, February 9). What is Tessellation in computer graphics. Computer Graphics Stack Exchange. https://computergraphics.stackexchange.com/questions/2018/what-is-tessellation-in-computer-graphics
  8. Epic Games. (n.d.-c). Coordinates Expressions. Unreal Engine Documentation. Retrieved April 11, 2021, from https://docs.unrealengine.com/en-US/RenderingAndGraphics/Materials/ExpressionReference/Coordinates/index.html?utm_source=editor&utm_medium=docs&utm_campaign=rich_tooltips#vertexnormalws
  9. Epic Games. (2015, August 6). Landscape grass & collision. Unreal Engine Forums. https://forums.unrealengine.com/development-discussion/content-creation/50736-landscape-grass-collision
  10. MikkTSpace.com. (n.d.). Tangent Space Normal Maps. Retrieved April 11, 2021, from http://www.mikktspace.com/