UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する。アニメレンダリングの勉強など 3

<前文>

DirectX 12を勉強したい>

本当に今更かもしれませんが、新しく買ったPCのOSはWindows 10なのでDirectX 12が動きます。

Open GLは昔勉強しましたが、Vulkanはほとんど弄った事はないです。

数年前にVulkanを勉強しようか、それともUE4を勉強しようか迷った挙句、私はUE4の勉強を選びました。

そして今に至る訳ですが、最近になってUEのMaterialの仕組みが理解出来るようになると、UEのMaterialを本当に理解するためには、DirectX 12そしてHLSLを理解しておく必要があるとより強く感じるようになりました。

それでDirectX 12とDirectX 12を通してHLSLを勉強したいんです。

といってもそんなに本格的な事をやりたいのではなくて、本当の基本を押さえておきたいんです。Pipelineがどうなっているのかとか、三角形を表示させるとか、HLSLが読める様になるとかのLevelです。(後、Deferred Renderingは実装してみたいです。)

それで、今週はDirectX 12並びにHLSLを勉強するためにはどんなTutorialがあるのかを調査しました。

まずYouTubeで検索しました。

そしたらあんまり見つからない。

DirectX 12って調べたら2015年に公開されているみたいで、7年も経っています。

それなのに決定版と言えるようなTutorialがないのでしょうか?

それとも見つからないだけなんでしょうか?

YouTubeで検索して見つかったのは以下の3つだけです。

DirectX 12 Advanced Tutorialです。

このTutorialは英語ですが作成しているのはドイツ人でした。

その題の通り基礎的な部分はあまり話していないみたいです。

DirectX 12 Rendererです。

ちらっとしか見ていませんが、Game Engineを作成する途中で、DirectX 12の勉強をしているみたいです。

WinAPI?について全く知らない私は、このTutorialを勉強するためには先にWinAPIの勉強が必要な気がします。

流石にWinAPIの本格的な勉強はしたくはないです。

しかしTutorialそのものは、しっかりしていそうです。しかも最も新しいTutorialは昨日の日付でUpされていました。

DirectX 12 3D Game Engine Seriesです。

これは何故か最初のTutorialだけ検索で表示されました。調べたら6本のVideoがありました。

作成されたのが2021年なのでそれなりに最新版に対応してそうです。

次にGoogleで検索しました。

最初のサイトは意味が分かりませんでした。DirectX 12に関係はあるんでしょうけど絶対必要なモノなのか、それともあると便利なモノなのか、それともDirectX12の一部の機能を強化するものなのか。良く分かりません。Skipします。

Direct3D 12 programming guideMicrosoftの公式のサイトでした。

当然、このサイトが一番信頼性は高いですが、初学者が一番理解し易いサイトかどうかは分かりません。少なくとも私にとっては、動画の方がサイトや本を読むより何倍も簡単に理解出来ます。

Learning DirectX 12 – Lesson 1 – Initialize DirectX 12は、かなりしっかり書かれている印象を受けました。しかし書かれた年を見ると2017年で、少し古いVersionの話しかないのかもしれません。

その後にも結構な量のTutorialがありました。

これ見ると、DirectX 12は動画で勉強するよりサイトや本で勉強するのが普通なのかもしれません。

HLSLのTutorialも調べて見ます。

YouTubeで検索しました。

Ben Cloward先生のしかなかった。

これ一個も見ていないんですが、DirectX 12も同時に教えるんでしょうか?

それともDirectX 11でHLSLを教えているんでしょうか?

Googleでも検索してみます。

Microsoftの公式のHLSLのサイトが出て来ました。

残りの検索結果は、DirectXのTutorial内でHLSLを教えるみたいな感じでした。

日本語のサイトも調べる事にします。

うーん。あんまり良いサイトは見つかりませんでした。

ただDirectX 12を勉強するためのお勧め本は見つかりました。

本か。

本って意外と新陳代謝が遅いと言うか、ほとんど新陳代謝しないんです。電気や熱力学みたいな永遠に変化しない分野を勉強するなら良いですが、Programmingみたく日進月歩な世界で本をMainに勉強するのは結構危険な気がします。

もう一つ、Programmingの勉強をするのに日本語の本でやるのは大きな問題があります。

それは日本における著作権の問題です。

この本にこう書かれていたけど実際に実装したら動きません。って問題が起きたとします。

これProgrammingの勉強していたら毎回、起きます。

それを公にして、どうしたら直せるのか、もしくは直せないのかなどをみんなに聞く事が出来ないんです。

いや出来るだろって思うかもしれませんが、それを聞くためには本に載っているTutorialそのものをまず書く必要が出て来るんです。

そしたら、他の人はその本を読まない、もしくは買わないでその本に載っている内容の一部を理解出来でしまいます。つまりその著者に入るお金の一部が無くなる訳です。いくら引用だとしても道義上の問題にはなるでしょう。

確かに著者に聞く事は出来ますが、著者だって読者一人一人のPCの環境や、その本で勉強する前にどれだけ関連する知識を持っているか。なんて情報は知りえる事は不可能です。だからその読者に対して適切な解答を答える事は不可能です。

じゃ、どうすればいいのかって、どうしようもないんです。

これYouTubeのTutorialだと、Comment欄でみんなに聞く事が出来ますし、同じ環境のUserは必ずどこかにいます。そしてどうやったら解決したのかの解答も必ず見つかります。

更に公開されている情報なのでいくら引用しても製作者に対しての金銭的な損失は生じにくいです。

いや、再生回数は減るだろうと言うかもしれませんが、質問者のTutorialの説明だけ聞いて元のTutorialの内容を確認しないで、その質問に解答する人いますか?

そんな不誠実な人が正しい解答出来るわけないです。更にそんな人が真面目に勉強しているCommunityに居続ける事は不可能でしょう。

と言う訳で、有料の本でProgrammingの勉強するのは全くお勧めしません。

そしてProgrammingの勉強は、ラノベやビジネス本のように寝っ転がって読んで理解出来るほど浅くはないです。

自分で実践してTutorialに書かれている通りにならなくて、色々試行錯誤を繰り返す必要が必ず出て来ます。そしてその段階では必ず誰かに聞いたり、ネットで検索したりする必要があるんです。

その誰かに聞いたり、また誰かの質問に答えたりする過程が、著しく制限されるんです。本(特に日本語の本!)で勉強すると。

と言う訳で一応、みんなが薦める日本語のDirectX 12の本は買って軽くは読んでみますが、主力の教科書として勉強する気はないです。

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

<本文>

1.今週の勉強について

今週も以下の内容についてやって行きます。

UE5を使用するものは新しいPCを使用します。UE4で作成しているものは今のPCでやります。

  • Niagara: CGHOW氏のTutorialをやる
  • Materialの勉強
  • RPGEventの作成
  • Open Worldの検証
  • Gaeaの勉強
  • 雪山のMapの作成
  • 報酬システムの研究
  • Anime Renderingの勉強

2.Niagara: CGHOW氏のTutorialをやる

今週もCGHOW氏の Collision Query | UE5 Niagara #ScratchPad Module #9 [1] の実装の続きをやっていきます。

2.1  Collision Query | UE5 Niagara #ScratchPad Module #9 [1] の実装の検証

先週は以下の部分まで実装しました。

このEffectNSを原点に置いたときだけ、こちらが期待した通りの効果を示します。

その理由をScratch Padの実装から考察します。

後、先週やったScratch Padの実装の意味についてもまだよくわかっていないので、それも考察します。

まず、簡単なScratch Padの実装から見てみます。

Query Mesh Distance Field GPUノードです。

このNodeは、Particleの位置とCollisionの何かとの距離を返しているはずです。

以下にこのNodeの解説を示します。

World 座標における指定された位置のGlobalなDistance Fieldを返すみたいです。

って何を言っているのか全く分かりません。

まず指定された位置は、この場合はParticleのPositionの事でしょう。そのParticleの位置に対してGlobalなDistance Fieldって何?

ここはGlobalは単にWorld座標と同義とみまします。

後はDistance Fieldがなんなのか分かりません。

分かりませんが、結果から推測するとCollisionしている箇所の事を指していると思われます。

つまりCollisionしている箇所の位置を0とすると意味が通じる気がします。

Distance Fieldは何のことか不明なので、とりあえずこのNodeのDistance To Nearist SurfaceがCollisionの位置からの距離を返すと仮定して先を見る事にします。

次のNodeです。

先程のCollisionの位置からの距離から何かを引いています。

[INPUT] Distanceの値でした。

Distanceの値を0とすると

本当にObjectとCollisionしているところだけ赤くなります。

Distanceの値を大きくすると

赤い部分が増えます。

この場合、Disanceの10はCollisionから10 cmの距離と言う事でしょう。

Collisionから10 cmの距離までに存在しているParticleが赤くなっています。

確認のためにDistanceの値を50にしてみました。

やっぱりCollisionの位置から50 cm以内にあるParticleが赤くなっています。

あるParticleがCollisionの位置から10 cmの距離にあったとします。

そしてDistanceが10だとすると、

10 - 10 = 0

で、このParticleの[Particle] Depth Outputは0になります。

その後のParticle Update SectionのColor ノードで

[PARTICLE] Depth Outputの値が0なら赤に指定しています。

辻褄はあっています。

他の値の場合も考えてみます。

Collisionの位置にあるParitcleの場合です。

この場合の Query Mesh Distance Field GPUノードの Distance To Nearist Surfaceの値は0になります。

次にSubtract ノードで10を引くので -10になります。

その次のDivide ノードですが、これはまだ考察していないので1で割ることにしてSkipします。

-10割る 1で-10のままです。

次にClampしています。

ここはSaturateノードを使用して計算Costを0にすべきだろう。とは思いますが、今回は計算Costを考えるのが目的ではないので、Tutorialのままにしておきます。

-10 はMinの0より小さい値なので0になります。

最後に0を[PARTICLE] Depth Outputの値として返します。

もちろん、値が0なのでParticleの色は赤くなります。

この考え方であってそうです。

最後に今までSkipしていたDivideノードについて考えます。

Divideは先程のSubtractノードで、そのParticleのCollisionからの距離からDistanceを引いた値を[INPUT] Fadeで割ります。

あるParticleがCollisionから15 cmの距離にあったとします。

Distanceは10なので10を引いて5になります。

5なのでClampした後の値は、1です。緑色になります。

ここでFadeの値が10だとします。

すると5を10で割るので、0.5 になります。

0.5を[PARTICLE] Depth Outputの値として返します。

するとParticleは黄色になります。

この考え方であっているのか試してみます。

Distanceを10にして、Fadeも10にしました。

結果です。

Collisionから大体15 cmぐらい離れている場所にあるParticleが黄色くなっています。

今度はFadeを100にしてみました。

元々の球の直径は1mで、Meshを生成するときに2倍にしているので今の球の直径は2mのはずです。

真ん中あたりが100 cmだとすると、Collisionから10 cmまでは赤色なはずです。

そこから100 cmの距離までは徐々に赤から緑になるはずです。

上の結果を見ると大体そんな感じになっています。

これでFadeの意味も分かりました。

最後に、このEffectがWorld 座標で0に置いたときにしか正常に機能しない理由ですが、

Query Mesh Distance Field GPUノードの Distance To Nearist Surfaceの値が、World 座標を

基準に返してるからだと思います。

これ、ParticleのPositionとかの値をうまく引いたら、どこに配置してもしっかり機能するEffectになると思われます。

ただ、今回はまだやる事がたくさんあるので実際に試して実装するのは止めておきます。

<実装を検証した結果についてのまとめ>

Query Mesh Distance Field GPUノードの Distance To Nearist Surfaceの返し値が実際に何を返しているのかは分かりませんでしたが、これがCollisionからのParticleの距離を返していると仮定すると全部辻褄が合います。

DistanceやFadeなどのInput値によるParticleの色の変化も理論通りになりました。

このEffectがWorld 座標で0の位置に配置した時だけ正常に働くのは、Query Mesh Distance Field GPUノードの Distance To Nearist Surfaceの返し値がWorld 座標で返しているからだと思われます。これは実際にテストして確認するところまではやりませんでした。

2.2  Collision Query | UE5 Niagara #ScratchPad Module #9 [1] の実装の続き

続きをやっていきます。

今度はParticleの大きさをDepth Outputの値と関連付けます。

まずParticle Update SectionにScale Sprite Size Moduleを追加します。

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

結果です。

Distance = 10, Fade = 10の条件です。

ParticleがCollisionのまわりだけになりました。

この後、TutorialはKill Moduleを使用してSizeが0のParticleを消したりしていますが、更に後で、それをするとCubeの位置が変更して球の別な箇所とCollisionした場合に、新しくParticleが生成されなくなる事が判明します。

のでTutorialでは、最終的にはKill Moduleを外してしまいます。

この部分の実装はSkipします。

今度は発生したParticleに動きを追加します。

Particle Update SecionにCurl Noise Force Moduleを追加します。

Curl Noise Force Moduleの設定です。

Previewの結果です。

生成されたParticleが飛び散っています。

実際のLevelでの結果です。

Screen Shotでは分かりませんが、生成されたParticleが飛び散っています。

Particleが最終的にはどっかに行ってしまう訳です。

このどこかに飛んで行ってしまうParticleを留めるための実装を追加します。

Particle Update SectionにSpring Force Moduleを追加します。

そしてSpring Force Moduleの設定を以下のようにします。

まずParticle Equilibrium PositionにConvert Position to Vectorをセットします。

次にInput Positionに[Particle][INITIAL]Positionをセットします。

最後にSpring Tightnessの値を5に変更します。

これで、Particleは最初に発生した場所の周りで移動するだけになります。

Gifを取ろうとしたら、まだ新しいPCにGif用のAppを入れていませんでした。

来週までには入れておきます。

大変綺麗です。

CGHOW氏のこの辺のParicleの動きの制御には、名人芸を感じます。流石です。

この辺の技術は自分のものにしたいですね。

今度は小さいけど激しく輝くParticleを追加します。

まずEmitterをDuplicateします。

Partucle Update SectionのCollision Query Moduleの

Distanceの値を5に変更します。

この辺の設定はお好みで良いと思います。

一応、大体はTutorial通りにやります。

次にParticle Update SectionのColor Moduleですが、

Tutorialの様に全部赤くしても面白くないので激しく白く光るように設定しました。

こんな感じです。

うーん。

球の淵も白だったか。

色を変えます。

青くしました。

次にParticleのサイズを変更します。

Particle Spawn Sectionにある Initialize Particle Moduleの

設定を以下のように変更して

青のParticleのサイズを小さくしました。

非常に綺麗です。

TutorialではCurl Noiseの値も変更していましたが、ここは同じにした方が、見えない波に全部のParticleが乗って揺れている感じが出ていい感じがします。

次にRender SectionのSprite Renderer Moduleの

Sorting Order Hintの値を1にします。

これは初めて使用しますね。

解説です。

うーん。読んでもみても要領を得ませんね。

同じSorting でもこっちはどんな基準でSortするのかはっきり理解できます。

Sorting Order Hintが1の場合は、0より後ろに配置されるんでしょうか?

その場合はカメラから見て後ろって事でいいんでしょうか?

しばらく眺めていたんですが分かりません。

このParameterは他のTutorialに出てきたときに勉強します。

次にMeshをSpriteの代わりに追加する方法について勉強します。

先程のEmitterをCtrl + Dで複製します。

複製した方のEmitterにMeshをParticleとして生成する実装を追加します。

Render SectionのSprite Renderer Moduleを消してMesh Renderer Moduleを代わりに追加します。

Tutorialでは以下の雲のようなMeshを追加していますが、

当然、こんなMeshは持っていないので、以下のSM_Rockで代用します。

SM_RockをMeshにセットしました。

結果です。

まあ、岩の大きさを考えたら当然こうなるわな。

流石、RTX 3070 tiです。

前のPCだったらこうなったら、PCがうなり声上げて、ギィァアッ!PCが壊れると私が焦りまくるんですが、全く問題なくRendering出来ています。

新しいPC、買って本当に良かった。

そういえばこのGraphics Card、Ray Tracingも出来るんだよな。

あー。

やりたい事が多すぎます。

それはともかくとしてMeshのサイズを小さくします。

Particle Spawn SectionのInitialize Particle Moduleの

Mesh AttributesのMesh Scale ModeにUniformをセットします。

そしてMesh Uniform Scaleのサイズを0.05にしました。

結果です。

何だこれ。

あ。

このEmitterで作成したMeshと球が干渉しあっているんです。

これどうやって直すんでしょうか?

CGHOW氏のTutorialを見た時は、こんな問題が起きる事、気が付きませんでした。

やっぱり自分で実装しないと勉強になりませんね。

Particle Update SectionのScale Sprite Size ModuleをScale Mesh Size Moduleに変更します。

設定を以下の様にします。

消したScale Sprite Size Moduleと同じ設定です。

ここのPointはScale FactorにVector from Floatをセットする事で、これをしないとLerp Floatが使用出来ません。

結果です。

MeshがCollisionの周りにしか発生しないので、結果的に球と他の位置でCollisionする事が無くなりました。

こんな簡単な解決法だったのか。

一寸、Meshが見えにくいので色を変えました。

サイズも少し小さくして発生する数も少し増やしました。

Meshの向きが全部同じ方向なのが変です。

これを直します。

Particle Spawn SectionにInitial Mesh Orientation Moduleを追加します。

Default値でMeshの角度をRandomに変更します。

結果です。

Meshの角度はバラバラになったんですが、今度は動いているときにも回転が欲しくなります。

それを追加します。

Particle Update SectionにUpdate Mesh Orientation Moduleを追加します。

Update Mesh Orientation Moduleの設定です。

一応、Tutorial通りに作成しましたが、絶対にこれをやらないといけないって感じではないです。

結果です。

Tutorialで別にCubeじゃなくても同じ結果になるとMonsterで示しています。

のでイスで試してみました。

Collisionの場所にSpriteやMeshが発生しているのが確認出来ました。

この後、何をしたかなと思ったらこの球に反射して映っている映像を追加したんでした。

それも実装してみましょう。

球のMaterialのEmissive Colorに以下の実装を追加しました。

Texture SampleノードにはTutorialと同じTextureがセットされています。

更にMain ノードのLighting Modeの設定をSurface Forward Shadingに変更します。

このParameterは全く弄った記憶がないです。

一体何を管理しているんでしょう?

解説を見ます。

うーん。

よくわかりません。後で調べます。

MetallicとSpecularに1をセットし、Roughnessに0.2をセットします。

Previewの結果を見るとこんな感じになりました。

風景が反射して映っていますね。

結果です。

うーん。

反射した風景はほとんど見えないですね。

以下のPowerノードのExpの値を2から1に変えました。

結果です。

球の反射面に風景が写っているのが見えます。

うーん。

何で?

これは後で検証します。

更にEmissive Colorの実装に以下に示したように反射光を追加しました。

更にDynamic Parameterを以下の様に変更しました。

そしてPartical Update SectionにDynamic Material Parameter Moduleを追加してここで値を調整できるようにしました。

私のは調整しなくてもきれいな反射が写っていますのでDefault値のままにしておきます。

これで終わりかと思ったら最後にもう一個、Postprocessを追加していました。

流石にPostprocessの勉強中でこれをSkipするわけにはいきません。

やります。

Postprocess Volumeを追加します。

Infinite Extent(Unbound)にCheckを入れます。

Vignette IntensityにCheckを入れて値を1にします。

結果です。

おお、四隅が黒くなっています。

そしてBloomを使用します。

設定は以下の通りです。

そういえば先週、これの設定について、実装した時にとことん検証すると言っていました。

これは後でやります。

結果です。

少しだけ画面が明るくなった気がします。

Bloomが掛かっているのかどうかは分かりませんね。

BloomなしのSpeculerです。

BloomありのSpecluarです。

うーん。微妙すぎます。

実装はこれでお終いです。

今週のNiagaraの勉強はここまでにして検証や考察などの残りは来週やる事にします。

3.Materialの勉強

あんまり、やる気が起きません。と言ってもMaterialの勉強に対してではなくBloom & Glow Post Process Effect - Shader Graph Basics - Episode 56 [3]の勉強の続きをやる事に対してです。

このTutorial、Unityでの実装はありますが、UEの実装はありません。その理由は先週のBlogにまとめましたが、

と言う訳です。

既にBen Cloward先生は次のTutorial SeriesであるAdvanced Materialsを始めています。

こっちの勉強したいです。

更に思い出したんですが、前のPCでは出来なかったTutorialもあります。

Creating Cubemaps - Shader Graph Basics - Episode 33 [4]です。これ2022-05-23のBlogで書いていますが、

DDS Formatに変換するPlug-inかAppがあってPlug-inはPhotoshopが必要で、AppはWindows10じゃないと動かなかったんです。

それでOnlineにあるDDS Formatに変換するサイトでDDSにしてUE4にImportしたら、

Errorになってしまったんです。

このTutorialは以下のTutorialのSeriesの中核をなしているTutorialで

このSeries全体がまだ勉強出来ていません。

こっちのTutorial Seriesも勉強したいですね。

更にPostprocessのTutorialでこれから勉強する必要があるのが、

これだけあります。

それで考えたんですが、一応、Unityの実装の最後までは勉強してその後で、もう一回、どうするのかを考える事にします。

どうせ今週は、Unityの実装を最後まで勉強したら、Materialの勉強をする時間は無くなってしまうと思われるからです。

3.1 Bloom & Glow Post Process Effect - Shader Graph Basics - Episode 56 [3]の勉強の続き

先週は、

のCoreの部分の実装までを勉強しました。

その続きをやっていきます。

今度はGlow部分の作成に必要な7つの要素を追加します。

7つの要素って何?と思ったら以下のSample Screenの事でした。

こんな感じで7つ作成しています。

これはOffsetをHexagonalに取るための実装で、それぞれのSample ScreenのOffsetに(0,0), (2,0), (-2,0), (1,2), (1,-2), (-1, 2), (-1, -2)を代入します。

これがHexagonalなの?あんまり実感湧かないです。

Unityの座標軸がどうなっているのかは知りませんが、以下の座標軸ではこんな結果になりました。

うーん。成程、確かにHexagonalです。

Weightですが、真ん中だけ0.3で、残りは0.1667です。

次にLODの値ですが、これはCoreと同じようにInputを作成します。

以下の様に作成しました。

Glow LODとGlow Cut OffをそれぞれのSample Screenに繋げます。

Glow Brightnessを以下の様に繋げます。

その結果を先程のCoreの計算結果に追加します。

結果です。

滅茶苦茶、Bloomしています。

うーん。これがBloomに必要な実装なのか!

Tutorialでは以下の部分の値を操作してBloomの強弱や範囲をControlしています。

その結果の一部を以下に示します。

うーん。

凄い。これは自分で実装して試してみたい。

最後にHaze効果を追加します。

まずHazeのSample Screenの設定ですがGlowと全く同じだそうです。

Glowと同じように7つのSample Screenノードをセットして、Glowと同じ様にOffsetとWeightもセットします。

Haze用のLODやCut Off、そしてBrightnessのInputを追加します。

Glowと同じ様に、LODやCut Offを繋ぎます。

結果をBrightnessの値で掛けます。

これもGlowと同じです。

そしてその結果をGlowの結果に足します。

これだとGlow効果を2回計算しているだけでは?

うーん。

でもこれで良いみたいです。

Tutorialではこの後に色々な結果を見せています。

その内の幾つかを以下に示します。

うーん。

UEでも実装してみたい。

3.2 Bloom & Glow Post Process Effect - Shader Graph Basics - Episode 56 [3]Comment欄を読む

そう言えばComment欄を見れば、実装出来た人がいるかもしれません。Comment欄を見てみましょう。

うーん。

やっぱしUEではLower ResolutionのScene TextureにAccessする事は出来ないみたいですね。

確かにこの人の言う通り、色々なParameterを自作したい人にとっては計算Costが余計にかかってもBloom効果を自作したい場合もあるのでしょうね。

PrismaticaDev氏って、私がDither Temporal AA Nodeの使い方を学んだTutorialを作成した人じゃないですか。2021-09-19のBlogでPrismaticaDev氏について書いています。

うわ。やっぱりBen Cloward先生のTutorialは見ている人も別格ですね。

Lower ResolutionのScene TextureにAccessするのは諦めて、自分で同じもしくは近い物を作成してしまおうという考えの人もいました。

で当然、Ben先生も同じ事は考えてやったけど駄目だったみたいですね。

うーん。

Gaussian Blurした後でLow ResolutionでBufferに保存する必要があるんですね。

これは無理ですわ。少なくとも今の私が実装するのは。

諦めるしかなさそうです。

マジか!

まあ、この人Fake のIDで書いてそうですが、それにしても生々しい話です。

私も似たような扱い受けた経験があります。かなり核心ついた質問したら、逆にバカにされて非常に頭に来ました。核心つき過ぎて、その解決策がないからバカにしてとぼける作戦だったんでしょうね。今、思い出すとそうとしか考えられません。

まさかUEのCommunityでそんな事がまかり通っているとは。

これはUnityのパワハラと同じ事がUEでも起きる前兆かもしれませんね。もしこの人の話が本当ならですが。

最後のCommentですが、

ひょっとすると、これは出来るかもしれませんね。

ただ今の私には半分くらいしか理解出来ませんが。

これ読んで結論が出ました。

自分で実装するのは諦めます。

次のTutorialを勉強する事にします。

3.3 追記

以下のPostprocessInputの番号がScreenのMipmapのResolutionを表しているらしい。という意見を聞きました。

これがBloomだけなのか、それともScreen全体なのかが良く分からないんですが、この番号による違いが全く分からないでいたので、そういう意味では普通の画面で試してみる価値はあると思います。

まず何もない状態です。

PostprocessInput0です。

比較して違いが分かるかと言うと分かりませんね。

PostprocessInput1です。

あれ、真っ黒ですね。

PostprocessInput2です。

うーん。画面が暗いだけじゃなくて画質が荒い感じがします。Low ResolutionのMipmapにAccess出来てそうですね。

PostprocessInput3です。

うーん。Low Resolutionなんでしょうか?

PostprocessInput0との差が分かりません。

以下のScreenshotはPostprocessInput3のscreenです。

赤い丸で囲った部分の木の枝が途中で切れています。

PostprocessInput0です。

全く同じでした。

この結果から考察するとPostprocessInput2はScreenのLow resolutionのMipmapを表していそうです。しかしその他のPostprocessInputは違いそうです。

まあ、良く分からないですね。これだけじゃ。

4.これからの勉強の予定について

もうやりたい事が多すぎて、何を勉強したいのかすら整理がついていません。

ので、ここで一端整理します。

<UE5.1

UE5.1がReleaseされた事すら忘れていました。

一寸だけUE5.1について勉強したい事をまとめておきます。

公式のUnreal Engine Public RoadmapのUnreal Engine 5.1 (IN PROGRESS) [2] には載ってないみたいですが、Foliageの木や草にNaniteが使用出来る様になるらしいです。Youtubeを見るとUE5.1 で木や草のfoliageにNaniteを使用した動画が上がっています。

これは絶対に試してみます。

とは言ってもNanite自体を勉強し始めたばっかしなので焦らずやっていきます。

UE 5.1のNiagaraではGPURibbonを使用出来るらしいです。

これは既にCGHOW氏が、UE 5.1 Niagara New Features [3]で解説しています。

ここではEmitterのVersionについての詳しい解説もありました。

これも試してみたいです。

<新しいPC

取りあえず以下の2つは必ずやります。

  • Niagara Fluid Simulation
  • Nanite

後、出来れば、Lyra Starter Gameでネットワークの基本を勉強したいです。

で追加でDirectX 12とHLSLの勉強をしたいです。

UE5がReleaseされた時、色々な動画でUE5の新しい機能が紹介されました。

その時は、それを指をくわえて見てるだけでした。

その辺を今から勉強したいです。

UE5がReleaseされた当時の動画などを見て何が新しかったのか確認します。

うーん。

見つからない。

何故か、あんなに沢山あったUE5の新しい機能の紹介動画が一個も検索に出て来ません。

何とか検索に引っかかったのが、Unreal Senseiの5 Reasons Unreal Engine 5 is a BIG DEAL [6]です。

この動画で述べられているUE5の最も優れた特徴は、

  • Lumen
  • Nanite
  • MegaScan Bridge
  • Metal Humans
  • UE4で作成したProjectUE4用のAssetがそのままUE5に移行できる事

でした。

これこれ。この話が聞きたかった。

Lumen、Nanite、MegaScan Bridgeの基礎は既に勉強し終わっています。

Metal Humansか。

あんまりPhoto-RealisticなModelには興味がないんです。これは興味が出た時に勉強します。

最後のUE4のProjectがそのままUE5に移行できる話ですが、これって4.25以降だったと思います。私のもう何年も前から作成しているRPGのVersionは4.24です。つまりそのままUE5に移行させる事は無理です。

サイトも調べて見ます。

まず公式のUnreal Engine Public Road MapのUnreal Engine 5.0 [5] を見ましたが、UE5がReleaseされた当時の内容と全然違う気がします。

確かにUE5がReleaseされた当時はLumenとNaniteが新しいUEの特徴として凄い騒がれていました。ただそれだけじゃなくて他にも騒がれていた機能があったはずです。

日本語でも検索してみました。

日本語のサイトでUE4とUE5の違いとは?新機能まとめてみた [7] がありました。だだしこっちのサイトは比較的最近書かれた内容で、UE5がReleaseされた当初に書かれてモノではないです。しかしUE4と比較してUE5の新しい機能を紹介しているので、内容としてはUE5がReleaseされた当時のUE5の新機能紹介と近い感じがします。

ここでは以下の5つの要素をUE5の新しい機能として紹介していました。

  • Nanite
  • Lumen
  • World Partition
  • Meta Sound
  • Editor内でのAnimation

NaniteとLumen以外にWorld Partitionが入っていますね。

これは納得で、World Compsitionより格段に使いやすく、作り易く、そして機能も優れています。

次のMeta SoundとAnimationについては全く勉強した事ないです。

多分、この2つが私が忘れているUE5がReleaseされた当時に騒がれた新機能だったんでしょう。

これらの勉強も、これから勉強したい事のListに追加しておきます。

それ以外の情報が見つかりません。

うーん。

自分のBlogでも調べました。

2021-06-07のBlogにUE5がReleaseされた当時、どんな新機能が紹介されていたのかの記録が詳細にされていました。

まず公式のHomepageを見ていますね。

ここでUE5の特徴として以下の6個が紹介されています。

なんだ、このSiteを見ればいいのか。と見に行ったんですが、この話は何処にも載っていなかったです。

ああ、成程。

Blogなら兎も角、Websiteだと常時、更新される訳で、今と当時では書かれている内容が全然違っている訳です。

で、私のBlogを元に当時、UE5の新しい機能として紹介されていた内容を復元します。

  • Nanite
  • Lumen
  • Animation
  • Meta Sound

でした。

うーん。

先程の日本語のサイトの情報とほぼ一緒ですね。

UE5の新しい機能で、私が全く勉強していないのは、AnimationとMeta Soundみたいです。

後、2021-06-07のBlogに当時のUE5の反響が引用元が分かる形で紹介されていました。

それも読んでみました。

大体が、凄い位の感想しか言っていませんね。

Unreal Senseiが歪みのあるMeshにはNaniteは適用できない。デモのGolemはSkeletal MeshだけどもSkewはないModelだからNaniteが使用出来た。と今聞いても鋭い意見を言っていました。

後、みんなが一様にUE5の新しい機能を紹介しているのに対してCGHOW氏が、UE5のNaniteの機能について紹介しているのを凄いと言っています。

ああ。

このBlogを書いたのが2021年の6月です。まだこの当時はNiagaraの勉強を始める前だったのでCGHOW氏について全く知らなかったんですね。

今は、CGHOW氏のTutorialのお陰でNaiagaraの基礎は大体理解しています。本当に感謝です。

そうだ、GoogleYouTubeの検索には引っかからなくても、UE関連の動画製作者のChannelに直接行けば、UE5がRelease された当時の動画が残っているはずです。

Smart Poly氏のChannelを見てみます。

ありました。

ここでは、勿論、Mega ScanとかUIの変更も紹介されていましたが、UE5の新機能として

  • Nanite
  • Lumen
  • World Partition

が紹介されていました。

まあ、妥当な感じです。

これらの動画を検証した結果、私がUE5の勉強で完全に忘れていたのは、

  • Animation
  • Meta Sound

の二つでした。

まあ、Animationは兎も角、Meta Soundはあんまり興味のない分野です。やりたくなった時に勉強する事にします。

一週間熟成させて、来週、この中から何を勉強するのかを決定します。

5.RPGEventの作成

今週は先週のSaveが出来なかった問題で変な風にSaveされているSub Levelを直すのと、Event完了を知らせるWidgetを武器を拾った時に表示させる実装を追加する事の2つをやります。

5.1 Sub Levelの修正

以下に示したSub Levelのサイズが異常に大きくて他のSub Levelに重なっています。

これを直します。

調べたらこのSub Levelはこの村のFloorであるMy_Map_Floorが属していて

それがこのSub Levelをこんなに巨大で他のSub Levelと重なったモノにしている原因でした。

つまり、このSub Levelは元々、この大きさで、更に他のSub Levelと重なっていたんです。先週のSaveが出来ない問題が起きたからこうなった訳ではなかったんです。

はい。

これは直す必要はないです。

5.2 武器を拾った時にEvent完了を知らせるWidgetを表示

この武器を拾った瞬間に開いているWidgetについては2022-09-05のBlogで調べてあります。

この部分です。

以下の様に実装を追加しました。

実装内容は武器を買った時とほとんど同じです。

ただ、違うのはこの武器を拾った場合、武器を拾うかどうかをUserに聞いてくるWidgetは武器を拾った瞬間に消えてしまいます。

のでEventの完了を告げるWidget内で

元のWidgetに戻る実装に以下のNodeを追加しました。

もしそのNodeが存在していたら表示して下さい。ぐらいの感じでしょうか?

うーん。

この書き方はあんまり良くないかもしれませんね。

Pickup Item Widgetが閉じた時に、Eventの完了を知らせるWidgetが開いた方が良いのかもしれません。

取りあえず、今の実装が正常に動くのかテストしてから考えます。

武器を拾うかどうかを聞いています。

拾うを選択すると、Event完了のWidgetが表示されました。

閉じるボタンを押すと、武器を買った時とは違い前に表示されていたWidgetは表示されません。前のWidgetは既にDestoryされているからです。

一応、このやり方でも出来ていますね。

じゃ、これで良いか。

うーん。一応、これで完成しました。

来週からバグ出しかPackagingの勉強をします。

6.Open Worldの検証

先週、作成したModelを新しいPCのUE5のProjectで作成し直します。

その前に何でOpen Worldの検証で建物の作成の勉強しているのかについて簡単にまとめておきます。

6.1 今までの勉強の簡単なまとめ

まずこの節の目的は、2022-08-29のBlogに書いてある通り、

です。

でGaeaで1009x1009のHeight Mapは無料で作成出来るんですが、それ以上大きなサイズは有料になります。それで流石にまだ有料版を買うほどGaeaに詳しくないので、後10個位、GaeaでLandscapeを作ってから有料版を買おうかなと思っています。

具体的には来年の夏ぐらいまでは無料版で勉強しようと思っています。

でその間にWorld Partition上でNaniteを使用する方法でも勉強しようと思ったら、前のPCではNaniteが動かなくなってしまったんです。調べたらUE5.0ではNaniteを動かすにはDirectX 12が必要です。ってありました。

なのでNaniteの勉強もお預けになってしまいました。

それで建物の作成方法を勉強する事にしました。

ここで良く分からないのが、建物の作成方法のTutorialが全くないんです。

どうやら建物を作成するDesigner達はかなり我流で建物を作成しているみたいで、全然、こうやるべきと言う指標が見つかりませんでした。

それなら取りあえず建物を自分で作成してみよう。となり今は、取りあえず建物を作成している次第です。

6.2 先週建てた建物を新しいPCのUE5のProjectで作成し直す

先週、夕方や夜になった時の建物内部の様子を見ようとしたら、

暗くなりません。

UE5で作り直します。

Project名はMyTestProject1です。

新しいMapを作成しました。

当然Open Worldです。

Directional Lightの向きを変えてみます。

暗くなりました。

こんな感じの家を作成しました。

流石に前回よりは大きくしました。

中を見せます。

ドアの開閉機能はまだ作成していないのでドアは外します。

この角度から見ると屋根が変ですね。

中に入ろうとしたら、段差がきつくて入れません。

階段を作成しました。

建物の中です。

なんと木の床がCollisionしません。

今度は内装を改良します。

こんな感じです。

当然ですが夜になると真っ暗です。

Screen Shotは夕方です。

ここにEffectを追加します。

今回はNiagara Mega VFX Pack vol.1を使用します。

以下のEffectを使用してみます。

こんな感じです。

これだと加工しなくてもそのまま使用できそうです。

こんな感じになりました。

蝋燭の炎はもっと小さくする必要があります。

暖炉内の炎は調節する必要は全くないみたいです。

単純にNSのサイズを小さくしても炎は小さくなりません。

NS_Flame_Singleを改良してロウソク用の火を作成します。

Particle Spawn SectionのInitialize Particle Moduleの

Sprite Sizeの値を変更します。

Spriteの大きさを100分の1ぐらいにしました。

更にParticle Spawn SectionのSphere Location Moduleの

Sphere Radiusを1cmにしました。

結果です。

ロウソクの大きさに合った炎が出来ました。

ちなみに暖炉の炎は外側には全くはみ出ていません。

はい。

それでは夜にしてみましょう。

うーん。

暗いですね。

これの調整は来週やります。

6.3 Naniteの勉強

本来なら、Naniteの勉強もここでする予定ですが、今週は何を勉強するのか全く考えていないかったので、来週からやる事にします。

7.Gaeaの勉強

7.1 Visual StudioをInstallすると必ず一緒にInstallされる良く分からないSoftについて

のっけからGaeaの勉強と関係ないですが、先週、Gaeaのところで、

と言っていたのでここに書く事にします。

前のPCでは、あんまりOS用のDriveとか、それ以前にStorageの容量とか気にしないでどんどんC DriveにInstallしていたら直ぐにパンパンになってしまいました。

それで整理しようとしたらWindows ○○とかMicrosoft○○みたいなSoftが大量にInstallされていました。

しかもこれ恐らくVisual StudioをInstallした時に同時にInstallされたみないなんですが、古いVisual StudioをUninstallしてもずっと残っています。

消したいんですが、消すと何か悪い影響が出そうで消せません。

のでずっと残っていました。

今度のPCでは絶対にそんな事態にさせません。

目を皿のようにしてどのSoftをInstallした時に、これらのSoftのどれが一緒にInstallされたかも全部、記録しておきます。

それは兎も角として、これらのSoftが一体どんな機能を担当しているのかを一寸調べました。

のでそれを一寸だけ記録しておきます。

Windows SDK

これは調べないでも知っています。Visual StudioC++を動かすのに必要なSoftです。これが無いと.Exe Fileが作れないはずです。

それぞれのWindowに対応していて、そのVersionじゃないと動かないはずです。

兎に角サイズが大きいです。消せるなら直ぐにでも消したいSoftです。

<Redistributable

これも知っています。

これが無いと.exe Fileが動かないはずです。

Visual Studo 2012で作成された.exe Fileを動かすためには、2012 Redistributableが必要です。Versionの違いで動かないかどうかは分かりません。数字の大きいVersionだけあれば全部動くんでしょうか?

<.NET

これ。

これが一体何のためにあるのか。

前に一回調べた時は、全く理解出来なかったので、もう一回調べました。

それで今回は、おぼろげながら理解出来たんでそれを記録しておきます。

まず.NETには色々な種類があります。CoreとかFrameworkです。でも全部一緒です。開発された目的は。

.NETで書かれたSoftはどのOSでも動くんです。

普通のSoftだとWindowsで書いたSoftはWindowsでしか動きません。でも.NETで書いたSoftはどのOSでも動くんです。

いや動かないんじゃね。

というのも多分あると思います。

だからこの.NETの最も大きな目的であるどのOSでも動く。と言うのを.NETが段々主張しなくなったんです。

それで.NETについて良く知らない人達が混乱する事態になったんだと思います。

これValkanの開発に似てると思います。

OpenGLが出来た時、どのPlatformでも動く3D APIと言うのが売りでした。ところがその後継のVulkanはAppleのMantleを開発した技術者を引き抜いて、ほぼ丸々MantleをCopyして開発したのでAppleを怒らせてしまい、Apple製品では動かなくされてしまいました。

じゃWindowでは動くのかと言うとWindowsにはDirectX 12があるのでVulkan要らない。となっています。

OpenGLの最大の売りである「どのPlatformでも動く。」が、その後継であるVulkanでは全く言えない状態になってしまいました。

で.NETの公式サイト [9]を見ると「.NETはOpen Source」とか最初に書かれていて.NETについて良く知らない人達は混乱する訳です。

これが.NETが良く分からなくなった原因の一つだと思っています。

次に.NETが良く分からん理由に、色々な言語で書けて、複数の言語で一つのAPPに出来る。と言うのがあります。

例えばWebの開発で、FrontendにHTML、OSSJavascriptそしてBackendにRubyとか使用するけど、それとは違うの?となります。

しかも.NETの公式サイトを見ると

Webを作成するために使用出来ます。って書かれています。

しかも言語を見ると

3つしかSupportしていません。

しかもVisual Basicなんてもう死んだ言語ですし、F#なんて言語も私は聞いた事がありません。実質C#しかないじゃん。

となります。

で、これも推測なんですが以下の様な事があったと思っています。

Javaが出来た時「これが高級言語か。」って凄い騒がれたはずです。今のPythonみたいな感じで「こんな書きやすい言語初めて見たわ。」と。もう「Computer言語はJava一択でいいんじゃない。」とまで言われるようになったと思います。

それでMicrosoftが焦って、Javaそっくりの言語を開発したんです。それがC#です。

しかしC#Javaを丸Copyしました。とは言えません。それをはっきり言うと見もふたもないので、色々言っていました。

それがこの色々な言語が動く。と言う事の本質なんじゃないのか。と思います。

つまり、.NETとはC#をPCやMacで動かすために必要なモノ、C++でいう所のWindows SDKやRedistributableのC#版なんだと解釈しました。

そういう目で.NETを見ると

まずSDKというのがあります。

これはC#でCodeを書くのに必要なんでしょう。これはC++にとってのWindows Software Development Kitと同じはずです。

次にTargeting Packです。これC++のRedistributableと同じかと思ったら違いました。

調べたら以下のような感じでした。

.NET Frameworkの4.6でAppを作成したとします。これ.NET Frameworkの4.6のある環境でしか動かないそうです。で顧客のPCには.NET Frameworkの4.5しか動きません。となったとします。

その時に、.NET Frameworkの4.6のSDKを使用してAPPを作成しているんだけれども、.NET Frameworkの4.5で動くようにしたい。となります。

それを可能にするのが4.5のTarget Packだそうです。

このTarget Packがあると別なVersionの.NETで動くAppが作成出来ると言う訳です。

つまりC++ではUser側が動かしたいSoftを動かすためにRedesitributeをInstallしますが、C#では製作者側がUserの環境で動くようにTarget PackをInstallする訳です。

これで.NETについて大体理解出来ました。

蛇足を足しますが、ここで書いた内容は、まあ、私の単なる想像ですが、中らずといえども遠からず。だと思っています。

更に、この辺の細かい事情は、C#でAppを何個か作成したら、この辺の実態は、直ぐに自明の事になるでしょう。C#で何かのAPPを作成する時に、この推測がどれくらい当たっているのか確認する事にします。

で、最大の関心のこのSoft消していいのか?ですが、恐らく消せないと思います。

その理由ですが、UE4で必要と思います。

というのはUE4にはC#で書かれている箇所があるからです。ので消せないと思います。

SQL Server

これらは調べる時間が無かったので今回はパスします。

7.2 先週作成したMaterialを使用してLandscapeを作成する

今週もHow To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [10]の続きをやっていきます。

先週、それぞれのLayerがLandscapeのどの範囲を示しているのかを表すために、Materialを作成しました。

これを使用してLandscapeを作成します。

MapはOpen World用のMapは使用しませんでした。Landscapeのサイズは1009m x 1009mなのでWorld Partitionを使用する必要はないと思います。

ProjectはMyTestProject1を使用しています。

取りあえず以下の設定でやってみます。

Editable Edit LayersにCheckを入れます。

これ、何でCheckする必要があるのか、前に勉強したんですが、忘れました。

後で復習します。

Default値のままです。

これがEpic Gameの推薦する設定どおりかは確認していません。

取りあえずLandscapeを作成してLayer毎に色付けするのが目的ですので。

結果です。

これは高さのScaleが間違っていますね。

OutlinerからLandscapeを選択して

Scaleのzの設定を100から30に変更しました。

結果です。

今度はいい感じです。

これ見ると雪の箇所が多いですね。

更に、緑をもっと弱くして本物の緑に近づけます。

結果です。

Grassは地面という事にして茶色くしました。

近づいてみました。

うーん。

Z軸のScaleは30 でもまだ大きすぎるかもしれません。

Third Personで歩いてみます。

良い感じです。

未踏の惑星を探索している感じです。

空飛んで、一気に隣の山に行きたいです。

水のLayerを付けた箇所は平になっていました。

実際のHeight Mapはこの水の底の部分のDataがあると思うんですがどうなんでしょう。

後で確認します。

水のLayerが水面より上に貼られています。

これを見ると人力で微調整する必要はありますね。

この辺は船で移動できるようにしたら壮観な眺めになりそうです。

Landscapeの歪み具合ですが、以下に示した様に激しく隆起している箇所でもそんなに不自然には感じません。

Exponential Height FogのZの位置を上げて、Landscape全体にFogが掛かるようにしました。

結果です。

うーん。凄く綺麗。

Directiona Lightの角度を変えて夕方にしましたがLandscapeは全く影響受けていません。

暗くしてもLandscapeは明るいです。

うーん。

何で?

この辺の設定は後で調査します。夜は地面も暗くなってほしいです。

今週のGaeaの勉強はここまでとします。

8.雪山のMapの作成

今週もVolumetric Cloudの勉強をしていきます。

せっかくなんで。5.1 Previewでやる事にします。

8.1 UE5.1 PreviewでVolumetric Cloudを勉強する

新しいProject名は MyTestProject2にします。

Projectを開いたら以下の表示がされました。

Project Settingから以下の様にセットしました。

たぶん、これであっているでしょう。

ProjectをRestartします。

Virtual Shadow Mapってどんな機能なんでしょう。

これも後で調べます。

今度は警告は表示されなくなりました。

その前にProjectを作成する時に、なんかをInstallするのを許可しますか?

と出てきました。

勿論、はい。を押しましたが、後でProgramを調べてみたら、案の定、新しいRedistributableがInstallされていました。

新しいPCを買ってまだ2週間しか経っていませんが、既にC++ 2015-2019 Redistributableが6種類も入っています。

今のところ、InstallしてあるすべてのProgramは以下の様になっています。

C Driveの空き容量は以下の様になっています。

油断してどんどんCにInstallしていたら瞬く間に一杯になりそうです。

C DriveにInstallするProgramは厳選する必要があります。

今度はPluginを開いてVolumetricsを使用できるようにしました。

こっちも再起動しました。

Volumetric Folderにある Volumetric_Sky_Prototype_Mapを開いてみます。

結果です。

雲がないですね。

それはともかく海が凄いです。

流石に本当の海とは違いますが、今までの水面と比較すると格段に本物感があります。

もう片方のMapも開いたんですが、全く同じMapの様に見えました。

ので最初のMapを使用します。

Volumetric Cloud用のMaterialを見たらこんなにありました。

先週、調査したMaterialの数は9個です。ここには12個のMaterialと7個のMaterial Instanceがあります。

Volumetric_Sky_Prototype_Map のVolumetric CloudのMaterialにDefaultでセットされている

M_VolumetricCloud_02_Profiles_PaintClouds_Morningを開いてみると

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

これはかなり整理されているんじゃないでしょうか?

先週見た5.0の同じ名前のMaterialは

こんな感じです。

これと比較してもかなり整理されている気がします。

これを読んでみます。

8.2  M_VolumetricCloud_02_Profiles_PaintClouds_Morningを読む

念のためにMapとこのMaterialのCopyを作成しました。

こっちを見ていきます。

まずLerpノードとかMultiplyノード名前に番号を追加します。

Copyした方のMaterialなので実装を改造しても大丈夫でしょう。

以下の様にComment欄に番号を書いていきます。

番号の順番は、Lerpで検索して出てきた順です。

今度はMultiplyに番号を振っていきます。

全部で40個ありました。

今度はAddノードです。

Subtractノードも見てみます。

Divideノードもついでに見ます。

後は実際にNodeを見ながら番号を振っていきます。

Main ノードです。

設定もいつものやつでした。

Albedoから見てみます。

Multiply #1 ノードがありました。

実装が簡単そうなAの方を追います。

Lerp #8ノードがありました。

AとBは普通ですね。

AlphaにPowerノードが付いています。

あ、Powerノードにも番号を振ります。

振りました。

このPowerノードの番号は4でした。

Expの値にDark Powerという名前のParameterノードが繋がっています。

Default値が0.5になっています。

まあContrastを与えるためでしょうね。

Baseの方ですが、おそらく雲の高低を示す値を計算する実装がくるはずです。

地面に近いほど白く、つまり0、地面から離れるほど青く、つまり1になる実装です。

見てみましょう。

まずMask(G)ノードがありました。

これも番号振っておきます。

このComponent Maskの番号は7でした。

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

うーん。

何だこれ?

よし、今週はこれを勉強する事にします。

8.3 Cloud map output (1-transmission)を読む

まあ、今週はこのBlockが何を計算しているのかを理解できるぐらいを目標にします。

まず準備段階として番号を振ってないNodeに番号を振りました。

ただし、このMaterial内で一個しか使用されていないNodeには番号は振りません。

この赤線で囲った部分の実装は、

Flowmaps_2Dノードの計算結果を0と1に還元するための計算でしょう。

するとこのFlowmaps_2Dノードが何を計算しているのかが分かればいいです。

Flowmaps_2DノードはMaterial Functionです。

実装を見てみましょう。

む。そんなに複雑じゃないかもしれません。

一寸、読んでみます。

まずLerpのAlphaに以下に示したSineノードが使用されています。

これを見ると時間によって0と1を変化させているようです。

あれ、TextureのMip Levelを指定しています。

UE5.1だとMip Levelの指定出来るの?

と思ったらこれはTexture Sampleノードに対してで、Screenに対してでは無かったです。

で、ここからが分からない。

LerpのAとBにパスされているTextureが全く同じものなんです。それだけじゃなくて

真っ黒なんです。

あ。分かりました。

この部分の実装は使用していないんです。

何を入れても結果は0か1になるように設定しているんです。

そして以下の部分に戻ってきます。

どっちのParameterが採用されるのかは分かりませんが、時間の変化やRenderingされるPixelの位置に関係なく、全く同じ結果が返されるはずです。

うーん。

これであっているでしょう。

9.報酬システムの研究

先週、以下の様に書いて終わりましたが、この一週間、何も考えていませんでした。

ので今週は、待機用のLevelの作成を行います。

9.1 待機用のLevelの構成について

Projectは5.1で作成します。Project名はH x Monsterにします。

元々、H x HとPokemonの面白さを合わせた戦闘システムの開発が目的でしたので。

今回、作成するのは待機画面で、以下の要素が必要です。

  • 戦闘に参加する
  • 買い物をする
  • ルーレットをする
  • Monsterの傷を癒す

これ以外も必要かもしれませんが、取りあえずはこれだけにしておきます。

使用するAssetは

を考えています。

4人並べて、それぞれに話しかける事で、

  • 戦闘に参加する
  • 買い物をする
  • ルーレットをする
  • Monsterの傷を癒す

が可能になるように使用と思っています。

キャラクターは以下のを使用しようと思っているんですが、

このAsset、5.0に対応していません。

うーん。

このAssetのためだけに新しいPCにUE4をInstallするのか。

一寸考えます。

今週はGraymanを配置しておくだけでもいいかもしれません。

どうせ直ぐに5.0に対応するでしょう。

9.2 待機用のLevelの作成

まず新しいProjectを5.1で作成しました。

待機用のLevelを作成します。

Assetを追加します。と言っても5.1には追加出来ないので、5.0のMyTestProject1に追加してそこからMigrateします。

あれ、Envrionment Pack1という名前のAssetがありません。

仕方ないです。

Lowpoly medieval Constructionだけ先にやります。

出来ました。

調べたら、Environment Pack1じゃなくてInfinite BladeのCastleでした。

Mannequinを配置してBookmark0をセットしました。

ここに建物の内部を作成していきます。

こんなの作ってみました。

横から見たところです。

なんかすごい警告が出ています。

5.0で作成した方が良かった。

今週はこのまま最後までやってみますが、来週は5.0で作り直すかもしれません。

こんな感じになりました。

うーん。

これはダメですね。

明るすぎます。

おそらくこのAssetはEmpyなLevelに配置する事を前提にして制作されたと思われます。

このProjectは削除しました。

新しいProjectを5.0.3で作成します。

作り直しました。

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

良く考えたら、真っ暗なLevelにWidgetで5つのボタンを作っても良かった気がします。

10.Anime Renderingの勉強

10.1 Vroidで作成したModelをUEにImportするの続き

よくよく考えたら、VRM4UのMaterialの実装を読んでいるのにVRM4Uの引用元を記録するのを忘れていました。VRM4Uの公式のサイト[11] です。

今週もMF_VrmMToonBaseの実装を読んで勉強します。

先週は、Outline Blockの

Opacity, Opacity Maskの実装を読んで、

どうもこれがOutlineを作成しているらしい。と言うところで終了しました。

何故、この実装がOutlineの作成に繋がるのかは全く分かりません。

M_VrmMToonBaseOpaqueに戻って

Opacity並びにOpacity Maskの実装がどうなっているのかを確認します。

あれ、OpacityとOpacity Maskの値、上書きされています。

DitherAlphaを使用するかどうかについて聞いています。

これはDither Temporal AAノードを使用しているんでしょう。

やっぱりそうでした。

Materialの節でDither Temporal AAノードを勉強したTutorialを作成したPrismaticaDev氏について語ったら、Dither Temporal AAノードが出て来ます。

先週のBloomと言い、天に導かれて勉強してる感じがします。

2021-09-19のBlogでDither Temporal AAノードについて勉強した内容がまとめられています。

Dither Temporal AAノードの先を見ると、しっかりとMF_VrmMToonBaseのOpacity並びにOpacity Maskの計算結果を使用していました。

うーん。

ここまでOpacityとOpacity Maskの実装を読みましたが、この実装で何故Outlineが生じるのか分かりません。

以下のScreenshotはVroidの腕の部分を拡大しました。

これ見ると輪郭線出ている気がします。

SK_Test1でどのMaterialを使用しているのか確認します。

M_N00_005_01_Tops_01_CLOTH__Instance_でした。

Material Instanceですね。

Outlineを調べます。

あれ、B use Outline Onlyしかありません。B use Outlineは?

親クラスのMI_VrmMToonOptUnlitOpaqueTwoSidedを見てみます。

これもないです。

ひょっとして最終的な親Materialは別なのを使用しているの?

親クラスです。

まだMaterial Instanceです。

これもB use Outlineはないです。

親クラスのMI_VrmMToonBaseUnlitOpaqueです。

これもMaterial Functionです。

ああ、ありました。

Defaultでtrueになっていました。

うーん。

でもその下のParameterでOutineの色が白にセットされていたり、OutlineのWidthが0になっていたりしています。

よし考えました。

以下の実験をします。

新しいLevelを作成してSM_MatPreviewMesh_02を配置します。

これのMaterialにM_VrmMToonBaseOpaqueを丸コピーしたM_MyVrmMToonBaseOpaqueのInstanceであるM_MyVrmMToonBaseOpaque_Instを使用します。

以下の様になりました。

ここで以下のOutlineのParameterを弄って見ようと思います。

まずはb Use Outline Onlyです。

結果です。

うーん。全部消えてしまいましたね。

でもこれは予測通りです。

次はMtoon_OutlineWidthです。

これの値を増やしてみます。

100000まで増やしましたが、

Outlineは現れませんでした。

この後色々なParameterを弄りましたがOutlineは現れませんでした。

うーん。

これはVroidのModelの方にも何か秘密があるのかもしれませんね。

Vroidの服にM_MyVrmMToonBaseOpaque_Instを使用してみます。

Use Outline OnlyにCheckを入れます。

服は消えましたがOutlineは出て来てないです。

この後、色々Parameterを弄りましたがOutlineが表示される事な無かったです。

うーん。

良く分かりません。

ただOutlineの実装を見る限り、Outlineを抽出する理論は確立されていると考えられます。

流石に、最初から全部理解出来るとは思って勉強始めた訳ではないですが、ここまで複雑だとは。

今のところ、五里霧中です。一寸、今の自分の実力では難しすぎる内容かもしれません。

一寸、保留してこれからどう勉強すべきかを一週間かけて考えます。

今週のVroidのMaterialの勉強はここまでにしておきます。

10.2 公式のDocumentStylized Rendering [12]の勉強

先週、今までのStylized Renderingの勉強をまとめました。

それでLandscape用のMaterialの実装についての勉強がほとんどしてない事に気が付きました。

ので今週からLandscapeに使用されているMaterialを見る事にします。

Landscapeを調べると

以下のMaterial Instanceが使用されていました。

この親Materialの

実装です。

これを見て勉強します。

まずはMain ノードです。

MetallicとSpecularが0でRoughnessが1です。これはStylized Renderingの他のMaterialと一緒ですね。

あ、そうだ番号振るの忘れていました。

以下に示した様に、Constant、Parameter、一個しか使用していないNode以外の全てのNodeに番号を振りました。

それではSwitchの続きを見て行きます。

Disance ColorizeというBoolean型のParameterが付いていますね。

これはStylized Renderingのための実装というより距離によってTilingのサイズを変更するための実装っぽいですね。

Trueの場合の実装です。

Distance Blend #1ノードがありますね。これDefault値だと120m先は真っ黒にするみたいですね。

Titlingとかの解消じゃなくて単に真っ黒にするんですね。

一寸、確認します。

思いっきり効いていました。

カメラに近い箇所は普通に写っていますが、遠くは黒くなっています。

実際の値は以下のようになっていました。

UUはcmなので5mから暗くなっています。そしてその先の22.5 m先から完全に暗くなるはずです。

でも黒くなっていませんね。

良く見たら黒じゃなかったです。

でも深緑一色で塗られているのは間違いないです。

以下に拡大したScreenshotを示しました。

カメラに近い箇所は道路は灰色、地面は緑や茶色です。所がカメラから遠い箇所は全部深緑一色になっています。

うーん。

これは実装を見るまでは気が付きませんでしたが、かなり良い実装です。

何で実際に歩くと、100m移動しただけでも結構、時間がかかるのに、私が作成したGame内だと一瞬で移動出来てしまうのか、ずっと謎だったんです。

その原因が霧を実装した時に分かったんです。

人間、目で次に何が起きるのか確認しながら移動しているんです。

駅から職場に移動する時とか考えてみて下さい。

あそこはよく自転車が飛び出してくる。とかあの看板のせいで先が見えない。とか次に何が起きるのか予測不可能な個所が結構あります。

そういうのが、あると移動に時間がかかるんです。だって安全を確認する必要があるじゃないですか。

私が作成したGame内だとそれがなかったんです。だから100mどころか1 km あっても直ぐに移動出来てしまったんです。

それが霧を追加した途端に、Game内でも移動先が予測不可能な事態が発生しそうな箇所になったんです。

それから移動に凄く時間がかかるようになり1kmのLandscapeでも端まで移動出来なくなりました。後、一寸進んだら端に到達するかもしれませんが、しないかもしれない。その確認が出来ない状態で進むのは物凄く勇気がいります。

そしてこのLandscapeの色が変わるのは、霧の効果と同じような意味を持たせる事が出来そうです。

しかし、たった5m先までしかはっきりと見えないのか。これは100m移動するのも骨が折れそうです。

やっぱし、Stylized RenderingのMaterialの実装は読んでも理解出来ますね。

VroidのMaterialの実装を理解するのかかなり大変そうです。今のところは、何をやっているのか全然分かりません。

まあ、慌てずにゆっくりやっていきます。

10.3  法線転写をUEで実装する方法を検証

Historiaさんの[UE4] 動的法線転写について[10]を勉強します。

今週は、先週勉強していて疑問だった以下の部分について調査、検証します。

<World Position ノードについて>

World Positinノードの返し値はVector3だと思うんですが、それを確認したいんです。

しかし公式のDocumentが見つかりません。

色々考えた結果、以下の方法でWorld Position ノードの返し値が何であるかを証明しました。

World Positionの返し値をDebug Float 4 ValuesノードのVector 4に繋ぎます。

その結果、Errorになります。

そのErrorの内容を見ると以下の様に書かれています。

Float 3からFloat 4にCast出来ないよ。とあります。

つまりWorld Positionの返し値はVector 3であってるって事です。

Vector 3からVector 4を引くとどうなるのか?>

次はSubtract ノードです。

これはDocumentに書いてあるでしょう。調べます。

公式のDocumentのMath Expressions [13]にSubtractノードについての説明がありました。

AとBの値は必ず同じ数の要素に揃える必要がある。と書かれています。もしくは片方だけ要素数が1である必要がある。と書かれています。

これ見る限りはVector 3からVector 4を引くのは駄目みたいですね。Errorは起きてないので、この説明が間違っている可能性もありますね。

実際どうなるのか試してみます。

あれれ、Vector 3からVector 4を引いたらErrorになりました。

Errorの説明です。

うん。

Math Expressions [13]の説明通りです。

World Positionに変更してもErrorのままです。

うーん。どういう事?

Subtract ノードのBに繋がっているConstant をParameterに変換したらErrorが消えました。

うーん。どういう事?

Debug Float 4 Valueノードをまた付けてみました。

Errorになっています。

Debug float 4はFloat3をFloat4に変換出来ません。と言っています。

つまりこのSubtractノードはVector 3を返してるはずです。

ならば以下のように実装してSubtractノードの計算結果を確認します。

結果です。

これ見ると、Parameterの4つの要素の内の最初の3つがVector 3の3つの要素にそれぞれ対応しています。

どうやら、Subtractノードの謎が解けたようです。

まずSubractノードのAとBにVectorを繋げる場合は必ず要素の数を同じにする必要があります。もしくはVector対Scalerの様に沢山の要素のあるVectorに対して、一個の要素しかないScalerを使用するかです。

Vector3からVector4を引く事は出来ません。

しかしParameterノードの場合は違います。

この場合は、Vector4の最初の3つの要素をそれぞれVector3から引く事になります。

更に新しい事実が判明しました。

Constant 3 Vector

Parameterに変換すると

なんと4つの要素のあるParameterになります。

つまり3つの要素しかないParameterは元から存在していませんでした。

だから、先程の実装で

一見、Vector 3からVector 4を引いているように見えた訳です。

うーん。納得しました。

今週は、一寸回り道をしてしまいましたが、のんびり勉強していきます。

11. Direct X12を勉強する

11.1 Visual Studioの環境設定の調査

今週は、取りあえずVisual studioをInstallするところからやります。

で.netをInstallする必要があるのかが分かりません。

勉強するためのMainのTutorialに使用と思っている

は、DirectX 12の勉強が始まる前に何と29個のTutorialがありその一番最初のTutorialであるGame Engine Programming 001 - Introduction | C++ Game Engine [14]で

WPFを使用しています。

NET Coreって書かれていますが、何の説明もありません。

このTutorialでは、Game EngineのLevel EditorをC# で作成すると言っているので.NETが入っているのは当然なのかもしれません。

下のTutorialの一番最初であるC++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [15]では

全くのEmpty Projectを使用しています。

でもこのTutorialもVisual Studioの環境設定についての解説は全くありません。

日本語の本は以下の3つを買ってきました。

  • DirectX12の魔導書
  • HLSLシェーダーの魔導書
  • Direct3D12 ゲームグラフィックス実践ガイド

この中で、Visual Studioの環境設定について述べているのはDirect3D12 ゲームグラフィックス実践ガイドだけです。

それ見るとDirectX12だけを動かすなら.NETは要らないみたいです。

  • C++によるDesktop開発
  • C++によるGame開発

だけCheckしていました。

どうせならVisual Studio 2022をInstallしたいんですが、全部のTutorialで2019を使用しています。

ああ。そうだ。

Visual StudioはUE5にも必要なんだ。

UE5用のVisual Studioの環境設定を調べていたらHow to Setup Visual Studio 2022 for Unreal Engine [16]で以下のSoftをIncludeしていました。

しかしComment欄で.NET Core 3.1 Runtimeが必要だと。とありました。

うーん。

勿論、Install出来るだけしてしまうのも一つの手ですが、今回のPCには最低限の必要なProgramだけInstallしたいんです。

.NETだけ後からInstallする方法は勿論あるんでしょうが、そのやり方が分かりません。

調べたらcommand promptからやる方法は見つかったんですが、私は昔Linuxを勉強していた時、一晩掛けて書いたC++のCodeのFileを間違ったCommandを入れて全部消してしまった事があって、それ以来極力command prompt関連を触るのは最後の手段にしています。

ので他の方法がある場合は他の手段を選択します。

以下に示したVisual Studio Installerの変更ボタンを押したら

馴染みのScreenが出て来ました。

これで変更出来そうですね。

それよりもVisual Studio 2019のセットアップ [17] によると

と書かれていました。

言語は英語に統一しとくか。

後はWPF .NETについて調べておきます。一応、

をMainに勉強するつもりなんで。

最初のTutorialのホントの最初だけ見たんですが、この人の英語非常に聞き取り易いです。

が、稀にRの発音にAccentが有って、小さい時にAmericaに移民したのかな。と思っていたら、なんとオランダの人でした。

オランダ人がオランダ語で話しているとアメリカ人には米語に聞こえる。とは聞いていましたが、ここまで発音が米語に近いとは。

オランダはあんなにイギリスに近いのに、オランダ人のしゃべる英語の発音は米語そのもの。とは色々な人から聞いていましたが本当にそうでした。

Desktop Guide (WPF .NET) [18]によると

となっていました。

いや.NET 5って何ですか?

調べたらCoreとFrameworkが合体した新しい.NETだそうです。

ふーん。

よし!

決めました。

Visual Studio 2022に

更に上記の条件に.NET Core 3.1 Runtimeが入っていなかったら追加します。

.NETのRuntimeはSDKの中に入っているとどこかで読みました。ので上記の条件で既に.NET Core 3.1 SDKが入っている場合は.NET Core 3.1 Runtimeは追加しません。

をInstallします。

そして言語の設定は英語一択にします。

そして最も大事な事ですが、絶対にC DriveにはInstallさせません。D DriveにInstallさせます。

Visual Studio Installerを見るとInstallの場所という選択肢があるのが分かります。

これでD Driveを必ず選択します。

Visual Studioはこの環境設定で行く事にします。

11.2 Visual StudioInstallする

今、InstallされているProgrammingは以下のもので全部です。

Visual Studio InstallerをInstallします。

必要なSoftを選択します。

.NETデスクトップ開発、C++によるデスクトップ開発を選択しました。

C++によるゲーム開発を選択しました。

Windows 10 SDK (10.0.19041.0)が選択されています。

Windows 11 SDK(10.0.22621.0)を追加で選択しました。

Windows 10 SDK (10.0.20348.0)がありますね。こっちの方が番号が大きいです。

うーん。

取りあえずは元から選択されているSDKを使用します。

あれ、こっちでもWindows 10 SDKWindows 11 SDKを選択しています。

確認したらどちらかにCheckを入れると両方選択されます。

ここでは追加でUnreal EngineインストーラーとUnreal Engine用のAndoriod IDEのサポートも選択しました。

個別のComponentです。

.NET Core 3.1 ランタイム(LTS)のCheckを追加しました。

言語Packです。

日本語を外して英語を選択しました。

はい。Insall先です。

全部 C:Driveになっています。

D:Driveに変更しました。

これであっているでしょう。

Installします。

ここまで調べてInstall後にVisual Studioが起動しなかったら涙ものです。

Install終わりました。

再起動した方がいいよ。と表示されたのではい。を押しました。が再起動しませんね。

Visual Studioも勝手には起動しません。

うーん。

Installerにある起動ボタンを押すべきか?

少しだけもっと待つべきか?

起動させちゃいました。

Sign inしたら普通に起動しました。

出来ました。

この後の設定は来週やります。

DesktopにVSのIconを置いておきたいのですが、やり方が分かりません。

取りあえずTask Barにセットしておきました。

今日InstallしたProgramを以下に記録します。

この表示はどのDriveにInstallされたのか分からないですね。

CとDの容量は以下の様になりました。

以上です。

12.まとめと感想

今週は、新しいPCを買った事で前から勉強したかったDirectX 12を調べたりして、その分、Anime Renderingに費やす時間が少なくなってしまいました。

後、Blenderの勉強はすっかり忘れてしまいました。

まあ、そう言う事もあります。Blenderの勉強は時期を見て復活させます。

13.参照Reference

[1] CGHOW. (2022, June 12). Unreal Engine 5 Niagara Beginner Tutorial - UE5 Niagara Starter Course! [Video]. YouTube. https://www.youtube.com/watch?v=NcJ1ZP7tFUk

[2] CGHOW. (2022, October 10). UE 5.1 Niagara New Features. YouTube. https://www.youtube.com/watch?v=Vdkge_5E1kY

[3] Ben Cloward. (2022, August 11). Bloom & Glow Post Process Effect - Shader Graph Basics - Episode 56 [Video]. https://www.youtube.com/watch?v=kRIUsIO16yI

[4] Ben Cloward. (2022, February 10). Creating Cubemaps - Shader Graph Basics - Episode 33. YouTube. https://www.youtube.com/watch?v=HA0xXiqxA54

[5] Unreal Engine Public Roadmap. (2022, January). Unreal Engine 5.1 (in Progress).  https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/tabs/80-unreal-engine-5-1-in-progress

[6] Unreal Sensei. (2022, April 6). 5 Reasons Unreal Engine 5 is a BIG DEAL [Video]. YouTube. https://www.youtube.com/watch?v=cRLnR4Kot2M

[7] UE4とUE5の違いとは?新機能まとめてみた. (2022, August 11). Zenn. https://zenn.dev/daichi_gamedev/articles/ue4-ue5-difference

[8] Smart Poly. (2021, May 27). Unreal Engine 5 - NEW FEATURES & OPEN WORLD TOOLS EXPLAINED [Video]. YouTube. https://www.youtube.com/watch?v=krQvEY82TdY

[9] Microsoft. (n.d.). What is .NET? An open-source developer platform. https://dotnet.microsoft.com/en-us/learn/dotnet/what-is-dotnet

[10] Klaus. (2022, July 6). How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=ej2b-zWoYiM

[11] Harube, R. (n.d.-b). VRM4U. VRM4U. https://ruyo.github.io/VRM4U/

[12] Stylized Rendering. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/Resources/Showcases/Stylized/

[13] Math Expressions. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/ExpressionReference/Math/

[14] Game Engine Series. (2020, June 27). Game Engine Programming 001 - Introduction | C++ Game Engine [Video]. YouTube. https://www.youtube.com/watch?v=hRL56gXqj-4

[15] OlympusMonsTutorials. (2021, February 17). C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [Video]. https://www.youtube.com/watch?v=2vrEIhAajhM

[16] Flopperam. (2022, January 18). How to Setup Visual Studio 2022 for Unreal Engine [Video]. https://www.youtube.com/watch?v=8xJRr6Yr_LU

[17] Visual Studio 2019のセットアップ|Unreal Engine 5から始める C++ & Blueprint. (n.d.). Zenn. https://zenn.dev/posita33/books/ue5_starter_cpp_and_bp_001/viewer/chap_01_vs2019_setup

[18] What is Windows Presentation Foundation - WPF .NET. (2022, September 22). Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/desktop/wpf/overview/?view=netdesktop-6.0