UE4の勉強記録

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

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

f:id:kazuhironagai77:20210404222701p:plain

<前文>

Sidney Powell氏と匿名掲示

良くニュースとか洋物のドラマで聞く司法長官はthe United States Attorney generalでSidney Powell氏の前職であるUnited States Attorneyは連邦検事だそうです。

連邦検事がどれくらい凄いのか、法律にも権力にも疎い私は全く分かりませんが、良く洋物のドラマや日本のニュースに出て来る司法長官と一字しか違わないのだから、結構凄い地位だと思います。

そんな凄い職に就いていたSidney Powell氏ですが「2020の大統領選挙は投票の集計をする機械を作っている会社(Dominion社)が不正を働いているからトランプ氏が負けた。」とメディアで言いまくっていたら、とうとうDominion社から訴えられてしまいました。

そしたら彼女「私が言っているのは全て冗談で、それはみんな分かってる。もしそれが分からないヤツがいたら、そいつはとんでもないアホ。」と主張し始めました。

この発言は、右派、左派を問わずアメリカ人のほとんどが激怒、もしくは失笑する発言だったんですが、10年以上アメリカで暮らした私からすると、その激怒や失笑しているアメリカ人に対して「白々しい偽善者たち」と言う気持ちになります。

前にも書きましたが、宗教右派たちが主張する内容が全部嘘なのは全てのアメリカ人が知っています。知っていますが、メキシコの国境に壁を作った時や、日本を含むアジアにアメリカでは使用が禁止されている発癌性の農薬を使用したフルーツを販売した時は、アメリカ人全員が笑って見過ごしていたんです。ところが今回、コロナウィルスや議会の暴動で自分達に直接危害が及ぶ事が分かると、途端に宗教右派たちを叩き始めました。

しかし今回、ここで書きたいのはその話ではなく、この彼女の発言と日本の匿名掲示板についてです。

このニュースが日本の匿名掲示板で紹介された時「彼女はそんな発言していない。嘘を書くな。」と一貫して訂正してくる人達がいて、そのスレを読んでいるほとんどの人が本当はSidney Powell氏はそんな発言していないんだ。と信じてしまったんです。

私も信じてしまいました。

後で英語のニュースサイト見てたらSidney Powell氏が嘘をついていた事を認めたと書かれていて「えっ」となりました。

いくら匿名掲示板といえどもニュースを紹介しているサイトですから、そこに書かれている内容がある程度の事実を保証する義務があると思いますが、そう言う事は野放しみたいですね。

ここで皆さんに質問です。

  1. 皆さんは匿名掲示板といえどもニュースを扱う限りは、そこに書かれている内容に対してある程度の事実を保証する義務があると思いますか?
  2. もしその義務があるとすれば、それはそのサイトを運営する会社ですか?それともそこに文章を書き込む人達ですか?

私はこう考えています。

まず1に対してですが、ニュースと名乗っている以上、その内容に対してある程度の事実を保証する義務はあると思います。もしくは「ここで書かれている事はすべて嘘です。信じないで下さい。」と前もって書き込んでおく必要があると思います。そう言えば、昔はこの匿名掲示板、似たような警告が書かれていた気がします。

2に対しては、匿名で文章が書ける以上、その書かれた内容が事実である事を保証する義務はそのサイトを運営する会社にあると私は思います。

その辺のカルトに嵌っているおばちゃんが癌患者に「この水飲めば癌も治る。」と言ってもほとんどの人は信じないでしょう。しかしどっかの大学病院の先生が言ったら、ほとんどの人はひょっとしたら治るかもしれない位は思います。このように誰が発言したのかはその内容の信ぴょう性に対して大きく影響します。それを敢えて隠している訳ですから、その責任はサイトを運営する会社にあると私は考えます。

はい。

実はこの上記の議論と全く同じ議論がアメリカでも今行われています。

1については、先程のDominion社がFox Newsに対してもSidney Powell氏と同様の訴訟を起こしています。

その時にFox Newsは「我々は娯楽を提供しているのでそれが事実である事を保証する義務はない。」みたいな返答をしています。幾ら何でもNewsですからね。事実を伝える必要がないのならNews番組を名乗って良いんでしょか?と批判の嵐に晒されています。

2についてですが、アメリカ議会は今回の連邦議会での暴動の責任の一端がSNSの運営会社にあると激怒しています。

これに対してFace bookは全ての責任は発言した人、Face bookの責任は書いた記事がネットで読める様にする事である。と真っ向から対立しています。Googleは訳わからん事言って議員を煙に巻こうとして失笑を買ってしまいました。Twitter社はSNSの運営会社にも責任の一端があったと最初から認める発言をして株を挙げました。

この議論がどう転んでいくのか分かりません。しかし近い将来、匿名や偽名では、ネットに投稿出来なくなる気が私はしています。

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

<本文>

1.今週の予定

以下の事をやっていこうと思います。

  • Landscapeの直し
  • 先週勉強したTutorialの続きをやる
  • Foliageの改善(Cull Distanceの使用)
  • 水の追加
  • Projectに使用する実際のLandscapeの作成

後、今週からReferenceを別に作成しようと思います。

UE4を業務で使用している人で、英語の資料(YouTubeのTutorialも含む)が読めない人はいないと思いますが、膨大な英語圏の資料から質の高いものを見つけるのはかなり時間がかかります。「英語圏の資料は全く見ない。」のも一つの手かもしれませんが、UE4において英語圏の資料は質、量、共に日本語の資料を圧倒していますので、そんな習慣を付けてしまうと近い将来、必ず詰んでしまいます。

私のBlog内に引用した資料の一覧が有ると、それ自体がある程度の質を保証した英語圏の資料集なので一から探す手間が省けます。

また最近の私のブログの質はかなり向上して来ているので、私のブログで引用した資料と言う事で引用された側にもメリットがあるはずです。

ので引用した資料はReferenceを作成する事で明確にします。

2.Landscapeの直し

先週作成したMaterialには何か所か直したい所があります。

  • Material instanceを使用していないためパラメーターを調節するたびにCompileする必要がある。微調整が出来ない。
  • Displacement Textureが提供されているがこれの使い方が分からない。
  • 緑のTextureにもMacro variationDistance blendを使用する。
  • Distance BlendTextureのサイズの設定が逆だったかもしれない。

2.1 Material instanceを使用する。

先週勉強したTutorial [1]でパラメーターの微調整を実際のLandscapeを見ながらおこなっていました。

f:id:kazuhironagai77:20210404222902p:plain

これはかなりsmartなやり方です。早速真似しようとしたら出来なかったんです。

その理由ですが、先週Materialは作成したのですが、そのMaterial からMaterial instanceを作成しませんでした。

Materialを直接使用するとParameterを変える毎にCompileする必要があり、とても実際のLandscapeを見ながら微調整なんて出来なかったです。

Material Instanceを使用する理由はParameterの値だけが違う同じ方法で作成したMaterialらを一括で管理出来る事だと思っていたのですが、それプラス3d viewportから直接、そのmaterialを実際に使用しているActorを見ながらCompileなしでParameterの調整が出来る事でした。

目から鱗の体験でした。

先週作成したMaterialからMaterial instanceを作成します。

f:id:kazuhironagai77:20210404222919p:plain

しました。

これにParameterを追加していきます。

あれ。既に大量のParameterが存在しています。

f:id:kazuhironagai77:20210404222935p:plain

元のMaterialにParameter なんて一個もないんですが? 

f:id:kazuhironagai77:20210404222952p:plain

なんと、使用しているMaterial function内のParameterも自動で追加してくれてありました。

f:id:kazuhironagai77:20210404223006p:plain

となるとほとんど既に完成していました。

Distance blendに使用しているConstantをparameterに変換してテストしてみます。

f:id:kazuhironagai77:20210404223022p:plain

以下の様に設定を変更しました。

f:id:kazuhironagai77:20210404223039p:plain

Start Offsetを-1000から-2000に変更します。

f:id:kazuhironagai77:20210404223056p:plain

Blendが始まる箇所が遠くになっています。

Blend Range resultの値を100から100000に変更します。

f:id:kazuhironagai77:20210404223111p:plain

淡いブレンドに変化しました。

実際の状態で見てみます。

f:id:kazuhironagai77:20210404223126p:plain

うーん。

よーく見るとタイルが見えるんです。

Dirt far、 dirt nearの二つのParameterを追加する事で、使用しているTextureのサイズもMaterial instanceから調整出来る様にしました。

Farを0.02、nearを0.05で以下のような地面になりました。

f:id:kazuhironagai77:20210404223142p:plain

これならタイルタイルしていませんね。

実際のplay画面です。

木の葉のサイズが人の頭位になってしまってますね。

f:id:kazuhironagai77:20210404223157p:plain

うーん。

変えました。

f:id:kazuhironagai77:20210404223219p:plain

これぐらいでどうでしょうか?

f:id:kazuhironagai77:20210404223235p:plain

遠くに使用するTextureはサイズを変えるだけでなくTextureそのものも変えた方が良い気もします。

Material Instanceを作成する事で、compileなしかつ3d view portを見ながら微調整を行えるようにすると、体感的ですが1000倍位精度高く調整できる気がします。

今回はこの事が確認出来たので良しとしましょう。

2.2 Displacement Textureが提供されているがこれの使い方が分からない

Mega ScanからdownloadしたTextureにはすべてDisplacementと名付けられたTextureが付いています。

f:id:kazuhironagai77:20210404223259p:plain

f:id:kazuhironagai77:20210404223306p:plain

f:id:kazuhironagai77:20210404223315p:plain

これの使い方が分かりません。

調べます。

色々なサイトをつまみ読みしていたら概要が分かったのでまとめます。

まず3D graphics にはDisplacement Mappingという技術があります。

Normal mappingでは偽の法線を作成する事で疑似的な凹凸を表現しますが、Displacement Mappingでは頂点をDisplacement mapに沿って実際に移動させる事で本当の凹凸を作成します。実際に凹凸を作成するのでnormal mappingに比べて段違いでリアルな表面を作成出来ますが、これを可能にするためには沢山の頂点が必要になので、かなり高コストなmappingです。

UE4における使用方法ですが、それなりに説明しているサイトは何個かあるのですが、バッシと理論と実践を簡潔に説明している所は無かったので自分で理解した範囲でまとめておきます。

まずMaterialのTessellationのD3D11Tessellation ModeをFlat TessellationかPN Trianglesにセットします。

f:id:kazuhironagai77:20210404223333p:plain

するとWorld DisplacementとTessellation Multiplierが入力出来る様になります。

f:id:kazuhironagai77:20210404223350p:plain

Tessellation Multiplierは頂点の数をどれくらい増やすかを決めるための入力のようです。参考にしたサイトの多くは、カメラの傍は細かく頂点を増やして、ある程度から遠くは元のままの頂点にしたりしていました。

World Displacementはどれくらい頂点をずらすかを指定するための入力のようです。高さのみ変化するのかxyz方向全てに変化するのかは不明です。

試しに以下の様にdisplacement mapをWorld Displacementに繋げてみると、

f:id:kazuhironagai77:20210404223406p:plain

以下の様に球の形状が変化しました。

f:id:kazuhironagai77:20210404223421p:plain

今回は、

  • Displacement mappingが何であるか
  • UE4Displacement mappingを使用するために最低限必要な手順

が判明したので、ここで一端中止します。

この後、

  • この技術がどのくらい必要か
  • 使用するためのコスト
  • この技術を正しく理解し正しく使用する為に必要な勉強時間

などを考えてみて継続するか決めようと思います。

2.3 緑のTextureにもMacro variationやDistance blendを使用する

先週、Macro variationやDistance blendはDirtにしか追加しなかったのでこちらにも追加します。

緑のTextureはM_Ground_GrassをそのままMaterial functionに変更したものでMaterialの実装がDirtとは全く違っていました。

以下の三か所を見ると、先週やったMacro variationとはやり方が少し違うものの、既にMacro variationを実装していると考えられます。

f:id:kazuhironagai77:20210404223509p:plain

f:id:kazuhironagai77:20210404223516p:plain

f:id:kazuhironagai77:20210404223525p:plain

更に、距離を変化させてもタイルタイルしてる箇所は見られないばかりか、スムーズなTextureの切り替えが行われています。

f:id:kazuhironagai77:20210404223541p:plain

f:id:kazuhironagai77:20210404223557p:plain

以下の部分が、Distance blendとは違うやり方で、スムーズなTextureの移行を担当しているようです。

f:id:kazuhironagai77:20210404223613p:plain

以下の部分が遠距離のTextureを担当し

f:id:kazuhironagai77:20210404223628p:plain

以下の部分が近距離を担当してるようです。

f:id:kazuhironagai77:20210404223645p:plain

よって緑のTextureにMacro variationやDistance blendを追加する必要はないと判断しました。

しかし全部理解出来たわけではありません。

以下の部分は何をやっているのか良く分かりません。

f:id:kazuhironagai77:20210404223659p:plain

分かりました。

上記の近距離担当は合っていましたが、遠距離担当は、上記で遠距離担当と思っていたやつと近距離担当を遠距離のMacro VariationでLerpしたものでした。それが最初のLerpです。次のLerpは近距離担当と遠距離担当をカメラからの距離などで混ぜる通常のDistance blendをやっています。

f:id:kazuhironagai77:20210404223714p:plain

これは何をしたいんでしょうか?2.25倍にして0.25で引いて、0から1でClampして?

良く分からないのでグラフにしてみました。

f:id:kazuhironagai77:20210404223732p:plain

  • Lerpはy=25x - 0.25で計算しました。
  • Clampは0以下は0、1以上は1、それ以外はそのままで計算しました。

上記の計算が合っている前提ですが、元の値が0.2未満の場合はもっと黒くなって、0.2以上の場合は白くなる。更に0.6以上ならば真っ白になると言う事でしょうか?全体的に言うと白くなっていると言う事みたいですね。

2.4 Distance BlendでTextureのサイズの設定が逆だったかもしれない。

いつも混乱するので確認します。

f:id:kazuhironagai77:20210404223824p:plain

上のTexCoordのUV値は共に1、下のTexCoordのUV値は共に2です。となると数字が大きくなるほど、Textureは小さくなるみたいです。

Dirtは近距離のTexCoordのUV値は1、遠距離のTexCoordのUV値は0.1なので遠距離の方のTextureが大きくなっています。

遠距離のTextureは大きくするのが正しいので合っています。

3.先週勉強したTutorialの続きをやる

How to INSTANTLY TEXTURE your landscapes in UE4 - Unreal Engine tutorial[2]とThe Secret to Realistic Landscapes in Unreal Engine - UE4 Tutorial[3]を勉強します。

3.1 How to INSTANTLY TEXTURE your landscapes in UE4 - Unreal Engine tutorialを勉強する。

崖用に新たなTextureを追加していました。Rough Rock Wallと言う名前らしいです。

Mega Scanで探しましたが見つかりません。

しょうがないので、似たようなTextureを探していたらありました。

f:id:kazuhironagai77:20210404223855p:plain

あれ、と思ってもう一回、Rough Rock Wallで検索したんですが、検索に引っかかる沢山のTextureの一つとしてこれも出て来ますが、沢山の全く違う名前のTextureと共にしか表示されません。何でなんでしょう?

Importしました。

f:id:kazuhironagai77:20210404223909p:plain

今までは、Mega Scanの方で提供されているMaterialとこのTutorialの合成的なMaterialを作成してそれをDirtとして使用したり、緑の部分はStarter Kitに提供されているMaterialをそのまま使用したりしていました。

今回の崖の部分のMaterialはこのTutorial通りに自分で作成してみようと思います。

3.1.1 崖のMaterialの作成

まず基本のMaterialを作成します。名前はMF_Cliffと名付けました。

f:id:kazuhironagai77:20210404223934p:plain

M_Landscapeに追加しました。

f:id:kazuhironagai77:20210404223949p:plain

Landscape、PaintのTarget Layersを見るとCliffが追加されています。

f:id:kazuhironagai77:20210404224004p:plain

Layerを作成してTextを塗ってみましょう。

f:id:kazuhironagai77:20210404224019p:plain

うわ。絶望的なくらい、タイルタイルしています。直せるんでしょうか?

Macro varianceを追加します。

f:id:kazuhironagai77:20210404224035p:plain

一寸はマシになりました。

f:id:kazuhironagai77:20210404224052p:plain

唐突に思いついたんですが、Macro Varianceのコントラストを下げるために0.5をかけています。この値を変化させたらもっとリアルになるかもしれません。

試してみました。

f:id:kazuhironagai77:20210404224108p:plain

青味がかってちょっとリアルになっている気がします。

f:id:kazuhironagai77:20210404224124p:plain

確認のために真っ赤に設定してみました。

f:id:kazuhironagai77:20210404224147p:plain

f:id:kazuhironagai77:20210404224157p:plain

真っ赤になっていました。

この値はParameterにしてInstanceから調節出来るようにすべきですね。

CliffのMacro Contrastとしてparameter化しました。

f:id:kazuhironagai77:20210404224213p:plain

Distance blendを追加します。

f:id:kazuhironagai77:20210404224229p:plain

凄いスパゲッティコードです。理解しているから読めますが、前もって知識がないとこのコードから何をしているのかを推測するのはかなり大変でしょう。

もっと良い整理方法があるかもしれませんがこのまま行きます。

Parameterも後でInstanceから調整出来る様に作成しました。

f:id:kazuhironagai77:20210404224243p:plain

こんな感じです。

f:id:kazuhironagai77:20210404224258p:plain

流石にTextureがデカすぎですが、タイルタイルしているのは消えています。

近づくとBlendingの酷さや、近距離でのタイルタイル感が全く消えてないのが分かります。

f:id:kazuhironagai77:20210404224312p:plain

後でMaterial Instanceから調整します。

今回は手動でペイントしますのでParlinノイズの部分はパスします。

3.1.2 Tutorial の続き: Texture Sample

一口メモみたいですが、全てのTexture SampleのSampler SourceをShared: Wrapにセットする必要があるそうです。

f:id:kazuhironagai77:20210404224332p:plain

その理由は色々なMaterialを一か所にペイントするとEditorがクラッシュしてしまうからだそうです。しかもこれが原因でクラッシュした時は、UE4は何故クラッシュしたのかを教えてくれないそうです。

Sampler Sourceがそもそも何をするのか不明なのですが、Google先生に聞いても解答を表示してくれません。

途方に暮れてカーソルをSampler Sourceに合わせたら以下の説明文が表示されました。

f:id:kazuhironagai77:20210404224347p:plain

こんな丁寧な説明が出て来るのならどこかでしっかり解説されているはずと探したら

公式のAPISampler Sourceの説明[4]がありました。

f:id:kazuhironagai77:20210404224402p:plain

「Text検索のためのSamplerがどこから来るのかをコントロールします。」今一意味が分かりませんね。

Remarkを読んだらカーソルを乗せた時に出て来た時の説明と全く同じ文章でした。

何となくですが、分かりました。

SamplerSourceはTexture Sampleそのものか、もしくはTexture SampleのTextureをどこに保持するかを決定するためのParameterみたいです。

f:id:kazuhironagai77:20210404224424p:plain

Texture assetを選択した場合、UTexture Addressing settingに保持します。その場合、Sampler slotを消費するため16枚のTextureしか使用出来ないみたいです。

Shard: WrapかShard: Clampを選択した場合は、global samplerに保持されるため、SM5(意味不明)の場合、16枚以上のTextureでも使用出来るみたいです。

それではShard: WrapとShard: Clampの違いは何なのかですが、

見つかりません。

全然探しても出て来ません。

途方に暮れてたら、カーソルを乗せたらまた出て来ました。

f:id:kazuhironagai77:20210404224444p:plain

Clampの方です。

f:id:kazuhironagai77:20210404224500p:plain

違いはWrapがwrap addressingを使用して、Clampclamp addressingを使用するだけのようです。

このWrap addressingとClamp addressingは何となくですがDirect Xの用語のような気がします。

調べたらこのサイト[5]に解説がありました。

UV座標の範囲は通常は0から1ですが、それ以上や以下も指定できます。指定した場合ですが、Wrap addressingはTextureのイメージを繰り返し表示するそうです。Clamp addressingは0以下は0の時の値、1以上は1の値を表示するそうです。

そう言えばOpenGLにも同じ機能がありました。

先程使用した十字のTextureを使用して試してみます。

f:id:kazuhironagai77:20210404224517p:plain

まずTexCoordに3を賭けてサイズを3倍にします。

そしてShared:Wrapにセットします。

f:id:kazuhironagai77:20210404224532p:plain

結果は、

f:id:kazuhironagai77:20210404224547p:plain

十字のTextureのイメージが繰り返し使用されました。

次に

f:id:kazuhironagai77:20210404224600p:plain

変更しました。

f:id:kazuhironagai77:20210404224613p:plain

0と1の値が繰り返し…。

ウーン。1の値が繰り返し使用されているようですが、座標が…。左上が0なんでしょうか?

確認のために1引いてみました。

f:id:kazuhironagai77:20210404224637p:plain

結果です。

f:id:kazuhironagai77:20210404224655p:plain

間違いないですね。左上が0ですね。そして0以下は0の値がずっと使用されている事も確認出来ました。

そう言えば、OpenGLを勉強している時、このTextureに移動、回転、拡大縮小の計算をすると、どうしても自分が予想した結果と違うイメージが出来る時があってかなり悩んだのを思い出しました。

その時の結論は「座標を撮影しているカメラをイメージしてそのカメラが移動、回転していると仮定すると予測通りになった。」でした。

このTexCoordに対して移動、回転、拡大縮小をした場合のTextureの変化も後で調べてみます。

もうSampler Sourceに関しては理解出来ました。クラッシュする理由である「色々なMaterialを一か所にペイントする」とは多分ですが、Texture sampleを16種類以上使用した場合と言う事でしょう。

後、使用している全てのTexture sampleのSampler sourceの設定を、Shared:Wrapに変更しました。

3.1.2 Tutorial の続き: World Aligned Blend

崖のような角度が急な所は計算で見つけて、自動でPaintしたいそうです。そのために使用する関数がWorld Aligned Blendだそうです。

以下の様にして使用するそうです。

f:id:kazuhironagai77:20210404224719p:plain

Tutorialと同じ値をSlop SharpnessとSlop BiasにセットしてAlphaをBase Colorに繋げました。

以下の様な結果になりました。

f:id:kazuhironagai77:20210404224742p:plain

f:id:kazuhironagai77:20210404224751p:plain

Alphaの代わりに、w/Explicit Normalを使用しました。

f:id:kazuhironagai77:20210404224823p:plain

Tutorialではこっちを使用していますが、場合によっては元のalphaの方が良いかもしれません。

Blend Material Attributesを使用して実際のTextureを表示します。

f:id:kazuhironagai77:20210404224846p:plain

Tutorialとはやり方が違いますがこれでも大丈夫でしょう。

以下の結果になりました。

f:id:kazuhironagai77:20210404224902p:plain

うーん。自分でpaintするより綺麗な気もします。実際に使用するかどうかは後で考えます。

TutorialではLayer Blendに新しいLayerを作成してそこに繋げていましたが、全部Layerを新しく作成し直していました。自動でPaintを作成する時は良いですが、時間をかけてPaintしたDataが消えてしまったらかなりショックです。

上記でw/Explicit NormalよりAlphaを使用した方が良いかもと述べましたが、TutorialによるとAlphaの値を直接、Blend Material Attributesのalphaに接続しても使えないそうです。

World Aligned Blendのalphaの値を使用するためには、MatLayerBlend_Standardを使用する必要があるそうです。

MatLayerBlend_Standardを使用する必要があるのではなく、MatLayerBlend_Standardを改良する必要がありました。

3.1.3 MatLayerBlend_Standardの改良

MatLayerBlend_Standardの改良方法をまとめます。

まずコピーを作成します。UE4から提供されている関数を直接改良してはいけません。

f:id:kazuhironagai77:20210404224923p:plain

NormalのAlphaだけ別なInputから取るようにしました。

f:id:kazuhironagai77:20210404224938p:plain

以上です。

3.1.4 Tutorial の続き: World Aligned BlendのAlpha値を使用

改良したMatLayerBlend_Standardを以下の様に接続します。

f:id:kazuhironagai77:20210404224959p:plain

World Aligned Blend のalphaを改良したMatLayerBlend_Standard のAlphaにつなげます。w/Explicit Normalを先程作成したAlpha_Normalに接続します。Blend Material Attributes のAにつなげていたノードをBase Material (MA) Blended Materialに接続します。Blend Material Attributes のBにつなげていたノードをTop Material (MA)につなげます。最後に改良したMatLayerBlend_StandardのOutputをBlend Material AttributesのOutputがつながっていた所につなげます。

結果です。

f:id:kazuhironagai77:20210404225024p:plain

大体何をやっているのか分かりました。

何をやっているのか大体分かると、逆に何でWorld Aligned Blend のalphaでblend出来ないのかが分からなくなります。

分からない時は、分からないヤツにカーソルを乗せてみる。です。

f:id:kazuhironagai77:20210404225041p:plain

Reentrant expressionと書かれています。どういう意味なんでしょうか?

まずProgramming 一般の用語としてReentrant Functionがあるそうです。(正直に告白しますと、知らなかったです。)

このサイト[6]に分かり易い解説がありました。

簡単に説明すればその関数を使用中に別なTaskがその関数を別な目的で使用しても結果が変化しないように作成された関数の事のようです。

うん。それってThread Safeの事?

はい。実は違います。

そこでWikipediaのReentrancy (computing)[7]の解説です。

このサイト「何個か問題がある」と警告が出ているので一端読んだ後、評価を保留にしていたんですがThread SafeとReentrancy (computing)の違いについて簡単で分かり易い具体例が示してあります。

この違いを理解した上で最初のサイト[6]では簡潔にReentrancy (computing)では、Thread Safeと違い、基本的にOne Threadの時代の話でhardware からの割り込みやrecursionなどの場合を想定していると結論づけています。

つまり関数の使用中にhardware からの割り込みやrecursionなどでその関数を別な目的で使用しても実装の結果が変わらないと言うのがReentrant Functionと言うわけです。

Reentrant Function を達成するためには、

  • Global 変数やstatic 変数は使用しない。
  • 関数内のコードは変化しない。
  • Reentrant が保証されていない別な関数は呼ばない。

などの条件を満たす必要があるそうです。

Reentrant expressionに戻りますが、Reentrant expressionと言う表現はUE4でしか使用されていないみたいです。Googleの検索で出て来た結果から推測すると、Reentrancyが保証されない時にReentrant expressionと言っているみたいです。

となると以下の事が考えられます。

  1. World Aligned Blend alphaの計算には、何らかのglobal 変数を使用している。
  2. そのglobal 変数はBlend Material Attributesの計算で値が変わる。
  3. よって、その値が変わったglobal 変数を使用して残りのWorld Aligned Blend alphaを計算する必要がある。
  4. 勿論、正しい値は出てこない。

あくまで推測ですが、そのglobal 変数とはPixel Normal WSでしょう。そしてそのPixel Normal WSの値はBlend Material Attributes内でnormalの計算を行っている時に書き変えられているのでしょう。

3.1.4 Tutorial の続き: 岩と草の間にDirtを追加

これは軽く説明されているだけなので今回はスキップします。

3.1.5 How to INSTANTLY TEXTURE your landscapes in UE4 - Unreal Engine tutorialを勉強してみて

結論を端的に言えば、このTutorialは崖の部分のPaintを行っただけです。

しかしそのやり方が超正統派のPhoto-realistic renderingに則っており、かつ細部における独自の工夫がUE4のMaterialの機能を完璧に理解していないと出来ない方法によってなされているため、最高Levelのtutorialに仕上がっています。

この作者、この若さでここまで出来るのですから、いわゆる天才でしょう。

この作者が作成するTutorialは全てチェックする価値があると思いました。

3.2 The Secret to Realistic Landscapes in Unreal Engine - UE4 Tutorial を勉強する。

Specular Channelの値をTextureのBase Colorに沿って半分にしました。そしてFresnel反射を利用してSpecular Channelの値を下げる箇所と下げない箇所を分けました。

Tutorial通りにやろうと思ったら、緑のMaterial Functionは元のままだし、Dirt は実装が変形し過ぎていまして、簡単には実装出来ない事が分かりました。

どうせ何回かはLandscapeを作成し直すのでその時にこれを実装する事にしました。

4.Foliageの改善(Cull Distanceの使用)

Cull DistanceはLandscape Grass type内で設定出来ました。

f:id:kazuhironagai77:20210404225202p:plain

更に3種類の草を追加しました。

f:id:kazuhironagai77:20210404225219p:plain

f:id:kazuhironagai77:20210404225226p:plain

f:id:kazuhironagai77:20210404225233p:plain

サイズを全部小さくしました。

f:id:kazuhironagai77:20210404225247p:plain

結果です。

f:id:kazuhironagai77:20210404225304p:plain

結構PCが音立てて計算しています。

負担が大きいのでしょうか?

5.水の追加

UIWS Water ManagerとUIWS Water Body を追加しました。

f:id:kazuhironagai77:20210404225328p:plain

こんな感じです。

f:id:kazuhironagai77:20210404225344p:plain

UIWS Water Body を使用しているので、何もしなくても波紋が出来ています。

f:id:kazuhironagai77:20210404225403p:plain

海です。

f:id:kazuhironagai77:20210404225420p:plain

今回はこれで十分です。

6.作成したLandscapeの直したい所

これで実際のProjectのlandscapeを作成使用と思いましたが、結構直したい個所があるのでもう一回だけ練習します。直したい個所を具体的に言うと

  • Landscapeの手直し
  • Material (緑、地面)の作成
  • Foliage の直し

です。

6.1 Landscapeの手直し

川沿いの土手の部分のmeshが荒く、滑らかさが失われています。

f:id:kazuhironagai77:20210404225509p:plain

f:id:kazuhironagai77:20210404225516p:plain

山のメッシュに捻じれた部分があります。

f:id:kazuhironagai77:20210404225534p:plain

f:id:kazuhironagai77:20210404225542p:plain

6.2 Material (緑、地面)の作成

How to HIDE Texture REPETITION in Unreal Engine[1]に書かれていたやり方で草と荒れ地のmaterialを作り直します。

Specular Channelの調節を最初から追加してプラスチック感を減らします。

6.3 Foliageの作成

Foliageの違和感が凄すぎます。違和感の原因を自分で考えると

  • 木がない。
  • 草の生え方が奇妙
  • 花がない。

が考えられます。

更にFoliageに関して言えば、以下の様なPluginもあるのでそれの活用も考えたいと思います。

f:id:kazuhironagai77:20210404225613p:plain

7.Landscapeの作成、もう一度

7.1 Landscapeをexportして修正

海の部分を深くします。

f:id:kazuhironagai77:20210404225640p:plain

もう一度Importします。

f:id:kazuhironagai77:20210404225656p:plain

上記の陸地と海の底の境目をスムーズにします。

f:id:kazuhironagai77:20210404225713p:plain

出来ました。

素早く楽にやるコツはCamera speed を6にセットする事です。

f:id:kazuhironagai77:20210404225727p:plain

今度は川を直していきます。

f:id:kazuhironagai77:20210404225750p:plain

更に全体的におかしい所を直します。

7.2 Materialを作成します。

土から作成します。

Base, roughness, normalで基礎を作成しました。

f:id:kazuhironagai77:20210404225810p:plain

こんな感じです。

f:id:kazuhironagai77:20210404225828p:plain

正直言ってこのTextureでは、あまり目立ちませんが、近づくとタイルが見えます。

f:id:kazuhironagai77:20210404225844p:plain

Macro variationを追加します。

f:id:kazuhironagai77:20210404225900p:plain

f:id:kazuhironagai77:20210404225908p:plain

正直このTextureにdistance blendingが必要とは思えませんが、以下のスクリーンショットを見ると少しはタイルタイルしていますので一応作成します。

f:id:kazuhironagai77:20210404225925p:plain

しました。

数値を適当にいじってみましたがあんまり差が出なかったです。

f:id:kazuhironagai77:20210404225943p:plain

後、並べ方を変えて見ました。

f:id:kazuhironagai77:20210404230015p:plain

少しは見やすくなったと思います。

Specular channelを調整します。

有りです。

f:id:kazuhironagai77:20210404230045p:plain

無しです。

f:id:kazuhironagai77:20210404230103p:plain

実装部です。

f:id:kazuhironagai77:20210404230118p:plain

有りと無しを比べると有りが圧倒的に良いですが、それでもまだプラスチックみたいです。もう少し下げてみます。

0にしました。正直0でも違和感ないですし、地面が光っているよりリアルに近い気がします。

f:id:kazuhironagai77:20210404230155p:plain

Play中の画面です。

f:id:kazuhironagai77:20210404230215p:plain

もう少し地面がデコボコしているとリアルな気がします。Displacement mappingを追加するか、Landscapeで地面に微妙な凹凸を形成したいです。

Landscapeから小さな凹凸を付けてみました。

滅茶苦茶リアルに感じます。見た目もリアルですが、移動するとデコボコの地面を走っているため、画面が微妙に上下します。それがリアル感を出しています。

f:id:kazuhironagai77:20210404230233p:plain

Landscapeから地面をもっとボコボコにしてみました。

f:id:kazuhironagai77:20210404230249p:plain

ちょっとデコボコ過ぎました。

f:id:kazuhironagai77:20210404230307p:plain

直します。

f:id:kazuhironagai77:20210404230321p:plain

うーん。やっぱりDisplacement mappingもあった方がよさそうです。ですがDisplacement mappingの勉強を今からやるのはちょっときついので来週にします。

7.3 海を作成します。

川や池、沼地の場所を先に把握したいので海を先に作成します。

こんな感じです。

f:id:kazuhironagai77:20210404230346p:plain

こっちの川がまったく水が流れていないので直します。

f:id:kazuhironagai77:20210404230402p:plain

水は流れる様に成りましたが崖の部分のMeshがグチャグチャです。

f:id:kazuhironagai77:20210404230420p:plain

直します。

f:id:kazuhironagai77:20210404230501p:plain

出来るだけ直しました。

f:id:kazuhironagai77:20210404230520p:plain

湿地帯を作って行きます。

f:id:kazuhironagai77:20210404230537p:plain

微調整を行います。

f:id:kazuhironagai77:20210404230553p:plain

正直しない方が良かったかもしれません。

7.4 崖を追加します。

地面をMaterial Functionにします。

f:id:kazuhironagai77:20210404230613p:plain

崖のMaterial Functionは3.1で作成した物をそのまま使用します。

更に3.1のTutorialで習ったWorld Aligned Blendのalpha値を使用した崖のPaintを使用しました。

f:id:kazuhironagai77:20210404230629p:plain

こんな感じです。

f:id:kazuhironagai77:20210404230651p:plain

近づくとこんな感じなので微調整をします。

f:id:kazuhironagai77:20210404230730p:plain

Material Instanceから微調整して、近距離では以下の様、

f:id:kazuhironagai77:20210404230747p:plain

遠距離では以下の様に、

f:id:kazuhironagai77:20210404230805p:plain

設定しました。

7.5 緑(草)のMaterial を追加します。

Starter KitにあったM_Ground_Grass を元に作成した、緑(草)のmaterialですが、見直したら、黄色と緑のParlin noiseなんかも使用していてまだ理解出来てない箇所がありました。のでそのまま使用する事にします。

f:id:kazuhironagai77:20210404230840p:plain

一生懸命自分で塗りました。

f:id:kazuhironagai77:20210404230859p:plain

7.6 Foliageを追加します。

これを使います。

f:id:kazuhironagai77:20210404230921p:plain

以下のMaterialを使用しました。

f:id:kazuhironagai77:20210404230937p:plain

f:id:kazuhironagai77:20210404230944p:plain

f:id:kazuhironagai77:20210404230951p:plain

f:id:kazuhironagai77:20210404230959p:plain

こんな感じに仕上がりました。

f:id:kazuhironagai77:20210404231016p:plain

今週はこの辺で止めておきます。

残りは来週やります。

8.まとめと感想

今週は、先週作成したLandscape の直し、先週やり残した2つのtutorialの勉強、そしてもう一度、新しいLandscapeを作成しました。

Landscape の直しでは以下の事をやりました。

  • Material instanceの作成。Material instanceを作成するとCompileしなくてもparameterの値を変えられるので3d view portを見ながら微調整が出来る。非常に便利。
  • Displacement Mappingについて。来週もっと勉強してLandscapeに使用する予定。
  • M_Ground_Grassの実装についての勉強。M_Ground_GrassStarter kitに付属のmaterial だか、実装方法が複雑で色々な機能が不明瞭な形で実装されている。(Macro varianceDistance blendingPerlin Noiseなど)

先週、やり残した2つのTutorialでは以下の事を勉強しました。

  • Texture SampleSampler Sourceについて
  • World Aligned Blendを使用して崖を見つける方法について
  • World Aligned Blendalpha値を使用する方法とReentrant expressionについて
  • Cull Distanceを使用する事で、Foliageの表示される範囲を自然かつPCに負担のないようにする方法について
  • UIWSを使用して水を表現。

もう一度、新しいLandscapeを作成した時に使用した機能です。

  • Specular Channelの値をあえて変更する。
  • Interactive Open world foliageを使用。

UE4のmaterialはC++でもShader 言語でも書けずBPを使用する事を強制される割に、3d Graphicsの数学と知識を総動員しないと理解出来ない、見た目とその難しさが真逆の分野と言う事が分かりました。更にmaterialの最適な値を見つけるためには実際の3D画面を見ながら細かい微調整が必要であり、芸術性が大きく要求される分野でもあります。

来週は以下の事をやろうと思っています。

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

以上です。

今週も疲れました。

8.参考文献(Reference

  1. Unreal Sensei. (2020a, August 7). How to HIDE Texture REPETITION in Unreal Engine - UE4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=yCRzOdo4b68
  2. Unreal Sensei. (2020b, August 8). How to INSTANTLY TEXTURE your landscapes in UE4 - Unreal Engine tutorial [Video]. YouTube. https://www.youtube.com/watch?v=mP8eHwVEA0o
  3. Unreal Sensei. (2020c, August 10). The Secret to Realistic Landscapes in Unreal Engine - UE4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=UIycCZl4lYE
  4. Epic Games. (n.d.). SamplerSource. Unreal Engine Documentation. Retrieved April 4, 2021, from https://docs.unrealengine.com/en-US/API/Runtime/Engine/Materials/UMaterialExpressionTextureSample/SamplerSource/index.html
  5. Mocrosoft, White, S., Satran, M., & Koren, A. (2017, February 8). Texture addressing modes - UWP applications. Microsoft Docs. https://docs.microsoft.com/en-us/windows/uwp/graphics-concepts/texture-addressing-modes
  6. (2018, April 26). Reentrant Function. https://www.geeksforgeeks.org/reentrant-function/
  7. Wikipedia contributors. (2021, February 4). Reentrancy (computing). Wikipedia. https://en.wikipedia.org/wiki/Reentrancy_(computing)