UE4の勉強記録

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

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

<前文>

DirectX 12を使用するためのVisual StudioのConfiguration のSettingについて>

今週もDirectX 12についてです。

OpenGLを勉強した時は、GLFWなどのWindowを作成するためのLibraryを使用出来る様にするためやOpenGLそのものを使用出来る様にするためにVisual StudioのConfigurationの設定を変更しました。

これらのVisual StudioのConfigurationの設定方法は、多少の違いがあるにしても、ほとんど同じやり方で誰が説明しても大体同じです。

これらと同様の設定をDirectX 12でもVisual Studioで行うと思っていたんですが、何かかなり様子が違います。

まずDirectX 12におけるWindowの作成方法ですが、ほとんどのTutorialがWindow APIを使用していますがWPFを使用している人もいました。

これらの機能を使用するためのConfigurationの設定方法が今一良く分かりません。

OpenGLだとGLFWを使用するためには、一番分かり易い説明をしているSetup OpenGL in Visual Studio 2022 for C/C++ Development [1] を参考に説明しますが、

まずGLFWをVS内で使用出来る様にするために、Propertiesを開いて

GLFWのInclude Folderを

以下の場所に追加します。

次にGLFWのLib Folderの中から適切なものを選び

LinkerのGeneralのAdditional Library Directoriesに追加します。

最後に以下のLibを

LinkerのInputのAdditional Dependenciesに追加します。

この設定はOpenOpengl32.libを追加する以外は、ほぼほぼGLFWをVisual Studio内で使用するための設定です。

Visual Studio内でWindow APIWPFを使用する場合に、Configurationでどんな設定をする必要があるのかが全く分からないんです。

それぞれのTutorialでVisual StudioのConfigurationの設定方法についての説明があるんですが、バラバラで一貫性が見出せません。

これ私がWindow APIWPFを知らないからそう見えるだけで、実際は同じ事をしているのかどうか全く不明です。

以下にそれぞれのTutorialでどんな説明をしているのかを簡単にまとめます。

DirectX 12 Advanced Tutorial

これVisual studioのConfigurationの設定方法に関する説明は全くないです。Advancedとあるだけに、そう言う基礎は全く説明していませんでした。

DirectX 12 Renderer

このTutorial自体は素晴らしいんですが、この最初のTutorialがGame Engine Programmingの29講目なんです。

既にWindowとか完成した状態で始まっています。

一番最初のTutorialはGame Engine Programming 001 - Introduction | C++ Game Engine [2] でした。これを見るとWPFを使用しています。

WPFの設定は常識過ぎて解説していなだけなのか分かりませんがイキナリ以下のWindow(WPF)を選択してCodeを書き始めています。

Visual StudioのConfigurationの設定については、詳しい解説付きで説明していますが、その説明を聞いている限りではWPFを使用するための設定変更ではないみたいです。

DirectX 12 3D Game Engine Series

このTutorial Seriesの一番最初のTutorialはC++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [3] です。

ここでは、VSのConfigurationの設定について詳しく説明しています。

ただそのほとんどはGame Engineを作成するために生成されるOutputを保存するFolderを変えるための設定みたいです。

唯一Window作成のための設定かも知れないと思ったのは以下の部分だけでした。

うーん。

でも今、見直すとかなり分かり易い説明しています。

こっちを主軸で勉強した方がいいかも知れないです。

Learning DirectX 12 – Lesson 1 – Initialize DirectX 12

これもあんまりConfigurationについては書いていません。

C++ 3D DirectX Tutorial

これはDirectX 12ではなくてDirectX 11のTutorialですが、DirectX 12を初心者が勉強しても理解出来ないのでDirectX 11を先に勉強すべき。と製作者が言ってこのTutorialを始めています。

このTutorialではVSのConfigurationの設定を詳しく解説しています。

しかしそれはWindowを生成するための設定ではないです。

<ここまで調べて考えた仮説>

うーん。

何か見えて来ました。

OpenGLでWindowを作成する時は、GLFWをVisual Studioにセットする必要がありましたが、ひょっとするとWindow APIWPFを使用する場合は、何もVisual Studioの設定を変える必要はないのかもしれません。

そしてVisual StudioのConfigurationの設定はそれぞれのTutorialの目的に最適化するための設定な気がしてきました。

だからいくらそれぞれのTutorialのVisual StudioのConfigurationの設定方法を見ても一貫性が見つからなかったんだと思います。

これはまだ仮説ですが、今週のDirectX 12の勉強で確認します。

こんなのWindow APIWPFを使った事のある人達からしたら常識過ぎる話かもしれませんが、こんな感じでのんびりとDirectX 12の学習をこれからやっていきます。

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

<本文>

1.今週の勉強について

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

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

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

2.Niagara: CGHOW氏のTutorialをやる

2.1  Collision Query | UE5 Niagara #ScratchPad Module #9 [4] の総括

先週、以下の様に述べましたが、

今調べたら、検証や考察したい内容はScratch Padの部分ではなくBloomの部分でした。

これはこのTutorial Seriesを勉強する目的からすればおまけの部分です。のでやっぱりやるの止めました。

その代り、今までの勉強を振り返ってそれぞれのBlogで何を勉強したのかについてまとめ、最後に総括します。

2022-09-19Blog

このTutorialが25分もある事に驚いています。

ただし一回、動画を見たら、そのほとんどがScratch Padの勉強ではなくScratch Pad以外のEmitterの設定方法についてでした。と書いていました。

なのでScratch Padだけを勉強するなら10分位の部分だけ勉強すれば良いと結論づけていました。

そしてそれを分かった上で、Niagara全体の勉強も込み込みで全部、勉強すると決めました。

この週は、Tutorialを最後まで見て実装方法をまとめるところまでやる。と言っていますが、途中で、何をやっているのか理解出来なくなってそこで中止しています。

2022-09-26Blog

先週の続きをやっています。所が途中でイスが壊れてしまい、勉強を中止しました。

2022-10-10Blog

最後までTutorialの実装についてまとめました。

ここでBloomについて調査しています。

その後で、自分で実装しています。

Scratch Padの実装までやっています。

2022-10-16Blog

先週のBlogです。このTutorialを最後までやりました。最後の方はPostprocessの調整とかです。

VFXをGameに追加する時、Postprocessまで弄る事出来るんでしょうか?

Postprocessの範囲を戦闘シーンの回りとかで限定して行うんでしょうか?

実際のGameでVFXをPostprocess込みで使用出来る事が確認出来ないと、何かあんまり勉強する気にはなれません。

<まとめと感想>

約一カ月もこのTutorialの勉強に掛けていたので、凄い大変なTutorialだった印象がありますが、実際はその内の2週間はお休みしていたので、こうやってまとめてみると普通のTutorialを勉強したのとそんない変わりなかったです。

Scratch Padについては、以下に示した様に[INPUT] New Collision QueryとQuery Mesh Distance Field GPUノードを知っているかどうかだけが重要なPointです。

[INPUT] New Collision QueryとQuery Mesh Distance Field GPUノードが存在する事を知っていれば、Collision部分をNiagara内で判別出来きるようになります。

後、注目すべきCurl Noise Force Moduleの使用方法としてSpring Force Moduleと併用する事で、Particleを一定の場所に留めておく方法を勉強しました。

CGHOW氏はCurl Noise Force Moduleを使用に関しては本当に超一級の技の持ち主です。

2.2 Particle Attribute Reader | UE5 Niagara #ScratchPad Module #10 [5] を勉強する

とうとうParticle Attribute Readerまで来ました。

ほとんどこれが勉強したいがためにここまでやって来たと言っても過言ではありません。

で、これを勉強する前に今までParticle Attribute Readerについてどんな勉強をしていたのかを先に復習します。

2.3 Particle Attribute Readerについての今までの勉強内容を確認する

2022-02-06Blog

ここではCGHOW氏が新年の祝いで特別に実装を公開したHappy New Year ! | Download Free UE4 Niagara Project [6]で

Eventを通してEmitter同時を繋げる方法がある事を知りました。

このやり方を勉強しようと調べていたら、大体は理解出来たんですが、以下に示したSpawn Particle from Other Emitter Moduleの意味が分かりません。

Spawn Particle from Other Emitter Moduleを調べていたらContent ExampleにSampleがある事が分かりました。

しかしそれ以上の事は分からず、詰まってしまいました。

そしたら日本語のサイトである【UE4.26】Niagara Advanced 解説基礎編~Particle Attribute Reader~ [7]に詳しい解説がありました。

ここでこのやり方はEventとは全く違うやり方でEmitter同士を繋げてる事。Particle Attribute Readerを使用している事などを知りました。

2022-02-06のBlogではParticle Attribute Readerを使用した場合、Eventを使用した場合と比較して以下の様な特徴があるとまとめています。

それでEventの仕組みのまだ完全に理解していないのに、急遽Particle Attribute Readerも勉強する事にしました。

2022-02-21Blog

ここからParticle Attribute Readerの勉強が始まります。

CGHOW氏のParticle Attribute Reader in UE4 Niagara Tutorial | Download Project Files [8]で勉強する事に決めました。

以下に示した様にEmitterが一個の赤いParticleを生成してその他のEmitterがそのParticleを追いかける様なParticleを生成する事は出来たんですが、

赤いParticleの数が増えると、別のEmitterで生成した青いParticleは赤のParticleを追いかけなくなってしまいました。

まず、成功したEmitterが一個の赤いParticleを生成してその他のEmitterがそのParticleを追いかける様なParticleを生成する場合の実装ですが、

Scratch Pad Moduleを追加し

以下の実装を行う事で、達成します。

次の赤いParticleの数が増えると、別のEmitterで生成した青いParticleは赤のParticleを追いかけなくなってしまったんですが、

Content Exampleにある以下の例が、全く同じ事を実装していてしかも正常に動いています。

このCodeを検証した所、Tutorialと全く同じやり方をしていました。

で、何でTutorialは動かないんだ。と調べたら

何とOne minusノードの代わりにSubtractノードを使用したら直りました。

<2022-02-28のBlog

何で、One minusノードの代わりにSubtractノードを使用したら直ったのがずっと検証しています。

そしてOne Minusノードは

を計算していてSubtractノードは、A-1を計算している事に気が付きました。

ああ。

これはかなり恥ずかしいMISSです。

これ、私が勝手にOne MinusノードをSubtractノードの代わりに使用したんでした。

ずっと、One MinusノードとSubtractノードのA-1が同じ計算をしていると思っていました。

あー。

今、思い出しても恥ずかしいです。

この後、前の週に勉強したParticle Attribute Reader in UE4 Niagara Tutorial | Download Project Files [8]の不明な点やあやふやな点を検証しています。

その結果、自分で以下の様なNSを作成して

複数の赤いParticleを追いかける別のEmitterから生成された青いParticleの実装を、Particle Attribute Readerを使用して作成する事に成功しました。

複数の赤いParticleを追いかける別のEmitterから生成された青いParticleは、以下の実装で作成しました。

ここのPointは、

それぞれの赤いParticleのIDを求めるのではなく、赤いParticleの生成された数を求めて、その数の範囲にRandomなNumberを生成し、そのNumberを青いParticleに伝え、そのIDを持つ赤いParticleを追いかけろ。と命令する所です。

Randomにそれぞれの青いParticleに番号を割り振るので、全体としては均等に分割されます。

ここで一応、Particle Attribute Readerの使い方の基礎は理解出来たとして、Particle Attribute Readerの勉強は終了しました。

<Particle Attribute Readerについてのまとめと感想>

こうやってまとめるとかなり簡潔に整理されて、Particle Attribute Readerの使用方法について結構理解出来てたと思えるかもしれませんが、実際のBlogを読むとかなり混乱した書き方をしています。

それでも最後に自分独自のNSを作成して、一応、複数のParticleに対してParticle Attribute Readerを使用する事で2つのEmitterを繋げる事に成功しました。

今度、勉強する時はもっと実装をシンプルな状態にして、Particle Attribute Readerの使い方に集中したいですね。

2.4 Particle Attribute Reader | UE5 Niagara #ScratchPad Module #10 [5] を勉強する(2度目)

今までParticle Attribute Readerについてどんな勉強をしたのかについて大体思い出したので、このTutorialをやっていきます。

まず、一回全部見ました。

このTutorialでは以下に示した2つのNSを実装します。

こっちは最初のEmitterで強く光っているParticleを作成し、その次のEmitterで淡い光のParticleを作成しています。

淡い光のParticleのサイズや色は、最初の強く光っているParticleに依存しています。Particleの位置だけでなく、サイズや色もパスしています。

こっちはContent Exampleにあったヤツです。最初からこれを作成する方法を紹介しています。

見た感じ、特に新しい技術が採用されている訳でもないので、直ぐに実装します。

2.5 Particle Attribute Reader | UE5 Niagara #ScratchPad Module #10 [5] を実装する

いつものようにFountain Templateを追加してNSを作成しました。

まずEmitterをDuplicateします。

Emitterの名前をSourceとFollowersに変更します。

EmitterのSourceの方のModuleの設定を弄って以下の様にしました。

この辺の設定はもう自明なので記録しません。

EmitterのFollowersの方は色を緑に変えました。

要らないModuleを全部消します。

速度関連のModuleを消すのはいつも通りですが、今回はParticleが発生するLocationを指定するModuleも消しています。

Particle Update SectionにScratch Padを追加します。

Map Get ノードに[INPUT] New Particle Attribute Readerを追加します。

そしてGet Vector by Indexノードを繋げます。

ここでExtractするVectorはPositionになります。

その結果をMap SetにあらかじめSetしておいた[PARTICLE] Positionにセットします。

更に、Scratch Moduleの設定のEmitter NameにParticle Attribute Readerが読み込むEmitterの名前を追加します。

結果です。

この実装では一番最初に生成された赤いParticleにすべての緑のParticleがついていってしまいます。

ので以下に示した様にGet Vector by IndexノードのParticle Indexの値をMap Getノードの+に繋げて、[INPUT] Particle Indexを作成してNSから指定出来るようにします。

そしてParticle Indexの値を以下に示したようRandom Range Intで指定します。

これにより個々の緑のParticleは0から10の間の値のIndex Numberを持つそれぞれの赤のParticleを追いかえることになります。

結果です。

緑のParticleで赤のParticleを追いかけないのがありますね。

たぶん、生成された時に、そのIndex Numberを持つ赤いParticleがなかったんでしょうね。

ここで、緑のParticleの調整をするのかと思ったらおもむろに赤のParticleの色をRandomにします。

Particle Spawn Sectionの

Initialize Particle ModuleのColor ModeをRandom Hue/Saturation/Valueにセットし、Hue Shift RangeをXは-1.0、Yは1.0にセットします。

すると以下に示した様に今まで赤かったParticleの色がRandomになります。

今度は緑のParticleのEmitterの設定を変更します。

Particle Spawn SectionのInitalize Particle Moduleの

Uniform Sprite Sizeを100にセットし

ColorのAlpha値の値を0.01 にします。

この辺は見栄えの調整ですのでサラッといきます。

結果です。

又、Scratch Padの実装に戻ります。

今度はScratch PadでSource Emitterで生成されたParticleの色の情報を得るための実装を行います。

と思ったら、Get Vector by IndexノードのParticle Indexの値を先程のInputからではなくExecution Indexノードから得るように変えてしまいました。

Execution Index ノードって何をするNodeなんでしょう?

以下の説明がされていました。

今実行されているParticleのIndex Numberを返すみたいです。

まあ、Ramdom Numberを返してるのとそんなに変わらないですね。

結果です。

FollowersのEmitterから生成される緑のParticleの中でSourceのEmitterから生成されるParticle

を追わないParticleがあるのは、その緑のParticleが生成された時に、Source のEmitterから生成されたParticleがないためです。

これをなくすためには、FollowersのEmitterのSpawn RateをSourceのEmitterのSpawn Rateと同じにする必要があります。

しました。

FollowersのEmitterから生成される緑のParticleの中でSourceのEmitterから生成されるParticle

を追わないParticle が無くなりました。

いや、この実装は色を変える前にやるべきだろう。

色を変える途中にやったら学習者は混乱します。

Get Color by Indexノートを繋げてSource EmitterでExecuteされているParticleの色を得ます。

その結果をMap Set ノードにセットした[PARTICLE] Colorにセットします。

これだとAlphaの値も変わってしまうと思われますがどうするんでしょうか?

結果です。

はい。

やっぱりそうなりました。

直します。

結果です。

良い感じです。

Alphaの値をNSから指定できるようにしました。

Tutorialと同じようにAlphaの値を0.001にセットしました。

結果です。

凄い綺麗になりました。

最後に同様の方法でParticleのサイズも変更します。

結果です。

Source EmitterのParticleのサイズに比例してFollowersのEmitterのParticleのサイズも変化しています。

この例では一個のParticleに一個のParticleが繋がっています。

一個のParticleにたくさんのParticleを繋げるためにはどうしたらいいのかを次の例で示します。

まず最初に、新しいNSを作成します。

中を開きます。

Emitterの要らないModuleを全部消します。

Emitterの名前もLeaderに変更しました。

設定を弄って5つのParticleが一篇に一度だけ生成されるようにしました。

更に一度生成されたParticleは消えないようにしました。

やり方はいつもやっている方法なのでSkipします。

このEmitterをCopyして新しいEmitterを作成しました。

このEmitterの名前はFollowerです。

Particleの生成される数を100に増やしました。

更に生成されたParticleの色は緑にしました。

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

これで準備が出来ました。

この緑のParticleを赤のParticleの周りを飛ぶようにします。

まずFollowerのEmitterのShap Location Moduleを消してScratch Pad Moduleを代わりに入れます。

Scratch Padを開いてMap Getノードに[INPUT] New Particle Attribute Readerを追加します。

更にGet ID at Spawn Indexノードを追加します。

この値をPassするParameterですが、新しく作成します。

Niagara IDです。

これだと分かりにくいので名前を変更し、NamescapeもLocalからParticleに変更します。

名前もNamespace変わってしまいましたが、このParameterのTypeはNiagra ID

のままなはずです。

ここに 先程のGet ID at Spawn Indexノードの結果を追加しました。

更にGet ID at Spawn IndexノードのSpawn Indexの値を以下の方法で計算します。

Randomに選ぶやつです。

これで結果的に公平にFollowerで生成されるParticleをばらけるさせることができます。

今度はParticle Update SectionにScratch Pad Moduleを追加して

以下の実装を行います。

ここで先程作成した[PARTICLE] MyIDをMap Getノードに追加します。

これは分かるのですが、この追加のさせ方が独特で、本当にこれで [PARTICLE] MyIDの値を得る事が出来るのか不思議に思います。

まずNiagara IDの新しいParameterを作成します。

これのNamespaceと名前を [PARTICLE] MyIDに変更します。

これで [PARTICLE] MyIDの値を得ることが出来るみたいです。

その後は、Get Position by IDで得た値をMat Set Moduleにセットした[PARTICLE] Positionにセットします。

結果です。

緑のParticleが完全に赤のParticleに重なってしまっているのでOffsetを追加します。

以下の様に実装を変えました。

そしてOffsetの値をNSから以下の様にSetしました。

結果です。

あっは。

出来ています。

最後に微調整して以下に示した様になりました。

最後にLeaderのEmitterのParticle Update SectionにCurl Noise Force Moduleを追加し、赤いParticleが動くようにします。

結果です。

まだ新しいPCにGifを撮れるAPPをInstallしていないのでScreenshotで示します。

以上でした。

2.6 Particle Attribute Reader | UE5 Niagara #ScratchPad Module #10 [5] を勉強した感想やまとめなど

実装方法自体は前に勉強した内容とほとんど同じでした。

ただ前よりはかなり簡単で整理された内容になっていました。

前の回のCollision Queryの使用方法を教える時と比較すると格段に整理されています。

しかしじゃ凄く分かり易い説明かと言うとそんな事はなくて、ある程度、Particle Attribute Readerの仕組みを理解している人向けと言う気がしました。

例えば、このTutorialではSourceのEmitterのそれぞれのParticleをIDやIndexで識別していますが、このIDやIndexが何なのかParticle Attribute Readerを始めて学ぶ人達は知らないと思います。しかしこのTutorialではIDやIndexについての説明は全く無かったです。

後、Eventと比較した場合、Particle Attribute Readerを使用する長短の解説も欲しかったです。

その辺の説明はきちんとした方がもっと分かり易くなったと思いました。

そう言う不満な点はありますが、結論としてはこのTutorialで勉強した結果、Particle Attribute Readerノードの基本は普通に扱えるようになったと思います。

3.Materialの勉強

もうBloomの勉強は諦めました。次のTutorialに進みます。

3.1 Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]を勉強する

おお、やっとこれを勉強出来る時が来ました。

前にBlogでこれを早く勉強したいと書いた時があったはずなんですが、そのBlogが見つかりません。まあいいです。

まず軽く全部見る事にします。

のっけから重要な情報を喋っていました。

私はOutlineを生成する方法はPostprocessからやる方法しか知らない。と2022-10-10のBlogでも書いていましたが、

とか

とか言っていました。

MaterialからOutlineを生成する方法もしっかり勉強していました。

しかし、その勉強した内容どころか、勉強した事さえ忘れていました。

一回、簡単にですが全部見ました。

大体PPLineDrawingで勉強したやり方と同じでした。

Outlineを抽出するための差分はWorld NormalとScene Depthを使用しています。

Ben Cloward先生でも大体同じやり方をすると言う事は、もうPostprocessでOutlineを抽出する方法は既に確立していてそれ以上の工夫の余地は無いと言う事でしょうね。

後、一つ勉強になったのが、

PostprocessのBlendable Locationの設定をAfter Tone mappingから

Before Translucencyに変更しています。

これこのTutorialだけでなく沢山のPostprocessのTutorialでやっていますが、その理由が今まで分かりませんでした。

それが解説されていました。

After Tone Mappingだと以下に示した様にjigglingしている箇所が見られます。

これがBefore Translucencyに変更すると無くなります。

後、1 Pixelの大きさを得るのに

で割っていましたが、

を使えば一回で済むのではと思いました。

いや、PP_LineDrawingでは画面上のPixelを得るのにTexCoord[0]を使用していますが、

このTutorialではScreen Positionノードを使用しています。

これって結果は同じなのか?

うーん。

直接、PP_LineDrawingの実装とこのTutorialの実装を比較すると結構細かい点で違いがあります。

これは、この2つを比較する事で私の理解していない深い部分を更に理解出来るようになるかもしれません。

今週はこのTutorialの実装をした後で、PP_LineDrawingと比較して違いを検証しそれについて考察する事にします。

3.2 Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]を実装する

自明なところまで記録する必要はないので重要な点だけ記録します。

隣のPixelの位置を計算する実装です。

先程、述べたようにScreen PositionノードとView Sizeノードを使用しています。

そして先程述べたように、Jiggilingを直すために

Blenderable Locationの設定をBefore Translucencyに変更します。

Scene Texture:World Normalノードを追加します。

そしてWorld Normalの範囲が-1~1の間なので、以下の計算で、0~1の間に変換します。

4つの差を計算します。

うーん。

この部分の計算は本来は中央のPixelとの値の差をそれぞれ出して、その絶対値を足した値を4で割って出すべきとは思います。

思いますが、この計算でも結果にそんな違はないんでしょうね。

そしてこっちの方が計算costとかも低いんでしょう。

結果です。

比較のために元のImageも貼っておきます。

Tutorialの結果のようなピカピカに光っている感じはないですね。

少しそんな感じがする箇所は以下の円柱位です。

今度は色を指定している3つのChannelの中で一番大きな値を選ぶようにします。

結果です。

うーん。

Outlineが見えない箇所がいくつかありますね。

今度は、以下に示したGray Scaleの部分を除去するための実装を行います。

以下に実装を示します。

うーん。

Smooth Stepノードの機能を忘れてしまいました。

調べます。

2021-11-14のBlogにSmooth Stepノードの詳しい説明がありました。

この週のBlogはStepノードとSmooth Stepノードの機能について詳しい解説をしていて今、読んで大変勉強になりました。

まずBen Cloward先生がSmooth Stepノードの機能を説明するために

Smoothstep - Shader Graph Basics - Episode 15 [15]というTutorialを作成してくれてました。

まあ大体そこで勉強した内容なんですが、

まず以下の様に数値を変換します。

なので、

になります。

次にMinとMaxの値ですが、Min以下は0、Max以上は1になります。

更にこの週のBlogではStepノードとの違いも詳しく述べてありました。

すっかりこの内容を忘れていたんですが、Stepノードの機能とSmooth Stepノードの機能は全く違っていました。

今週のMaterialの勉強にStepノードは関係ないのでこれだけ記録しておきます。

結果です。

Grayの部分が消えました。

これで大体のOutlineが完成しましたが、後2つやる事があります。

元のImageを追加する事と、線を黒くする事です。

以下の方法で実装しました。

元のImageを追加するのはScene Texture: Postprocess Input[0]を使用するのは分かっていましたが、Outlineを黒くすると、単純に足したら黒い部分が消えてしまうし、白い部分は白いままです。のでどうするのかと思っていたら、LerpでBに黒をセットしていました。

これは結構、巧な実装に思いました。

ちなみに、私は Outlineの結果を One Minusして、 Scene Texture: Postprocess Input[0]に掛けたらどうかと思っていました。

Tutorialのやり方の結果です。

私のやり方の結果です。

あんまり変わらない気はします。

ここでOutlineがはっきりしすぎているので薄くします。

Tutorialで、この薄くすることをSubtleと言っていたんですが、この単語の発音、サドルって聞こえてずっとSuddleって言っていると思っていました。

で、アメリカ人がこの言い回しを使うたびにいつも?ってなっていたんですが、長年の謎がやっと解けました。

目立ちすぎるから目立たなくしろ。って言ってたんですね。

以下に実装を示します。

流石に0.2を掛けたら線が見えなくならない?

結果です。

やっぱし、線が無くなってしまいました。

そしたらTutorialでも線が見えないので値を0.65に変更していました。

0.65の時の結果です。

うん。あんまり線が目立たなくなりました。

今度はDepth Sceneの差からOutlineを作成します。

その後の計算が難解です。

それぞれの差を見るのは分かるんですが、その後で、最も大きな値で割っています。

TutorialによるとNormalizeしていると言っています。

うーん。Normalize(正規化)するという事は、この4つの値から一個を選んで、それを4つの値の最大値で割るのならわかります。

なんで引いて足した値を4つの最大値で割るとNormalizeするんでしょうか?

この時点の結果です。

なんか全体的にGrayです。

これなんか全然Normalの結果と違いますが、Grayではあります。

Gray Scaleを除きます。

Normal でやったように、Smooth Stepノードを追加します。

結果です。

Gray感はなくなりました。

この結果とNormalのSmooth Stepの結果をMaxノードで結合します。

結果です。

む。

かなりいい感じです。

Characterも置いてみました。

うーん。

Characterに対しては一寸線が太いし、線が欲しくない箇所が白くなってもいます。

Imageと結合しました。

Characterの場合です。

うーん。思ったより良いです。

3.3 Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]とPP_LineDrawingの実装を比較する

Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]に比較してPP_LineDrawingの実装が膨大なので、

今回は、World NormalとScene Depth の計算でほぼ同じ事を計算していると思われる以下の部分を比較します。

まず最初の疑問であるScreen Positionと

TexCoord[0]が同じかどうかを確認します。

以下の実装で確認します。

結果です。

同じみたいです。

実際のLevel画面でも同じ結果でした。

これは同じとみなして問題ないですね。

次は1/View SizeとScene Texel Sizeです。

これも同様の方法で確認します。

結果です。

こっちも全く同じでした。

残りを比較していきます。

まずWorld Normalから比較します。

PP_LineDrawingの実装は比較しやすいように以下の様に整理しました。

まず隣のPixelのサンプル場所が違いました。

PP_LineDrawingのサンプル位置です。

以下の青い部分です。

Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]のサンプル位置です。

以下の青い部分です。

こういうのって本当に注意しないと気が付きませんね。

やっぱり2つを比較すると色々、今まで見えていない部分が見えてきて面白いです。

PP_LineDrawingの次の計算です。

Normal Line Widthを掛けています。

Normal Line Widthに関しては、2022-08-01のBlogで勉強しました。

これと全く同じことを Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]でもやっていました。

何でこっちは掛ける値がConstantでしかも1なのかと言うと、Tutorialの最後でこの値を弄っていたんですが、私はそれは重要じゃないと判断してその箇所はSKipしたからです。

うーん。

もう一回、Tutorialを見直します。

見直したら、遠くのObjectはOutlineが太くなるのでここでEdgeの太さを調節する実装を追加出来る。みたいな話をしていました。

うーん。でも太くはできても細くは出来ないでしょう。

これは実際に実装したわけではないので、まあ、話半分位に聞いておきます。

次の計算ですが、Scene Texel Sizeを掛けてTexCoord[0]を足すのとView Size

で割って、Screen Positionを足すのは同じ事をしていると、先程結論が出たので、ここはSkipします。

PP_LineDrawingの計算です。

Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]の計算です。

ぱっと見ると同じ計算をしているように見えますが、しっかり見ると全く違うNodeを使用していて違う計算をしているように見えます。

しかしそれぞれのNodeの計算値を検証すると、やっぱり同じ計算をしている事が分かります。

この後の4つの隣のPixelの差を計算する方法ですが、全く違います。

まずPP_LineDrawingの方ですが、検証しているPixelの値とその周りのPixelの差分を求めています。

これは、隣のPixelとの差を見るのだから、当然の計算です。ところが Post Process Cartoon Outlines - Shader Graph Basics - Episode 57 [14]では以下のような計算をしています。

この最初の2つのNodeはNormal の値のRangeが-1~1なのでそれを0~1に変換するためにやっています。

これは分かります。

その次の計算が分かりません。隣同士のPixelの差を出してそれの絶対値を足しています。

うーん。

この計算は、私の理解の範囲を超えています。

ひょっとするとこの計算でも検証しているPixelとその隣のPixelとの差を計算できるのかもしれません。

私には分かりませんが。

この後の計算はかなり違うので単純な比較はできません。のでここでやめることにします。

本当はこの後でScene Depthの計算の比較も行おうと思ったんですが、私の頭が疲れてしまったのでここで止めることにします。

今週のMaterialの勉強はここまでです。

4.RPGPackagingについて

今週はProjectのPackagingについて調査します。

4.1 使用していないAssetをPackagingから外す

なんせ、Asset詰めるだけ詰め込んでいるので、今のProjectのサイズは

です。

これをGameをするのに必要なものだけ選択してPackagingする必要があります。

要らないAssetまでPackagingに含む必要はありません。

要らないAssetをどうやってPackagingから外すのかを調査しました。

Unreal Engine 5 tutorial _How to Reduce your project size [9]

色々見た中でやっと実用に耐えれそうなやり方を解説しているのがこの動画でした。

やり方は単純で新しいProjectを作成して、そこにGameで使用しているMapを全部Migrateします。

するとそのMapで使用しているAssetは全部一緒にMigrateします。

Asset Cleaner – Project Cleaning Tool

確かFree for The Monthで貰ったヤツです。

これで使用していないAssetを消せるそうです。

How to clean up unused assets from a project in Unreal Engine [10]

軽くしか読んでいませんが、

これ読むとC++のCodeから読み込んでいるAssetは直接の参照がないので使用されていないAssetと見なされて消されてしまう。とありました。

うーん。

後、最初の方法だとC++のCodeをMigrateする方法も見つける必要があります。

これのやり方、昔は知っていたんですが、もう忘れました。

結構、要らないAssetを消すのも大変です。

まず、いまあるProjectのCopyを作成してそのCopyで色々試す事にします。

今週のPackagingの調査はこれだけです。

来週は、今週見つけた資料をきちんと読み込む事にします。

4.2 追加でやらないといけない事

Save機能を作成したのが大分前で、まだ職業システムやMonsterやItemの状態記録、そしてEventが無い時でした。これらのDataをSaveした時に記録しておく必要があります。

このSave機能のUpdateに関してすっかり忘れていました。

4.3 追記

更に以下のPackagingのTutorialを見つけました。

これらのTutorialはまだ見ていませんが、来週までに見ておきます。

5.Open Worldの検証

今週は、先週の続きの家の内装をやる事と、 Unreal Fest Day 1 [16]でOpen Worldについての講演があったのでそれを見てまとめる。の2つをやる事にします。

確かSmartPoly氏だったと思いますが、Unreal Festで講演する人達は実際にUnrealのその分野を開発している人がするので、どんな機能をどんな目的で作成しているのかを理解するのに一番良い。と言っていました。

ので普段、ほとんど公式の動画をみない私ですが、 Unreal Fest Day 1 [16] のOpen Worldだけは見ることにします。

5.1 ロウソクや暖炉の明るさの調整

先週、以下の様に述べて終わりました。

のでこれをやります。

で、この建物をどのProjectで作成したのかを早速忘れてしまいました。

先週のBlogを見たら、

としっかり書いていました。

有言実行していますね。

MyTestProject1を開きます。

ここの明るさの調整方法ですが、今のところ2つの候補があります。

一つ目はLightを追加する事です。

もう一つがNiagaraのParticleの色の値をすごく高くする事です。

両方試してみようと思います。

Niagaraの色の指定を変える>

その前に柱の上の部分を作成するのを忘れていました。

これを作成します。

しました。

暖炉の上の部分もありません。

これだと、燃焼で発生した有毒なガスが室内籠って中にいる人達は死んでしまいます。

ちょうど、暖炉の煙突の部分のStatic Meshがあったのでこれを使用します。

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

外から見た場合です。

まあ、いいんじゃないでしょうか。

それでは明かりの方を調整していきます。

まずロウソクの明かりから調整します。

のParticle Spawn SectionのInitialize Particle Moduleの

Linear ColorのRの値を50から500にしてみました。

結果です。

まず昼間の状態です。

ロウソクの明かりは非常に強いですが、許容範囲です。

家の外側から見た場合です。

ロウソクの明かりがはっきりと見えます。

ロウソクを使用した事がない私はこのロウソクの明かりが明るすぎるのか、それとも適切な明るさなのか分かりません。

でもまあ特別おかしくは見えないですね。

これだけ明るかったら窓からもロウソクの炎が見えるんじゃないのか?と思い確認したら、はっきり見えました。

これ見えるのは問題ないんですが、Bloom効果がないと変に見えます。

PostprocessでBloom効果を追加して炎がぼやけて見えるようにします。

それでは夜にしてみます。

全く周りが見えません。

炎にすごく近づいてみました。

わずかに窓が見えます。

それだけです。

時間が経ったらHDRが効いて、もっと見えるようになるかと思ったんですがならなかったです。

これはダメですね。

次の手法を試します。

<Lightの追加>

まず結果から示します。

良い感じです。

明るい時です。

うーん。一寸、ロウソクの明かりが強い気がします。

後で調整します。

どんな設定をしたのかについて説明します。

Point Lightをロウソクの炎の位置に設置しました。

最初、以下のParameterで光の大きさを変更しようとしたんですが、

これらの値を変化させても光の範囲とか全く変化しませんでした。

UE4ではこれらの値で光の範囲の調整が出来たと記憶していたので、あれっと思いました。

この辺は後で確認します。

Light Colorで光の色を変えました。

そしてこのParameterです。

Attenuation Radius

この値を変化させたら光の範囲が調整できるようになりました。

のでこの値を変化させて光の範囲を小さくして最初の結果のようにしました。

今度は暖炉の炎にSpot Lightを追加しました。

結果です。

良い感じでしょう。

以下に設定を示します。

Outer Cone Angleの角度を大きくしました。

最初は小さくしたんですが、大きくしても暖炉の周りからは光が漏れない事に気が付きました。

ので大きくして隙間から光が漏れている感じを出しました。

他に調整したParameterは以下の3つです。

Intensityは光が強すぎるので下げました。

Intensityを下げると光の届く範囲が小さくなり全体的に暗くなりました。

Light Colorは暖炉の炎の色に合わせて淡いオレンジ色にしました。

Attenuation Radiusですが、光がテーブルとその奥のイスまで照らす位の大きさにしました。

昼間です。

全然おかしくないです。

外から見た場合です。

光が建物の外に漏れたりしていません。

念のために暗くして確認します。

はい。

大丈夫でした。

夕方です。

暖炉とロウソクの炎からの光は普通ですが、床のTextureが写真を張り付けたみたいです。

理由が分かりました。

床はScaleを十倍にしています。

これScaleを一倍にして100個の床を並べた方がいいですね。

後で直します。

<これから改良する点について>

暖炉に火がついているので、煙突に煙がほしいです。

後で追加します。

家の回りが殺風景なので庭も作成します。

最後にドアが開閉できるようにBPを追加します。

これらの点は来週以降直していきます。

5.2  Unreal Fest Day 1 [16]のOpen Worldについての講演を見る

5時間14分位から始まっています。

Sam Deiterと言う名前が書かれていますね。この人がUE5の開発メンバーの一人なんでしょうか?

この人ですね。

今回、話す内容です。

また、Trainning とか言っています。

これ公式の動画の悪い癖です。こんなこみ入った内容を僅か30分でTranning出来る訳が無いです。

精々、Today’s Topic位にしておけば、視聴者を要らぬ不安や混乱に陥れる事が無くなるのに、絶対にそれをしません。

<Overview

UE5のOven Worldを構成する要素たちの紹介のようです。

この中で全く知らないのは、HLOD、Virtual Shadowですね。

少しだけ聞いた事があるだけなのは、One File Per ActorとData Layer、そしてLevel Instanceです。

これらは理論などは少しだけ勉強した事がありますが、実際の使用方法とかは分からないです。

HLODについて簡単な説明をしていました。

それによると、非常に遠くににあるObjectでもScreenに写る必要がある場合があります。その時、決して近くにある場合と同じ精度で写る必要は無い訳です。その非常に遠くにあるObjectに適切なLODを追加する機能がHLODだそうです。

うーん。

分かり易いです。

Virtual Shadowですが、こっちの解説はあんまり良く分からなかったです。何かSlideで解説するつもりだったみたいですが、そのSlideが見つからないって言っていました。

一応、以下の様に理解しました。

影に非常に近づいたときや逆に影からかなり遠くに離れた時に、UE4だと本物の影と違う何かが起きるみたいです。

まずその事を知りませんでした。

それをUE5ではVirtual Shadowを使用して本物そっくりの影にするそうです。

これは実際の画像で見てみないと、どんな効果なのか分かりませんね。

Virtual Textureの説明ですが、間違ってないですか?

Virtual Textureを遠くのObjectを描く時に使用するなんで聞いた事はないです。

本当にこの人、Open Worldの開発の関係者なんでしょうか?

私が知っているVirutal Textureは2022-05-09のBlogに書いている様に

LandscapeのMaterialをその上のObjectに投影する技術です。遠くのObjectとは何の関係もありません。

もしくはそういうVirtual Textureの使い方もあるのかもしれませんが、この人の言っている事は眉唾の可能性もありますね。

まあ、気を付けて(a grain of salt)聞く事にします。

ここで、Overviewの話は終わっていましたが、一個気になる事を言っていました。

それは「今回は話をしませんが、更に2つ重要な要素があり、それはMass EntityとSmart Objectです。」と言っていた事です。

Smart Objectって確か、Unreal Engine 5 - Mass Frameworkを用いた群衆AI制御の解説【CEDEC 2022】[17]で聞いた気がします。

この動画、たまたま見たんですが、見た後「こんな凄い機能がUE5.1 に備わっているんじゃ直ぐ勉強しなくちゃ。」と慌てまくりました。

そしたらこの機能、まだPlug-inかつExperimentの段階でした。

それで勉強するの止めちゃったんですが、この話を聞くとEpic Game社はこの辺の開発を本気でやっているみたいですね。

この新しいAIで恐ろしいのは、このAIの作成方法が、あんなに苦労して勉強したUE4のAIの作成方法と全く違うみたいなんです。

ひいぇー。です。

また勉強し直す必要が出て来るのか。

ここまでは、それなりに新しい情報やEpic Games社がUE5のOpen Worldのどこに力を集中して開発しているのかなど。がそれなりに理解出来ました。

ただし、ここまで見て、残りのTemplate、Tools、そしてDebug Commandを見る価値あるのかと、聞かれたら無いですね。

のでここで視聴は中止します。

6.Gaeaの勉強

6.1 今週のGaeaの勉強の予定

まず先週作成したLandscapeが夜になっても真っ黒にならない原因を解明します。

そしてKlaus氏のHow To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [18]を最後まで見ます。

このTutorial自体は大事な事を教えていますが、この後の部分はGaeaには関係ない部分なはずです。ので今回でこのTutorialは最後まで見て終わりにします。

そして次のGaeaのTutorialを探して勉強する事にします。

この後の予定は以下の様に考えています。

  1. 大体、Klaus氏のGaeaの使い方は理解しました。確認のために、もう23Klaus氏のTutorialを勉強します。
  2. Klaus氏のGaeaの使い方で自分でもTerrainを作成してみます。
  3. 別なTutorialでも勉強して、そのTutorialTerrainの作成方法がKlaus氏のやり方と同じか確認します。

これをやっていきます。

後、先週書いた、新しいPCのAppのInstall状況はDirectX 12の勉強の節でやります。

6.2 Landscapeが明るい原因を究明する

この実装も、どのProjectで作成したのかを忘れてしまいました。

先週のBlogを見ると

しっかり書いてありました。

やっぱりProject名は記録しておく必要がありますね。

LandscapeのMaterialの実装を見たらEmissive Colorにつながっていました。

これを外します。

結果です。

Landscapeも真っ黒になりました。

明るくしました。

地面が粘土みたいとか、いろいろありますが、Landscape用のMaterialはまた後で作成します。

一生懸命、Lightの設定を弄っていました。

Lightを消してもLandscapeが全く変化しないなら、真っ先にLandscapeに使用されているMaterialのEmissive Colorを疑うべきですが、気づくのが遅すぎました。

一応、それぞれのLightなどの影響をここでまとめておきます。

以下のActorは世界、特に空を構築するために必要なものです。

<Directional Light

これを切ると、

当然ですが、真っ黒になります。

夜の状態と同じです。

<Exponenital Height Fog

これは遠くが見えなくなる霧を作成しています。

Exponential Height Fogを切ります。

霧が無くなりました。

Landscapeの反射光に関しては、特に変化はありません。

これは通常は、霧を発生させるために使用するのではなく、空の下半分が黒くなっているのを隠すのに使用されます。

<SkyAtomosphere

SkyAtomosphereを切ります。

青空が無くなりました。

Landscapeは全く変化していません。

<SkyLight

これです。Landscapeに最も影響を与えるActorです。

SkyLightを切ります。

Landscapeで薄い影が掛かっている箇所が真っ黒になりました。

空の光の反射光が全くなくなった状態です。

<SM_Sky Sphere

これ、いろいろな条件で影響が出て切る箇所を探したんですが、見つからなかったです。

やっぱりUE5では要らないんじゃ...。

<Volumetric Cloud

Volumetric Cloudを切ると、当然、雲が消えます。

これが

こうなります。

以上です。

6.3 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [18]の残りを見る

Virtual Textureの設定について解説しています。

一枚目のVirtual TextureがLandscapeのMaterialの情報を獲得して、2枚目のVirtual TextureがLandscapeの高さの情報を獲得しています。

これも2022-05-09のBlogやその後のBlogで勉強した通りです。

<Step 6

以下の一番最初に出て来た説明だとStep 6はUnreal Engine内でTextureの設定をする事になります。

何と、Klaus氏のLandscapeのMaterialは、自動でFoliageを発生させています。

これ、UE4でやると自動で発生したFoliageはCollisionが無くなってしまったはずです。

UE5でも同じだと思っていますが、確認した訳ではありません。

今度は、ScalabilityからFoliageをLowにセットして

Foliageを消してしまいました。

この機能は知りませんでした。後で試してみます。

Cliff LayerのLayerを作成します。

何とWeight-Blended Layer (normal)とNon Weight-Blended Layerの違いについて解説しています。

説明を聞いたんですがかなり複雑です。

理解出来た範囲でまとめます。

まずWeight-Blended Layer (normal)で以下の様なCliffとGrass のLayerを作成したとします。

これはそれぞれのLayerが重なっている部分がありますが、緑の部分はCliff LayerがGrass Layerと交換されてGrass Layerのみで構成されています。

のでWeight-Blended Layer(normal)ではLayerの順番が問題になります。

これがNon Weight-Blended Layerの場合だと

両方のLayerが同時に存在するそうです。

正直、完全に理解したとは言えませんが、何となくImageはつかめました。

その後、それぞれのLayerにMaskのPNGイメージを指定しています。

これは、私も自分のProjectで先週やりました。

こんな結果になっています。

Klaus氏、山脈の黒い影を消すと言っています。

Sky Lightを選択して

Real Time CaptureにCheckを入れました。

結果です。

山脈の黒い影が消えました。

ああ。

これ、丁度、今しがた勉強した所ですね。Sky Lightですね。Landscapeに最も影響を与えるLightは。

この後で、2枚目のHeight MapのImportについて語っているんですが、これ何をやっているのか良く分かりません。

一寸、動画を最後まで見てみます。

うーん。分かりませんね。この部分が何をやっているのか。

これはKlaus氏の他の動画を見て勉強する必要がありそうです。

<Step 7

Step 7もありました。

最初の説明ではStep 6までしかなかったじゃん。と思ったらボーナスStageでした。

GaeaからImportしたHeight Mapには必ず以下に示した様なデコボコが生成されます。

これは1 Pixelを100cmとしてScale upしているからで、どうしようもないそうです。

ではどうするかと言うと、手動で直すそうです。

TutorialではBrushの設定を以下の様にして直していました。

4~5分で全部直せるそうです。

これは参考になりました。

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

7.1 先週の内容に追加

先週書いた、これから勉強したい内容で、忘れていた事が2つあったのを思い出したのでここに書いておきます。

<Ray Tracing

何のためにRTXを買ったのか。そもそもRay TracingをUEで試した事が無かったです。これのやり方も勉強します。

<Data Layer

Valley of the Ancientで同じLevelなのに2つの世界を作成しています。

これの作成方法を知りたいです。

今、公式のDocumentのValley of the Ancient Sample [19]で調べたらこれの事をData Layerと言うみたいです。

7.2 これから勉強したい内容を整理する

以下にこれから勉強したい内容を整理しておきます。

<新しいPCで勉強出来る事>

新しいPCでなら動くUE5の機能などです。

  • Niagara のFluid Simulation
  • Nanite
  • Network
  • Ray Tracing
  • Data Layer

<UE5.1 で勉強出来る事>

以下の事はUE5.1 で新しく可能になった事です。

  • Foliageの木や草にNaniteを適用する
  • NiagaraRibbonGPUで使用する

これらの事をこれから勉強したいです。

8.雪山のMapの作成

もう雪山のLandscapeの作成なんてそっちのけでVolumetric Cloud用のMaterialの勉強ばっかししていますが、忘れたわけじゃないです。

Volumetric Cloudの勉強が一段落したら戻って雪山を作成します。

8.1 先週から始めたM_VolumetricCloud_02_Profiles_PaintClouds_Morningを読むの続きをやる

M_VolumetricCloud_02_Profiles_PaintClouds_MorningのEmissive Colorに実装がつながっています。

今まで見たVolumetric Cloud用のMaterialにEmissive Colorの実装なんてあったけ?

調べます。

DefaultのLevelで使用されているVolumetric Cloudに使用されているMaterialであるm_SimpleVolumetricCloudを見ると、

Emissive Colorには0がPassされています。

やっぱりEmissive Colorには何も使用されていません。

ではここでは何を実装しているのでしょう。

今週はこれを調べます。

8.2 Random Lighting Strikes

Emissive Colorが何を実装しているのかすぐに分かりました。

Random Lighting Strikesです。

つまり雷光をここで実装しているんです。

実際にこのMaterialを使用したVolumetric Cloudを見ると

雷光どころか、雲一つない空なんです。

ここでも実装の効果をなくすための値が入っていると思われます。

ので実際に雷光を示しているMaterialの実装を見る事にします。

何と、

2022-10-10のBlogで雷光を示していたMaterialが

雲一つないMaterialに変更されていました。

うーん。

ひょっとすると5.1はまだPreviewなのでこの部分の実装はまだ作成途中なのかもしれません。

5.0に戻って確認します。

MyTestProject1を開きます。このProject内の雷光を表示していたMaterialである M_VolumetricCloud_02_Profiles_PaintCloudsを開くと、

の先に、5.1のMaterialと同じ Random Lighting Strikes  がありました。

しかしこの中のTexture Sampleで使用されているTextureは、以下に示したVT_Lightningで、

単なる黒ではないだけでなくVolume Textureでした。

2022-09-19のBlogをもとに3Dで表示しました。

うーん。

やっぱり。

これは多分ですが、今実装するためのTextureのDataを集め直している最中で、そのためにTextureの大半を黒くしているんだと思います。

ので結果と実装を比較して実装が何をしているのかを理解するApproachは、今のこれらのMaterialに対しては、あまり有効ではないと思われます。

後、半年ぐらいしたらきっとすごい雲が実装できるようになって、それからこれらを勉強すべきだと思われます。

というわけで、このVolumetric Plug-inのMaterialの実装を見るのは中止します。

念のために最後に、5.1の Random Lighting StrikesのTextureを確認したら

5.0と同じVT_Lightningを使用していました。

あれ?

うーん。もう一回、考え直します。

8.2 もう一回、考え直します。

まず、 M_VolumetricCloud_02_Profiles_PaintClouds_Morningから作成されたMaterial Instanceである

は、

雲を生成しています。

この親Materialである M_VolumetricCloud_02_Profiles_PaintClouds_Morningも

先週、見た真っなTextureを同じ箇所で使用しています。

という事は、以下に示したLerpのAlpha値を変えても

雲には何の影響も出ないという事です。

Darkness Powerの値を変化させて確認します。

元のDataを変更するとDataが消滅する可能性があるのでCopyしたやつで試します。

Darkness Powerが1の時です。

0の時です。

雲の形状が変化しているのでよくわかりません。

Flowmap1のBottom NoiseとDetailの値を変更して

雲の形状を変化させました。

これでテストします。

Darkness Powerが0の時です。

1の時です。

全く同じですね。

という事は少なくと先週の考察が全部間違っているとは言えないです。

うーん。

今は、まだこのMaterialの実装の勉強を始めたばっかりで、ジグソーパズルで言ったら全体の構図も見えていない状態です。

今は、とにかく、いろいろやってみるべきだと思います。

そしてだんだんPieceが埋まってきて、オカシイ点が出てきた時に自分の勘違いや間違って理解している点もあぶり出されるはずです。

Speedの値を0にします。

雲の動きが止まりました。

こういう何を管理しているのか明確なParameterが、どこで実装されていて最終的にMain ノードどの要素につながっているのかを調べるのが、ジグソーパズルの四隅のPieceを見つける事かもしれません。

と言う訳で今週はSpeedがどこで実装されているかを見る事にします。

8.3 M_VolumetricCloud_02_Profiles_PaintClouds_Morning 内のParameter, Speedの実装を追う

最初から絶句ものの驚きです。

先週、勉強したCloud Map Output(1-transmission)の中にありました。

先週の結論は、この計算の結果は、真っ黒なTextureの値を掛けているから全部0になるはず。です。

違うって事でしょうか?

Speedの実装を追っていきます。

Speedで指定された値をTimeWithSpeedVariableノードにパスします。

このNodeはSpeedとTimeを掛けています。

この値をFlowmaps_2DノードのOverride Time(s)にPassしています。

Flowmaps_2Dノードの実装を見ます。

Override timeの値は2つの経路で使用されています。一つ目は0.5を引いてFracしています。2つ目はそのままFracしています。

つまり0から0.9999...の間を繰り返しす事になります。

両方ともInput Velocity (Vector2)の値を掛けています。

この Input Velocity (Vector2)の値も0なはずです。

となるとこの掛け算の結果は0となって終わりですが、実際はそうなっていません。???です。

その値をInput UVの値から引きます。

Input UVの値がどうなっているのか不明ですが、Preview値はWorld Positionを使用しています。

World Positionの値と仮定して問題ないでしょう。

そしてその計算結果をTexture SampleのUVsに繋いでいます。

うーん。

これから言えるのは、以下の3つのTextureが真っ黒であるにもかかわらず、その返す値が0ではないらしい。という事です。

今週のVolumetric Cloudの勉強はここまでにします。

来週はこれらのTextureの本当の値を追います。

9.報酬システムの研究

今週は先週の続きのPause画面用のLevelを作成していきます。

以下に示した様に壁を追加しました。

更にいろいろ追加しました。

ここで、鬼ごっこした方が面白そうです。

10.Anime Renderingの勉強

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

一つ打開策を思い付きました。

今の私のMaterialの理解では、これとVolumetric CloudのMaterialは、理解出来る内容ではないです。

で、どうするのかと言うと、一部だけ理解します。

それを積み重ねて、最終的にどんな理論でどんな実装をしているのかを理解する。と言う作戦です。

それで今週は、以下のBase Colorの実装を追う事にします。

その前に2個以上使用している同じ種類のNodeに全部、番号を振ります。

Nodeの数が多すぎて全部は無理でした。

Base Colorの一部を抜き出したまとめました。

今週はこれを解析していきます。

まずLerp#2ノードがあります。

Lerp#2ノードのAは0です。Alphaは来週以降解析します。今週はBを見て行きます。

Bは計算結果にPost Light Scale Matの値を掛けています。

Vroidの服のMIのPost Light Scale Matの値を見ます。

1のままでした。

無視して先に行きます。

今度はExposure Range OffsetのBの値を掛けています。

Material Parameter CollectionであるMPC_MToonで値が指定されていました。

Bは1です。ので無視して先へ行きます。

その後、5つのAddノードがあり、それぞれ何かを足していました。

これも来週以降勉強します。

そしてb Use Shade Colorノードがありました。

勿論、実装が簡単そうなFalseの方を先に見ます。

何だ!これ?

Hue Shift だそうです。

Hueって色の違いを表しているヤツなはずです。

Hue from https://en.wikipedia.org/wiki/Hue

何でそれをShiftする必要があるんでしょうか?

まあ、使用しない場合を追います。

Multiply#1ノードです。

Aの方です。

Quality SwitchノードでLow以外の選択肢もありますが、今週はLowだけやります。

ここでgltf_tex_Diffuse、Parameter2DからTextureの画像をImportしています。

Bの実装です。

こっちがアニメ調の色を担当しているみたいです。

MF_ Translucent Switchノードの実装を見ます。

Branch Translucentノードは何をしているんでしょうか?

これ見るとInputされた値のどちらかを返しているだけですね。

In Baseの値を返す場合は、M toon_ Colorノードの値をMF_ Linear Color Convertノードで変換した値を返しています。

これがMF_ Linear Color Convertノードの実装です。

Aは0か1です。

Bの値は0.5でした。

もしAの値がBより大きい時はInputされた値をそのまま返します。それ以外の時は、大体2乗して返します。色は0~1の間の値なので2乗したら値が小さくなりますね。

TranslucentがOnの場合は、Translucent Color Scaleの値と掛けた値が使用されていますね。

ただの白ですね。

以上でした。

<疑問>

うーん。

2つ疑問があります。

まずHue Shiftノードの実装です。

この計算で本当にHueがShiftするんでしょうか?

次にTextureとM Toon主色の値を掛ける事です。

これやるとアニメっぽくなるんでしょうか?あんまり関係ない気がします。

試してみます。

<Hue Shiftのテスト>

以下のMaterialを作成しました。これでHue Shiftノードのテストをします。

Default状態です。

Rの値を0.5に変更しました。

結果です。

完全にHueがShiftしています。

うーん。何で?

これは来週考えます。

Texture * M Toon主色

これは以下の実装で試してみます。

Default値です。

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

結果です。

これはアニメっぽくするのではなくて、Saturationを落としていると考えるのが正しい解釈のようです。

<感想>

今日、勉強した箇所は理解出来ましたね。こんな感じで勉強していきます。

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

今週もLandscapeに使用されているMaterialの実装を読んで勉強します。

今週は以下のBlockを勉強します。Water Line on Shoreです。

まずLandscapeの水を調整出来る事自体知りませんでした。

このBlockには以下の2つのParameterがあるのでこれらを弄ってみましょう。

現状は以下の値がセットされています。

Water Blend Heightの値を-64.925926から色々変えてみました。

水の位置は全く変化しませんでした。

しかし以下のScreenshotで示した色が黒く陰っている部分が変化しました。

この部分の実装を担当しているみたいです。

もう少し詳しく調べます。

Water Blend Heightの値を‐40に下げました。

水回りの影が小さくなりました。

Water Blend Heightの値を‐100に下げました。

水回りの影が非常に大きくなりました。

今度は、Water Blend Modulationの値を弄ってみます。

Defaultの20の時です。

0にしました。

影の境界線がSmoothになっています。

100にしました。

影の境界線がジグザグになりました。

ああ。分かった。これは水回りの地面が濡れているのを表しているです。

ので境界がSmoothじゃないのは違和感を感じます。

この違和感を感じる。と言う表現はMS Wordによると文法的に間違いと指摘されていますが、違和感は、判明するものでも、理解するものでも無く感じるものです。

違和感って感覚は感じるモノなんです。

だから違和感を感じるって表現はあっているんです。

英語で考えると、違和感はUncomfortableになります。当然、Feel uncomfortableと言います。Uncomfortableを感じる訳です。

この表現を間違っているっていう人達は、単に違和感と感じるが重複しているからそう言っているだけだと思います。

荒川をAra Riverと訳したら重複しないかもしれませんが、意味が無くなってしまいます。荒は形容詞ですので名詞がないと意味を成しません。

これが信濃川をThe Shinano Riverと訳すのでしたら信濃は名詞ですから、意味があります。

これと全く同じ事が言えます。

頭痛が痛い。は頭痛自体が頭が痛い事を示しています。頭は名詞なんです。だから頭痛を頭が痛い事と同義に出来るです。だから頭痛が痛いは、重複した表現となるので出来るだけ避けるべきと言われても、それなりに納得出来る訳です。

しかし違和感はそれとは全然違い、違和は感じを形容しているだけで違和と感を分ける事は出来ません。荒川と全く同じCaseです。

更に、重複する表現自体が、文法が間違っている。と言う考え自体が間違っています。

例えば、アメリカで性別を聞くと、She is a girl. とかHe is a boy. とか普通に重複した表現を用いて回答します。

つまり重複した表現が文法上間違っていると考えるのは日本だけなんです。それもきちんと英語で論文を書いているような言語学者から支持されない重複した表現は文法上間違い。と言う考え方に基づいてです。

Water Blend Softnessです。

ぶ。

Spellが間違っています。英語ネイティブなのにBlendも正しく書けないのか。とアメリカなら袋叩きされる間違いですが、まあTypoでしょう。

Water blend Softnessの値を0にしました。

これも境界線がSmoothになっています。

今度は1にしました。

これも境界線が、いびつになりました。

一つWater Blend Modulationとの大きな違いは、Water Blend Modulationの値を大きくすると、境界がジグザグになるだけでなく影に穴があきます。こっちは穴は開きません。

それでは実装を見て行きます。

Lerp#14から始まっています。

AとBは同じSplotchesと言うBlockに繋がっていてBはそのまま、Aはその値に0.5を掛けているだけです。

となると当然、Alphaの値の計算方法がこのBlockの肝になります。

まずClampしています。

LerpのAlphaは0~1の間なので当然です。

Add#3ノードです。

Aから見て行きます。

Water Blend Softnessで何かの値を割っています。

このWater Blend Softnessは0~1の間の値で指定する必要があると勝手に思っていたんですが、そう言う制約はなさそうです。

DivideノードのAを追います。

はい。これは高さを表してます。

この水の濡れた部分をあらわしている影は単純に高さで決定されています。

World PositionでWorld Spaceにおける座標を獲得します。それにWater Blend Heightで高さに下駄を履かせます。(実際はNegativeな値が使用されているので実際の値より低くされていますが。)

その後Bの値、つまり高さだけ抜き出します。

うーん。分かりました。

その後、Water Blend Softnessで割っています。正し0~1の間の値なので実際は掛けて値を大きくしているのと同じです。

この辺りの計算は、どの高さまで影を追加するかを決定しているだけです。

ここで分からないのは、Water Blend Softnessの存在です。これなくても問題ない気がします。しかし実際はこのParameterによって境界線のSmoothさが変化します。

ああ、分かりました。

実際のLandscapeは巨大なので0~1の間は非常に狭い空間になります。実際はNegativeな値と1以上の値を示す場所だらけです。この2つの値を示す場所は0~1の間の値で割ったとしても影響はありません。

だから境界線の形状のような微細な調整をするために、以下の計算をしているんです。

今度はAdd#3のBを見て行きます。

以下の実装になっています。

まずTexture Sample#9のRです。

はい。

もう理解出来ました。

これは水回りの影が高度だけで決定されると、本物らしくない無くなるので、それに模様を追加している訳です。

Water Blend Modulationは、その模様をどれだけ強く追加するかを決定しています。

いや、この値は1以上をセットするので、この模様のどの部分だけを使用すべきかを決定していると言った方が正確です。

以上です。

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

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

2022-10-10のBlogを見るとMF_Normal Weight Modifierの実装を適当に済ませています。

今週はこの部分をやる事にします。

このMaterial Functionは、Tutorialの目的で述べられている以下の2つを達成するための実装になるはずです。

影響範囲を同心の球体で絞る。のは球体の中心と半径の値をパスすれば判別出来そうですが、影響範囲内外で不連続な法線とならないような補間を行う。のはどうやるのか一寸分かりません。

早速、実装してみます。

実装を見たら大体理解出来ました。

球の表面の位置でLerpのAlphaの値が1になるように設定するのでLinearな連続な補間になる訳です。

これ実装を見たら一発で理解出来ますが、これを自分で書けと言われたら、素直にLerpを思いついたか。

うーん。

後、LerpのBの値を、ParameterであるNormal Modification Weightにしているので、球の法線と実際のModelの法線の混合割合を自由に設定できる訳です。

これも勉強になります。

後、Clampノードの前の計算は、球の中心が0、球の表面が1になるようにするための計算です。

Normal Modifier Min Radiusノードがあるから分かりにくいんです。この値が0だと仮定すると、素直に球の中心が0、球の表面が1になるようにするための計算だと分かります。

以上です。

11.DirectX 12の勉強

11.1 InstallしたSoftwareの整理

Visual StudioをInstallしてから2つのAppがInstallされています。

これらは多分Updateした時にInstallされたんでしょう。

知らなかったんですが、以下の場所からAppを開くことが出来るんですね。

これがあるならあえてDesktopにIconを表示する必要もない気がします。

うーん。特に不必要なものがInstallされている事もなさそうなのでDirectX 12の勉強を始めます。

11.2 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [22]を軽く見る

正直、もっと基礎的な三角形の作成ぐらいの内容で最後にDeferred Renderingについて教えてくれるぐらいがちょうど良いのですが、そういうTutorialは見つかりませんでした。

後、補助として日本語の

を読む事にしました。

最初のDirectX12の魔導書は、Directx 12を使用してMMDを作成するための本で、DirectX 12の全くの初心者向けなのか一寸、分かりません。

後、この本だけ勢いで書籍で買ってしまって重いです。

HLSLシェーダーの魔導書は、本の内容がまさに私が勉強したい内容なんですが、この本だけ全くVSの環境設定についての詳しい説明が載っていなくて、全体的に非常に淡泊な作りになっています。

これだけを主に勉強すると詰まって先に進めなくなりそうです。

Direct3D12 ゲームグラフィックス実践ガイドは、英語の教材を含めても正直一番良い感じです。

これを主に勉強したかったんですが、日本語の本で勉強した内容を逐一書くと、著作権的に面倒な事になる可能性があるので副教材ぐらいの感じで使用します。

ので、C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [22]をMainに勉強します。

まずZip FileをDownloadしました。

解凍しようとしたら解凍用のSoftがなかったです。

調べたら右クリックして「すべて展開」を選択すれば良い。って出てきました。

出来ました。

それでは、Tutorialの方を見ていきます。

以下に大体の内容をまとめます。

<Intro

以下の事が述べられていました。

  • このTutorial SeriesWin32DirectX12を使用してGame Engineを作成する。

今回のTutorialでは以下のモノを作成します。

  • Folderの作成
  • Projectの作成
  • Window作成のための最初のCodeを実装

Project Folder and Icon

ここではこのProjcet専用のFolderの作成を行っています。

以下の内容をそのFolderに追加しています。

LICENCEとICON、そしてREADME Fileは分かりますが、Episode1のFolderには何が入っているんでしょうか?

多分、DownloadしたFileのS01E01と同じでしょう。

S01E01を開いてみます。

うーん。何これ?

更に開きます。

Visual StudioのProjectみたいです。

Tutorialを見直したら、このFolderには作成したScriptを保存するってしっかり解説していました。

Creating an Empty Project

VS2019における新しいProjcetの作成方法を説明しています。

勉強のためにあえてEmpty Projectで始めるそうです。

Configureです。

Locationはさっき作成した場所ですね。

実際にこれを自分でやるときはVS2022でやります。

<Visutal Studio Standard

Visual Studioの設定を少しだけ変更します。

Folderの名前をHeaderからPublic、SourceからPrivateに変更します。

次に新しいFolderを追加して、名前をSourceにします。

そしてそのFloderに先程名前を変更したPublicとPrivateを移動させます。

そして最後にResource Fileの名前をResourceに変更します。

今度はSwitch ViewをClickして、Folder Viewを選択して実際のFloderを表示します。

新しいFolderを追加します。

名前をSourceに変更します。

このFolderに新しいFileを追加します。

名前をWinMainに変更します。

今すぐにこのFileに何かをする事はありませんが、Configurationの設定をするのに最低一個のFileが必要ですので、今作成したそうです。

またSwitch Viewを押して元のViewに戻ります。

こっちのViewはProject Viewというみたいです。

こういうVisual StudioのFolderを整理する設定って、確か The ChernoのGame Engineでもやっていました。

これやらないと後で凄い面倒な事が起きるんでしょうか?

<Project Configurations

はい。

先週、私を悩ませまくったConfigurationの設定です。

まずBlack Projectを右Clickして

Propertiesを開きます。

もう2年くらいVisual Studio触ってないのでこういう細かいところ完全に忘れています。

Propetiesってこうやって開いてたんでしたっけ。

まず右上のConfiguration Manager...をClickします。

X86を外します。

やり方はEditをClickしてX86を選択してRemoveするそうです。

DirectX 12はX64出ないと動かないのでX86の設定をしても無駄だそうです。

ふーん。

この辺の変化は本当に早いですね。

次に以下の赤線の部分でも同じ事をします。

こっちはWin32って書かれていました。

この辺の細かいやり方はVS2022とVS2019では違うかもしれませんね。

でも、X86を外せばいいわけですから、何とかなるでしょう。

次はGeneralのOutput Directroyの設定を変更します。

以下に示した様にPlatformというFolderがあります。

これが要らないわけです。

これを外します。

ProjectNameを代わりに入れます。

このPlatformの所に、ProjectNameを入れておくと後で、凄い便利になるそうです。

この辺は、まったく理屈が分かりません。

Tutorialの言われるがままにやるしかないです。

次にすべてのBuild Fileが自身のFolder内でGo inするようにする事です。

ここで言うGo inは生成される事を言っていると思われますが、実際にやるときに確認出来るでしょう。

これを実行するのに何個かのやり方があるそうです。

一般的なやり方はBinとObject Folderを作成する方法です。

しかしこのTutorialではもっと直接的なやり方を採用します。Build そしてIntermediate Folderを作成します。

UE4もこっちを採用しているはずです。

で、以下の方法でこれを実装します。

Intermediate Directoryの値をOutput Directoryの値と全く同じにします。

BuildをIntermediateに変更します。

そしてProjectNameとIntermediateの位置をSwitchします。

Tutorialではこの後、なぜこの設定にすべきなのかを説明していますが、全く理解できません。

一応、この部分のTutorialの説明を以下にまとめます。

まずすべてのBuild Fileは全部同じFolder内で生成してほしいです。しかしすべてのIntermediate Folderには、自身のProject Folderで生成してほしいです。

この辺は実際にBuildした後のそれぞれのFileの配置をUEのC++Projectの配置と比較する事で、ここで言っていることの内容が理解できるとは思います。

ああ、UE5用のC++Projectを作成するための設定もやる必要があるのか。

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

次に、このProjectの設定がSystemで許される最高の設定になっているのかを確認します。

Windows SDK Versionの項目を見ます。

最も新しいVersionを使用しているのかを確認します。

ああ。やっぱり先週、Defaultで選択されたWindows SDKのVersionじゃなくて一番番号が大きいのを選んでおけばよかった。

これで新しいVersionのWindows SDKを別なProjectで使用すると2つのSDKが必要になってしまいStorageを圧迫します。

うーん。でもD Driveにはいっているから増えても大丈夫でしょう。

あれ、そういえば本当にD Driveに入っているのか確認できて無かったです。

一応確認します。

C driveに入っていた。

しかも2つも入っています。

いや一個はWindows 11用のSDKだったはずです。

確認します。

分かりました。

Windows 11 SDKも10.0...という番号で始まっていました。

でも何でC driveにInstallされているの?

先週のVisual Studioの設定で以下の様にするだけではだめだったんでしょうか?

SDKが本来Storeされているはずのfolderのサイズを見たら113MBしかありません。

はあ。

なんで?

調べたらC driveのProgram Files(X86)の以下のFileに入っていました。

うーん。

これは、後で調べます。

これは結構、ショックですね。

こんなんじゃすぐにC driveが一杯になってしまいます。

C++ Language Standardの設定最新版に変更します。

C Langage Standardも同様です。

今度はLinkerの設定です。

Systemを選択します。

Windowsに変更します。

うーん。これも何をしているのかよくわからん。

ここでConfigurationは終わっています。

はい。今週はここまでにして、これまでの内容を整理します。

11.3 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [22]で勉強した内容を整理する

まず、Configurationが何をやっているのか、大体は理解出来ました。確かにOpenGLの時のようなWindowを製作するための設定はしていませんでした。

これもTutorialの手順を一つ一つ、嘗め回すように追って、その解説も骨までしゃぶるくらいの勢いで解釈して初めて理解出来るので、先週の様にサラッと見ただけでは理解出来ないのも仕方ない事です。

Configuationの設定も複雑でしたが、Visual StudioのProjectのFolderの設定もかなり複雑でした。

これ別なC++のTutorialでも同じような設定をしていましたので、何かこっちの設定をする方が得があるのか、それともConventionでそうなっているのか分かりませんが、この設定は知っておくべき内容みたいです。

Configurationの話に戻りますが、Linker のSystemのSubsystemは何を管理しているんでしょうか?

これは直ぐに調べられそうなので、今調べます。

Stock Overflowにありました。

difference between Console (/SUBSYSTEM:CONSOLE) and Windows (/SUBSYSTEM:WINDOWS) [23]です。

はい。

この設定はWindowを作成するための設定だったんですね。

まだ当分環境設定の勉強をする必要がありそうです。しかしこの辺をいい加減にやってDirectX 12の勉強に飛び込んでしまうと、後でPCの整理をする時に大変になるので、この辺もゆっくりしかししっかりとやっていきます。

11.4 Windows Software Development KitC driveInstallされていた件について

Stock Overflowでchange windows kit common installation path [24]に近い話が書かれていました。

これを読むと RegistryにあるComputer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed RootsでWindows SDKのInstall先を指定しているみたいです。

はあ。

これは私の能力の範囲外です。

でも一応、このFileを見てみましょう。

C:\Windows\System32\Config\ にあるみたいです。

ここから見るだけなら編集する事は出来ないみたいなので見てみます。

見たけど無かったです。

やっぱしRegeditを使用する必要があるみたいです。

これは一寸、Registryについて勉強した後で触らないと危ない領域です。

今週は諦めて、一週間、Regeditの使い方なんかの情報を勉強してから来週、試す事にします。

12.まとめと感想

それぞれの節でまとめと感想を書いているのでここで特に書くことはありません。

13.参照Reference

[1] BoostMyTool. (2021, December 31). Setup OpenGL in Visual Studio 2022 for C/C++ Development [Video]. YouTubehttps://www.youtube.com/watch?v=HzFatL3WT6g

[2] Game Engine Series. (2020, June 27). Game Engine Programming 001 - Introduction | C++ Game Engine [Video]. YouTube. https://www.youtube.com/watch?v=hRL56gXqj-4

[3] OlympusMonsTutorials. (2021, February 17). C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [Video]. YouTube. https://www.youtube.com/watch?v=2vrEIhAajhM

[4] CGHOW. (2022, June 13). Collision Query | UE5 Niagara #ScratchPad Module #9 [Video]. YouTube. https://www.youtube.com/watch?v=kxFgm8B7Tm4

[5] CGHOW. (2022b, June 14). Particle Attribute Reader | UE5 Niagara #ScratchPad Module #10 [Video]. YouTube. https://www.youtube.com/watch?v=dcbfKQJxB5c

[6] CGHOW. (2021, December 31). Happy New Year ! | Download Free UE4 Niagara Project [Video]. YouTube. https://www.youtube.com/watch?v=n-GuGpByALQ

[7] 【UE4.26】Niagara Advanced 解説基礎編~Particle Attribute Reader~ – HeyYo CG. (n.d.). [Video]. https://heyyocg.com/ue4-26-niagara-advanced-particle-attribute-reader-basic/

[8] CGHOW. (2021a, March 4). Particle Attribute Reader in UE4 Niagara Tutorial | Download Project Files [Video]. YouTube. https://www.youtube.com/watch?v=ZCkfBBHhPxg

[9] Unreal ART - Unreal Engine tutorials. (2022, August 20). Unreal Engine 5 tutorial _How to Reduce your project size [Video]. YouTube. Retrieved October 18, 2022, from https://www.youtube.com/watch?v=h8BhgG6MEnM

[10] How to clean up unused assets from a project in Unreal Engine. (2022, January 5). Prog.World. https://prog.world/how-to-clean-up-unused-assets-from-a-project-in-unreal-engine/

[11] Codekitten. (2021, February 22). How To Lower Your Unreal Engine Project File Size! [Video]. https://www.youtube.com/watch?v=gmYvSPj8rmI

[12] Matt Aspland. (2021, February 5). How To Reduce Packaged Game Size | Unreal Documentation - Unreal Engine 4 Tutorial. YouTube. Retrieved October 18, 2022, from https://www.youtube.com/watch?v=ofWiHPnkkU4

[13] VoRty Two. (2019, March 11). UE4 remove all unused files AUTOMATIC (Editor Script). YouTube. https://www.youtube.com/watch?v=zq4DnM7WhIo

[14] Ben Cloward. (2022, August 18). Post Process Cartoon Outlines - Shader Graph Basics - Episode 57. YouTube. https://www.youtube.com/watch?v=Wpsqfpxb55Y

[15] Ben Cloward. (2021, September 16). Smoothstep - Shader Graph Basics - Episode 15 [Video]. YouTubehttps://www.youtube.com/watch?v=dn3y5KVxylQ

[16] Unreal Engine. (2022, October 18). Unreal Fest Day 1. YouTubehttps://www.youtube.com/watch?v=FeWtslAEtyc

[17] Unreal Engine 5 - Mass Frameworkを用いた群衆AI制御の解説【CEDEC 2022】. (2022, August 26). [Video]. YouTube. https://www.youtube.com/watch?v=0fGBa6C_Bjg

[18] Klaus. (2022, July 6). Create An Open World Snow Landscape Part #1 - Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=ej2b-zWoYiM

[19] Valley of the Ancient Sample. (n.d.). https://docs.unrealengine.com/5.0/en-US/valley-of-the-ancient-sample-game-for-unreal-engine/

[20] Stylized Rendering. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/Resources/Showcases/Stylized/

[21] 株式会社ヒストリア. (2022, June 30). [UE4] 動的法線転写について. Historia Inc - 株式会社ヒストリア. https://historia.co.jp/archives/11921/

[22] OlympusMonsTutorials. (2021, February 17). C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [Video]. https://www.youtube.com/watch?v=2vrEIhAajhM

[23] difference between Console (/SUBSYSTEM:CONSOLE) and Windows (/SUBSYSTEM:WINDOWS). (2011, September 6). Stack Overflow. https://stackoverflow.com/questions/7316433/difference-between-console-subsystemconsole-and-windows-subsystemwindows

[24] change windows kit common installation path. (2017, June 28). Stack Overflow. https://stackoverflow.com/questions/44801241/change-windows-kit-common-installation-path