UE4の勉強記録

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

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

<前文>

エリザベス女王Queen Elizabeth II)の死去に関する感想>

英語圏のニュースが凄いつまんないんです。

なんでかなと思ったら、イギリス王室の功の話しかないんです。

まあ確かにエリザベス女王自体にFocusしたらお亡くなりになられたので功の部分に注目するのは分かります。しかしイギリスの王室とは帝国主義と植民地の歴史、そのもので、インド人なんかいろんな思いがあるはずなんです。

このインド人の想いや考えを英語圏のサイトは全部Blockしているんです。MemeですらBlockしています。

これやると英語のサイトを見ても本当につまらない。

民主主義を自称するのは簡単ですが、こういう細かい点を見るとイギリスの民主主義の脆弱さを見た気になります。残念です。

イギリス人がそういう報道やサイトの規則に抗議するのかと思ったら、逆にアメリカ人に今、エリザベス女王やイギリス王室のMemeを作ったら、911のMeme作りまくってやるから覚悟しろよ。と脅す始末です。

なんか、がっかりです。

世界中のほとんどの国がイギリスの支配下にあった屈辱の歴史を持っている訳で、イギリス王室に対しては非常に複雑な屈折した感情を抱かざる得ない訳です。その片鱗が一寸しか見れなかったのは、まあ残念な気持ちにならざるえなかったです。

しかし、これ逆に日本の凄さを再認識することになりました。

世界中のほとんどの国の人が英語がしゃべれるのって実はイギリスの植民地だったからなんです。

世界中を植民地にした最強のイギリスが同盟国に選んだほとんど唯一の国ですから。

しかもその理由が、日本人は約束を守るから。と言う、まあ日本人からしたらかなり誇り高い理由です。

うーん。

やっぱり日本って近代の歴史において非常に特異な位置に存在してたんですね。

<中国と台湾の冷たい戦争>

英語圏の情報ですのでどれくらい正しいのか分かりませんが、今の中国は熱い戦争、直接台湾に侵略する事よりも冷たい戦争、と言うか技術戦争、具体的に言うと半導体の製造で台湾に勝負を挑む方向にシフトしているみたいです。

これかなり情報が錯そうしているんですが、中国側は最後まで脅しを掛ければNancy Pelosiは訪台しないと言う中国情報局?の発言を信じて行動したら、結果が全くの逆になってしまったのがこの前の真相みたいです。

それでここからの推測も人によって違うんですが、この中国情報局?の分析の間違いが示すように、中国はアメリカと戦争しても本当は勝てないが、勘違いしているので台湾に侵攻してくると言う新しい推測が出て来ているみたいです。

ので中国が台湾への侵攻をあきらめたと言う訳では全く無いです。

しかしそれとは別に、今回、台湾側が「アメリカは絶対台湾を見捨てる事は出来ない。それは台湾企業しか世界で最新の半導体を製造する事が出来ないから。」と発言した事で、アメリカが全てにおいて世界最高であると信じているある種のアメリカ人をかなり刺激したんです。

アメリカ何やってんの。と

そしたら何故か中国が張り切りだして、急に半導体の製造に力を入れ始めました。

で、しばらくは中国は台湾を直接侵略するのではなく、半導体の製造で台湾を潰す方向で頑張るみたいです。

中国は7nmの半導体を自作出来るとこまで来たそうです。でそれに対して台湾の半導体産業がボロクソに叩いています。5~6前の技術、経済的に黒字になるLevelで製造出来るのか不明とか。です。

戦争の代わりに、こういう技術の競争で中国と台湾が競ってくれたら日本人として非常にうれしいです。

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

<本文>

1.今週の勉強について

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

  • Niagara: CGHOW氏のTutorialをやる
  • Materialの勉強
  • RPGEventの作成
  • Open Worldの検証
  • Gaeaの勉強
  • 雪山のMapの作成
  • UI Designの勉強
  • Anime Renderingの勉強

2.Niagara: CGHOW氏のTutorialをやる

今週はScratch PadのTutorialを2個ぐらいと、先週、見たShort動画の内興味深いEffectのTutorialを1個位やろうと思います。

2.1 UE5 Niagara #ScratchPad Module #8 | Voxel FX [1] を勉強する

このTutorialでは以下のEffectをScratch Padを使用して作成するそうです。

いつもの通り、Fountainを使用したEmitterを追加しそれを改造します。

今回はRender SectionにMesh Rendererを使用します。

当然Mesh にはCubeを使用します。

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

ここでCGHOW氏、先程追加したMesh Renderer Moduleを消してしまいました。

これ多分、間違いでしょう。

先を見て確認します。

はい。間違いでした。後で追加し直しています。

Emitter Update SectionにSpawn Burst Instantaneous Moduleを追加します。

Emitter State Moduleの

Loop BehaviorをOnceに変更します。

Particle Spawn SectionのParticle State Moduleの

Kill Particles When Lifetime Has Ended のCheckを外します。

これは一端作成したMeshを消さないようにする設定です。

次にParticle Spawn SectionにStatic Mesh Location Moduleを追加します。

Static Mesh Location Moduleを追加するとSample Static Mesh Moduleも追加されています。

Sample Static Mesh ModuleのSource Modeに以下のMeshをセットします。

うーん。

これってSkeletal Meshなんでしょうか?

良く分からないですね。

まあ、最後までこのTutorialを見れば判明すると思うのでそのまま進みます。

以下の様になりました。

しかしこれだと、Box同士の隙間が無いです。

それをScratch Padを使用して実装します。

[Particle] PositionをMap Get ノードに追加します。

今度は、Box同士のGapを指定するために[Input] Int32を追加しGapと名付けました。

Positionの値をGapで割ります。

その結果を四捨五入します。

この結果とGapの値を掛けます。

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

以上です。

うーん。なんでこの実装でCubeの隙間が生まれるのか分かりません。

先に結果を見ます。

Gapの値が小さいときは

Boxが重なっています。

Gapの値を大きくすると

Boxの重なりが無くなりました。

2.2 UE5 Niagara #ScratchPad Module #8 | Voxel FX [1] を実装する

この実装は簡単なのでScratch Padの理屈を考える前に実装してしまいます。

まずFountain Emitterを改造して以下の様にしました。

そしてParticle Spawn SectionにStatic Mesh Location Moduleを追加します。

Static Mesh Location ModuleのFixボタンを押してSample Static Mesh Moduleを追加します。

Sample Static Mesh ModuleのMeshにはSevarogを追加しました。

以下の様になりました。

Cubeのサイズを10分の1にして生成する量を10倍にしました。

こんなんでいいでしょう。

Scratch Padの実装をやって行きます。

まずParticle Spawn SectionにScratch Padを追加して名前をVoxelにします。

Mat Get ノードに[Particle] Positionを追加します。

[input] Int32を追加し、名前をGapに変更します。

Tutorial通りの計算を実装します。

結果です。

Gapが15の時です。

色々微調整して最もいい出来だったのが以下のです。

モデルを変えてみました。

うーん。

こんなもんかもしれませんね。

<Scratch Padの実装の計算について>

Positionが1,2,3,4,5,6,7,8,9,10のCubeがあるとします。

これをGapの3で割ります。その後Roundするので 0、1、1、1、2、2、2、3、3、3になります。

これにGapを掛けると、0、3、3、3、6、6、6、9、9、9になります。

ああ、分かりました。

この計算をするとCubeがGapの倍数の位置に配置されるようになるんです。

だからGapの値が小さい時は、Cubeが重なっていました。

以上です。

2.3 Collision Query | UE5 Niagara #ScratchPad Module #9 [2] を勉強する

なんとこのTutorial、25分もあります。

これ勉強して今週のNiagaraの勉強は終わりにします。

以下のImageが表示されていました。

Tutorialの題がCollision Queryとなっていますので、この球とStatic MeshのCollisionを感知するためのScratch Padの実装を作成するための勉強をやるみたいです。

全体を把握するために一回全部見ました。

ほとんどScratch Padとは関係なく、まあ普通のNiagaraのTutorialとして見た方が良いですね。

特に気になったのがMaterialとNiagaraのDataのやり取りの方法でした。

最近はScratch Padの勉強に集中しているのでMaterialとNiagaraの関係という結構大事な内容について疎かになっている部分がありました。

簡単に全体の流れを以下にまとめます。

まず、このTutorial用に新しいLevelを作成しています。

Exponential Hight Fogを追加しただけのEmptyなLevelです。

正直、このLevelが必要なのかどうかというと必要じゃない気がします。

CGHOW氏のEffectは全部光っているのでこういう空間だと映えるんです。

でも普通の明るい場所に配置した場合は、それなりになってしまいます。

それではNiagaraに使用するMaterialを作成します。

以下の実装を組みました。

Main Nodeの設定です。

今度はNiagaraの準備です。

まずRender SectionにMesh Rendererを追加します。

Mesh RendererのMeshesにSphereをセットして

先程作成したMaterialでOverrideします。

要らないModuleを消します。

いつものヤツです。

CGHOW氏ここで先週と同じミスをしています。Mesh Renderer Moduleを消してしまっています。

この後、Emitterの細かい設定をしていますが、いつもと同じなので記録は省略します。

以下のようになりました。

このEmitterをLevel上に配置してCubeと交差させています。

当然ですが、何も起きません。

ではどうするのかと言うと、Material内で以下に示したDepth Fadeノードを使用します。

Depth Fadeノードを以下の様に実装に追加しました。

結果です。

CubeとNSが交差する部分のEffectが消えています。

しかし本当は交差した部分のEffectを消すのではなく強調したいんです。

それでMaterialの実装を以下の様に変更します。

Depth Fade ノードの結果をOne MinusしてAddします。

更にDepth FadeノードのFade Distance Defaultの設定を10に変更しました。

結果です。

今度はNSとCubeの交差している部分が強調されて色付けされています。

要するにこの部分と言うか、NSとCubeの交差を判定するためにはこのDepth Fadeノードの存在を知らないとそもそも作成出来ないんです。

このDepth Fadeノードについては後で検証します。

この交差している部分にNiagaraからAccessします。

まずFountain Emitterを追加します。

設定を弄って

以下の様なParticleが発生するようにします。

まず分かり易いようにColorで作成します。

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

Color ModuleのColorの設定にLerp Linear Colorsを使用して以下の様にセットします。

これで交差している箇所を赤、それ以外を緑に表示する実装を作成します。

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

名前をCollision Queryに変更します。

このScratch Padの名前の変更って、いつも記録しておくかどうか迷います。今回は一応記録する事にしました。

Map Get ノードに[Input] Collision Queryを追加します。

うーん。

このCollision Queryって先程のDepth Fadeノードと何の関係もないような気がしますが。

これ単体でMeshと交差している位置などの情報を拾ってきそうです。

これも後で調べます。

この後、Query Mesh Distance Field GPUノードを追加します。

こんなNode知らないです。

Tutorialに一瞬だけ機能の説明が写りました。

これ見るとCollision QueryとField Sample Pos Worldに指定した位置の距離を返してくれるみたいです。

因みにこの機能を使用するためにはProject SettingでGenerate Mesh Distance FieldsにCheckを入れる必要があるそうです。

Mat Getノードに[Particle] Positionを追加しその値を、Query Mesh Distance Field GPUノードのField Sample Pos Worldに繋げます。

その結果をSubtractします。SubtractノードのBの値は

Map Getノードに新しく追加した[input] Distanceからパスします。

もしFadeしたいなら更にDivideノードを追加します。

更にClampしてMap Setノードに新しく追加した[Particle] DepthOutputに繋げます。

うーん。

段々、分かって来ました。

この[Particle] DepthOutputを使用すれば交差した位置とParticleの距離が0なら赤、1以上なら緑に設定出来るわけです。

Particle Update SectionのColor Moduleの

Lerp Factorに先程の[Particle] Depth Outputをセットします。

Scratch Pad ModuleのDistanceとFadeの値を以下のように変化させると

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

うーん。

やっぱりMaterialのDepth Fadeノードは関係無かったですね。

NSだけで完結しています。

しかしそれはそれで[Input] Collision Queryという変数やQuery Mesh Distance Field GPUノードについて知っている必要があります。

Scratch Padの勉強だけならここで一端中止して、実装したり検証したりするんですが、どうしましょう。

今週は、最後まで勉強して実装は来週、そして検証は再来週やる事にしますか。

今度はParticleのサイズを変更します。

まずParticle Update SectionにScale Sprite Sizeノードを追加します。

そして以下の様な設定にします。

Alphaに[Particle] Depth Outputをセットします。

以下の様にCollisionの付近だけParticleが現れます。

Particleのサイズは0ですが、一応見えない箇所にも生成されています。

それらを消しておきます。

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

以下の設定をします。

結果です。

見た目の変化はないですが、計算Costとかはどうなんでしょうか?

この後、Kill Particle Moduleが有ると2度とParticleを生成出来なくなるので消してしまいました。

なんかグダグダしています。

ここで急用が入ってしまったので一端中止にします。

3. Materialの勉強

3.1 Radial Blur Post Processing - Shader Graph Basics - Episode 55 [3] を勉強する

今週は以下のPost Processを作成するそうです。

Radial Blurの意味が分かりました。

真ん中から放射線状にBlurが掛かるPost Processの事です。

今週は原理の解説がありました。

この解説、非常に分かり易いのでここにまとめ直しておきます。

以下に示したPixelのBlur値を求めたいとします。

まず原点からこのPixelに線を引きます。

この線上におけるPixelの値を前から5個、後ろから5個集めます。

以下の黄色のPixelの値です。

それぞれの黄色の部分のPixelにGaussian Curveで重みを付けます。

図のCurveはGaussian風のCurveです。手書きなので。

実装も一緒にやってしまいます。

以下の方法で原点とPixelを結ぶ線を作成します。

この計算を見ただけで私は理解出来ましたが、一応、簡単な説明を以下に示しておきます。

原点を黄色、測定しているPixelを黒にします。

これがTexCoord[0]ノードと言うかTextureのややこしいとこですが、座標が以下の様になっています。

原点が0,0には無く0.5,0.5にあります。

ので原点、測定するPixelの位置をVectorで表すと以下の様になります。

原点のVectorは0.5、0.5です。測定しているPixelのVectorはその時で違いますが、それぞれの値はTexCoord[0]が返してくれます。

原点のVectorから測定しているPixelのVectorを引くと以下の青いVectorになります。

この青いVectorは原点から測定するPixelに線を引いた場合と同じです。

ので、以下の様な一見簡単に見える実装で測定しているPixelと原点を結ぶ線が計算出来る訳です。

これはこの部分の実装をいくらCopyしても理解出来るもんではなく、数学力が必要です。しかし数学力だけあってもTextureの座標がどうなっているのかを理解していないと解けないので、UEの設定を知っている必要もあります。

Materialの実装そのものは、今まで作成されたMaterialの実装をCopy Pasteすればそれなりのモノは出来るかもしれません。

しかし、それではそのMaterialの実装を真に理解したとは言えないと思っています。上記のような説明が出来て、初めてMaterialの実装を理解したと個人的には思っています。

次にMultiplyノードを繋げています。

Tutorialによると、これはBlurの強弱を調整するための実装だそうです。

もう一度、Multiplyノードを繋げています。

今度は測定するPixelの線上のPixelを選択するための実装だそうです。

‐0.05を掛けています。

その結果をTexCoord[0]の結果に足してScene TextureノードのPost Process Input 0に繋げます。

この結果にGaussian Curveの計算に基づいて重みを付けます。

TutorialはGaussian Curveの計算結果は以下のサイトで計算していました。

Tutorialはこの計算結果をそのまま使用していましたが、私はRoundした値を使用します。

これを11回繰り返す必要があります。

TutorialではMaterialにはFor Loopの働きをするNodeが無いので同じ実装を11個Copy & Pasteで作成します。

これMaterial Functionにして11回繰り返す方が良い気がしますが、間違えた時に直すのが面倒になるので今回はTutorial通りにやります。

出来ました。

今度は採取するPixelの位置を指定するConstantノードの値を変更します。

-0.05, -0.04, -0.03, -0.02, -0.01, 0,0.01, 0.02, 0.03, 0.04, 0.05の値をそれぞれに代入しました。

うーん。

この値だと本当の隣のPixelの値は取れないでしょうね。

Scene Texel Sizeノードを使用したら本当の隣のPixelの値が取れたはずです。

今週は時間が無いのでこの点についてはこれ以上は検討しませんが、‐0.01が隣のPixelの位置を示す様にはならないはずです。

とは言え大筋の計算結果が変わる訳ではないので、Tutorialのやり方で続きをやっていきます。

WeightもそれぞれのPixelによって変更します。

そしてそれぞれの計算結果を全部足します。

結果です。

今週は急用が入ったため時間が無くなってしまったのでLerpの部分は省略しました。

でもTutorialの内容は理解出来ていますので問題ないでしょう。

4. RPGEventの作成

時間が無くなってしまったので今週のRPGのEventの作成はお休みします。

5. Open Worldの検証

先週、検証したAssetについて簡単にまとめます。

5.1 検証したAssetのまとめ

壁などのStatic Meshの裏面が無い物が多かったです。これが普通なのかどうか分かりませんが、建物の裏側があった方が中身のある建物は作成し易いと思います。

壁の内面があったAssetは

  • City of Brass: Environments
  • Fantasy and Medieval Architecture
  • Fantasy Cave Environment
  • Medieval Castle Modular
  • Modular Fantasy House

でした。

ただし壁の内側がないInfinity BladeのCastleでも以下に示した様な立派な建物の内部を作成していました。

やり方によっては作成出来るのかもしれません。

これ以上は実際に建物を作成してみないと分かりません。

5.2 Modular Fantasy Houseを使用して建物を作って見る

これです。これで家を作成してみます。

取りあえず以下の様に床と壁を作りました。

床と壁が揃っていません。

直したら今度はStatic Meshが重なった部分がチカチカし始めました。Z Fightingと言うやつですね。

確か「Unreal Engine 4で極めるゲーム開発」にこれの解決方法が載っていたはずです。

読み直してみます。

うーん。結構複雑ですね。私が理解した範囲でまとめると、壁のサイズを小さくして柱を追加するそうです。

要するに重なっている部分を無くすんです。

これを全部のやるのは大変なので建物を小さくして試してみます。

確かにチカチカは無くなりましたが、何か変です。

柱を突き出して見ました。

うーん。

土台と柱の関係が分かりませんね。

土台より柱って突き出るモノなのでしょうか?

柱にも土台と追加してみました。

これならそんなに違和感ないです。

以下の様になりました。

正直、これだけ作成するのにも結構な時間が掛かり、それなりに疲れました。

屋根を作成します。

この屋根、以下の角度から見ると消えてしまいます。

柱を追加してその部分を隠しました。

別な屋根のPartsをみたらそれは上記のような問題はありませんでした。

それで屋根を作成しました。

一応、これで完成です。

これでは小屋ですね。

ドアを開く実装はまだ作成していないのでドアを外して中を見てみます。

思ったより明るいです。

今週の建物の作成はここまでにします。

5.3 建物を作成した感想

兎に角、疲れました。

柱や壁の位置が一ミリでもずれるとその場所ではあまり影響無くても、別な場所で問題が生じます。

最後の方は壁の位置を一ミリずつ動かして調節したりしました。

柱のように土台と組み合わせる事で見た目の違和感が改善される箇所がある事も分かりました。

土台を作成して、柱を配置、壁を作成して床を配置、最後に屋根を作成、のような作成する順番がある気がします。

実装やTutorialとは違い頭はあんまり使わないです。

YouTubeを聞きながらの作業でもそんなに問題ない気がします。

来週は、この小屋の中身を作成します。そして時間が有ったらドアの開閉も実装します。

6. Gaeaの勉強

 今週はHow To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [4]の残りを勉強します。

先週、勉強した箇所で既にGaeaの部分は終わって残りはUEの実装に移っています。更にUEでは前のTutorialで作成したLandscape用のMaterialを使用しています。のでどこまで実装すべきか分かりません。

ので今週はBuildしてHeight MapとMaskを出力しUEにImportする所までは実際にやって残りは、Tutorialを見ながら実際にやるのかどうかを決定する事にします。

6.1 細部の塗装を追加する

Color GraphにSat Maps ノードを追加しPort, Textureを追加します。

先週のBlogで以下の様に書いていますが

ここで作成していました。

Texture NodeはSat Maps ノードを使用するためには絶対必要なので、その辺から推測したら直ぐにこのPortの意味が分かったはずです。

今度、Port Textureを見たら直ぐにこの事を思い出すと信じて先に進みます。

以下の様にColorをセットしました。

Combineノードを追加します。

Combineノードの設定です。

このCombine ノードのMask様にFlowノードを追加します。

FlowノードにはPort FTを追加します。

結果です。

白い筋が入りましたね。

ここでTutorialではFlowノードの人を選択してShaperの値を下げています。

同じ事をやってみました。

白い線が少なくなりました。

最終の結果です。

先程追加した白い線は消えてしまいました。

後でMaskに使用するんでしょうか?

6.2 Exportを指定してBuildを行う

まずImageをExportするNodeにExportのMarkを付けていきます。

先週のBlogで以下の様に書きましたが、

右ClickしてもMark出来ないです。

F3は出来ました。

SlopノードにもMarkを付けました。

Base Shape Graphに戻ってCombine Water ノードをCheckしました。

TutorialではFTノードにもMarkが付いていたので付けました。

RiversノードのDepthのFXノードも名前をRiverと変更してExportのMarkを付けました。

更にSnowfallノードとRiversノードのOutputのFxノードにもExportのMarkを付けました。

SnowfallノードのShowの結果にもFxノードを追加してExport markを付けました。

ここでTutorialがExportのMarkの付け方を解説していましたが。右Clickをすると以下のBoxが表示されるので

その中からMark For Exportを選択しろと言っていました。

右Clickしたら選択出来るとは言っていませんでした。

TutorialではErosionノードのFlowに繋がっているFXノードにもExportのMarkが付いていました。

付けました。

Lake ノードのLakesのFXノードにもMarkを付けました。

これで全部のようです。

Buildを見ると10個あります。

Tutorialと同じです。

ExportするFormatをPng.8にしました。

以下の3つはHeight MapなのでPngにしました。

Resolutionを1009にしました。

RangeをNormalizedにしました。

TutorialではBaked CacheがStrictになっているので同じ様にしました。

以下の結果が出来ました。

ここでStep 3が終了していますね。

6.4 UEにImportする

Importすると書きましたが、実際はLandscape用のMaterialの作成だけしています。

それをやります。

Mega ScanからGrassのMaterialをImportして以下の実装を作成しました。

作成した後で、気が付いたんですがこれだとLayerの確認が出来ないです。

もうGaeaの勉強時間が無くなってしまったので、今週はここまでにして残りは来週やります。

7. 雪山のMapの作成

Volumetric Cloudの勉強をします。

2022-09-05のBlogでこれからのVolumetric Cloudの勉強の予定を以下の様にまとめました。

今週はUnreal Engine 5 Beginner Tutorial | Sky And Clouds [5]を勉強します。

7.1 前に勉強した時の復習をする

Unreal Engine 5 Beginner Tutorial | Sky And Clouds [5]はpinkpocketTV氏が作成したTutorialでVolumetric Cloudの勉強を始めてした時に、勉強したTutorialの一つです。

これの存在をすっかり忘れていたんですが、このTutorial、後から見直したら非常に良い出来で、Volumetric CloudのMaterialの仕組みの基礎を理解した今だからこそ、もう一回勉強すべき内容なんです。

と言う事で、やります。

しかし、前回勉強した内容を繰り返して勉強してしまうのは勿体ないので、最初に2022-09-05のBlogを見直して何を勉強したのかを確認します。

見直しました。

このTutorialはVolumetric Cloudに使用されているMaterialについてのTutorialではなく、それ以前のVolumetric Cloudの使用方法や設定方法についてのTutorialでした。Volumetric Cloud用のMaterialの作成方法についてはほとんど解説していません。

その代り、UE5におけるEmpty Levelから空を作成する方法が詳しく解説されています。

このTutorialにおける空の作成方法はEnv.LightMixerを使用しないやり方で、

Sky LightやSky AtmosphereとDirectional Lightを関連づける設定を手動でしている点です。

これ理解しないで、Env.Light Mixerでチョンチョンと空を作っていると、後で細かい調整をした時、なんでそうなるの?みたいな変な空になる可能性があると思っています。

現状のUE5では以下に示した様に、空が既に作成されているLevelを選択する事が出来ますが、

Gaeaなどの3D PartyのSoftwareを使用して作成したHeight Mapを使用してLandscapeを作成する場合はEmpty Open Worldを使用するのもっとも簡単で、その場合は空を自作する必要があります。

ので空の作成方法について理解しておく事は結構大切です。

UE5における空の作成方法については、ここで復習しておきましょう。

それ以外では、Volumetric CloudのMaterialにPlugin にある

にある

を使用して、

このMaterialのParameterであるLayer Bottom Attribute…とLayer Heightの調節方法を解説して

最後にDirectional Lightにある設定の以下の二つに

Checkを入れてLight Shaft (God Ray) を追加しています。

そう、後一個、重大な事がありました。

UE5の空の作成では、UE4と違いSky Sphereを使用しないんです。

Env.LightMixerを使用して簡便に空を作成する場合でも、以下のActorを追加するだけです。

この中にSky Sphereは入っていません。

このTutorialを勉強した2022-09-05のBlogでも

と述べていてUE5ではSky Sphereは使用しないみたいと書いています。

しかしDefaultで空が作成されているLevelを開くとSky Sphereは使用されています。

この辺についての調査を少ししたいです。

7.2 Unreal Engine 5 Beginner Tutorial | Sky And Clouds [5]を実装す

取りあえずUnreal Engine 5 Beginner Tutorial | Sky And Clouds [5]の方法で実装します。それから色々考える事にします。

せっかく2022-09-05のBlogUnreal Engine 5 Beginner Tutorial | Sky And Clouds [5]の空の作成方法をまとめたので、それに基づいてやってみます。

その後で、Tutorialを見直して検討や考察をします。

考察すべき内容は、

  • 空の作成方法について
  • Pluginから使用したVolumetric Cloud用のMaterialについて
  • Sky Sphereについて

の3つです。

この辺に注意を払いつつ実装をやって行きます。

<空の作成>

まずEmpty のLevelを作成しました。

Directional Lightを追加します。

Directional Lightを追加しただけでは真っ黒なんですね。

次にSky Lightを追加します。

Sky LightのReal Time CaptureにCheckを入れます。

2022-09-05のBlogで書かれている通りに以下の警告が現れました。

Sky LightのReal Time Capture を使用するためにはSky atmosphereが一個以上必要です。と言っています。

Sky Atmosphereを追加しました。

2022-09-05のBlog

と書かれていますが、このParameter見つかりません。

調べたらDirectional LightのParameterでした。

既にCheckが入っていました。

これで、Directional LightとSky LightとSky Atmosphereが繋がって空が青くなるそうです。

いや、なってないじゃん。と思って上を見上げたら空がありました。

この後、Ctrl+Lを使って太陽の位置を動かす方法を勉強しています。

これは今となっては常識Levelの内容なので今回はSkipします。

Exponential Height Fogを追加して地面が真っ黒であるのを直します。

結果です。

2022-09-05のBlogには、Blown outしているので以下の方法で直すと、Tutorialに書かれていたが、Defaultで直っていたと有ります。

まずTutorialにかかれていたとされるBlown Outの直し方ですが、以下の方法です。

2022-09-05のBlogによるとVolumetric FogにCheckを入れる以外はDefault値で直っていたそうです。

見てみましょう。

Fog Inscattering Colorです。

黒くなっていますね。

Directional Inscattering Colorです。

こっちも黒くなっています。

Volumetric Fogです。

これにはCheckが入っていません。

入れました。

画面が微妙に白くなった気がしますが、正直あんまり分かりません。

今度は、空と地面の境目のボケを直すそうです。

2022-09-05のBlogには以下の様に書かれていました。

Project Settingを開いてSupport Sky Atmosphere Affecting Height Fogを検索すると

既にCheckが入っていました。

ここまでが空の作成です。

<Volumetric Cloudの追加>

ここからVolumetric Cloudの追加になります。

Volumetric Cloudを追加しました。

この後、2022-09-05のBlogでは、このVolumetric CloudのMaterialに別のVolumetric Cloud用のMaterialを追加するためにPluginsであるVolumetricを追加する方法が延々と説明されています。

これは本筋とは関係ないのでここでは省きます。

で、そこにあった、M_VolumetricCloud_02_Profiles_PaintCloudsをVolumetric Cloud用のMaterialに使用します。

ではこのMaterialの実装を一寸だけ見てみますか。

一応Copyを作成してそっちを見て行きます。

M_VolumetricCloud_02_Profiles_PaintCloudsの実装です。

おお。かなり複雑ですね。

分かる所だけ見て行きます。

まずMain Nodeです。

何でこんなデブになっているのと、最初驚いたんですが、これはMain Nodeの設定のせいではなく単にこのMaterialの名前が長いからでした。

Main Nodeの設定はVolumetric Cloud用のMaterialの設定でした。

Volumetric Advanced Outputです。

Conservative Densityは使用していませんね。

AlbedoとExtinctionの実装は複雑過ぎるので今回は読むのは止めておきます。

使用しているVolume Textureだけ調べます。

VT_CurlNoiseが使用されていました。

これです。

あれ、3Dで表示する方法があったはずですが、

ありました。

2022-07-25のBlogにやり方がまとめられていました。

2022-07-25のBlogのやり方はUE4のやり方でUE5ではTrace Into Volumeの場所が一寸だけ違っていました。

一応、その場所を以下に示しておきます。

結果です。

Opacityの設定はTool Barにありました。

Opacityを下げてみます。

結果です。

うーん。Curl Noiseの値を3Dで指定しているんでしょうか?

あんまり良く分かりません。

M_VolumetricCloud_02_Profiles_PaintCloudsの実装については来週以降じっくり時間をとってやって行くので、今週はここまでとし、Tutorialの勉強に戻ります。

M_VolumetricCloud_02_Profiles_PaintCloudsをVolumetric CloudのMaterialにセットします。

結果です。

新しいLevelなので、まだBookmarkを設置していないのでこの位置からしか確認出来ませんが、確かにDefaultの雲と比較して格段に雲らしい雲です。

一応、Volumetric Cloudの設定も確認します。

Layer Bottom Altitudeです。

2022-09-05のBlog

AltitudeをAttributeって書いていました。

最後にDirectional Lightの設定を変更しています。一応これもやっておきます。

Light Shaft OcclusionとLight Shaft Bloomです。

結果です。

2022-09-05のBlogに書かれている通りでLight Shaft Bloomの違いは分かるんですがLight Shaft Occlusionの違いは良く分かりません。

以上です。

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

8. UI Designの勉強

8.1 UI Designの完成

先週までで全部のUIを直しました。

一回、GameをPlayしてみます。

Stage 4で負けてしまいました。

しかしこのGameやってみて面白いです。

通常のGameでは最後に生き残った方が勝ちになります。しかしこのGameではどちらか一方のMonsterが一体死ぬと負けになります。

今までにない発想のGameで、それ故にどんな戦術を選択すべきなのかがこのGame独自の持ち味になっています。

予定では、この後に報酬の画面を追加する予定でしたが、報酬については良く考えていなかったので、このGameの持ち味を生かしながら、Gameの設計から新しく考えて最初から全部作り直したいです。

それでこれからは、このGameに報酬システムを追加した新しいGameを考えます。

8.2 報酬について今まで考えた事

今週はどんな報酬を与えるのかについて今までBlog内で検討した内容をまとめます。

前に作成したScoreboard Widgetです。

取りあえず適当に報酬になりそうなものを並べています。

うーん。

もうどんなIdeaがあってこれを作成したのか覚えていません。

過去のBlogを見直してみます。

2022-06-12Blog

今のGameの設定では報酬をもらう意味がないので以下の様に今のGameの設定を敢えて変えて報酬を出す事にしています。

結局、この今のGameの設定を一寸だけ変更すると言う案が駄目なんです。

Gameの設定を一寸だけ変えるのって、最初から作り直す方が楽なくらい全部を変更する必要が出て来ます。

量を変更するのなら、後からでも一寸ずつ変更する事って出来るんです。でも質を変更するのって一寸だけやるってのは無理だったんです。

今回の報酬を追加する。というIdeaはこの質の変化を私の作成したGameにもたらしました。

ので全部最初から作り直します。

しかし凄いIdeaがここに書かれていました。

これはぜひ実装したいIdeaです。

後、報酬でMonsterをもらえる事について、強いMonsterがもらえるならかなりうれしい。と書いています。

これは今のGameのシステムでも新しいMonsterが貰える事は十分な報酬になる事を言っています。

しかしMonsterのTypeがグー、チョキ、パーしかないのでどんなMonsterを報酬にするのかが難しくなります。

今、思い付いたのはグー、チョキ、パーに色を付けて、黒はジャンケンに買った時は、攻撃力が3倍になるけど、負けた時のDamageも3倍になる。みたいなのも追加したら良いかもしれません。

2022-07-25Blog

ここでは2022-06-12のBlogのIdeaを更に深堀しています。

結論としては、報酬はMonsterと経験値の2つだけにすべきとありました。

新しいMonsterが貰えると次の戦闘に使用出来るのでうれしいです。さらに経験値が増えると、魔術師は新しい魔法を覚えます。これも次の戦闘を有利に進める事が出来るのでうれしいです。

ここでは結論として、他の報酬を出すためにはこのGameの構成を根本から作り直す必要があり、現状では報酬はMonsterと経験値に絞るべきだと述べていました。

これはその通りで、このRootで直すもの有ですね。

以上でした。

8.3 報酬について

来週からこの点について考えてみます。

UI Designの勉強は今週で終わりにします。来週から報酬システムを組み込んだGame の構築にします。

9. Anime Renderingの勉強

9.1 今週からの予定

  • Vroidで作成したModelをUEにImportする
  • 公式のDocumentのStylized Rendering[7]の勉強
  • 法線転写をUEで実装する方法を検証

をやって行きます。

今週から10回程度をメドにします。

9.2 Vroidで作成したModelUEImportする

今週は先週ImportしたVroidのMaterialを見て行きます。

Vroidに使用されているMaterialですが以下に示した様に12個もあります。

こんなにMaterialがあるんですか。

Materialの生成においてTextureの読み込み部分が一番、計算Costが掛かる箇所です。同じ一工程でもTextureのDataを引っ張って来るのはMemoryを跨いでいるだけ非常に時間が掛かる訳です。だからMaterialを作成する人は使用するTextureの数をなるだけ減らす方向で頑張る訳です。一見するとこのように沢山のMaterialを使用するのはそれぞれのMaterialで別々なTextureを読み込む訳で計算Costを非常に高くしているように見えます。

その辺はどうなんでしょうか?

こんな疑問を持ちつつ次に進みます。

どのMaterialがこのModelのどの部分を担当しているのか調べます。

Static Meshを開きます。

ありました。

<Element 0

これは口の中のMaterialを担当しているようです。

このMaterialの実装を見てみます。

これはMaterial Instanceでした。

この親Materialを開きます。

これもMaterial Instanceでした。この親Materialを開きます。

これもMaterial Instanceでした。この親Materialを開きます。

これはMaterialでした。

これの実装を見てみます。

うん。

沢山、Materialはありますが一個一個はそんなに複雑じゃないのかもしれません。読んでみます。

Main Nodeです。

Material Attributesを使用していますね。

その一個手前のNodeです。

Customized UV 0の値を追加しています。

まずCustomized UV 0を使った事がありません。

これって何をするんでしょう?

以下に普通のMain Nodeを示します。

Customized UV0はありません。

次にNum Customized UVsに1を代入します。

Customized UV0が現れました。

どんな機能を担当しているのか調べます。

公式のDocumentにCustomized UVs [6]がありました。

うーん。これだけ。

その下の解説に詳しく説明されていました。

Texture SampleのUV値ですが、通常の方法で設定するとPixel毎に計算されます。

これをCustomized UV0で計算するとVertex毎の計算になるそうです。

通常の計算でTexture SampleのUV値を指定している例です。

結果です。

1 Pixel毎に計算されているため、Smoothな線で描かれています。

以下の実装はTexture SampleのUV値をCustomized UV0を使用して指定しています。

結果です。

Vertex毎にしか計算しないのでギザギザです。

これだけ理解出来れば十分でしょう。M_VrmMToonBaseOpaqueの実装に戻ります。

Customized UV0の値を追います。

うん。

あ、成程、Customized UV0は敢えて指定しないとMaterial Attributeの中で消えてしまうんでしょうね。

と言うとこの先のNodeでCustomized UV0の値を計算しているはずです。

Material Functionですね。

この実装を開いてみましょう。

ふああああああああっ。

なんじゃこれ。

Output ノードを見つけました。

その手前のNodeです。

ここでCustomized UV0が指定されています。

これはLuckyかもしれません。

これを追ってみます。

UV Scrollと言う名前のBlockに到着しました。

今週はこれの実装を読む事にします。

<UV Scroll

まずBUseUvAnimノードです。

これはSwitch Parameterノードです。ので簡単なFalseの方を追います。

TexCoord[0]ノードでした。

なーんだ。

これは簡単。

それではBUseUvAnimノードのTrueを追っていきます。

Quality Switchノードです。

始めて見るノードです。

公式のDocumentであるUtility Expressions [7]では

と解説されていました。

要するに低品質のPCの場合はLowの値を、それ以外の場合はDefaultの値を流す訳です。

当然、実装が簡単になるLowの場合から見て行きます。

はい。

Quality SwitchノードのDefaultの場合も見てみます。

Feature Level Switchノードです。

ES2って携帯の基準でしたっけ。

これの公式のDocumentを見てみます。

Utility ExpressionsのFeatureLevelSwitch [8] の解説です。

はい。この解説を読むとESがOpenGL、SMがDirect XのVersionに対応しているんですね。

OpenGLのES2とES3_1はTexCoord[0]に繋がっていました。

DefaultとSM4_REMOVEDはCustom Rotatorに繋がっていました。

???

Feature Level SwitchノードやQuality Switchノードって繋いでいないInputはDefaultの値がそのまま使用されると思っていたんですが違うんでしょうか?

これ見るとDefault とSM4_REMOVEDだけがCustom Rotatorノードの計算した値を使用するように見えます。

この解説を読むとInputが接続されていない場合は、Default値を使用する。と言っているように思えます。

SM4_REMOVEDは繋げなくても同じ結果になる気がしますが、まあ結果は同じなので先へ進みます。

Custom Rotatorノードですが、Textureを回転させる気なんでしょうか?

Rotation Angle(0-1)(s)をずっと遡ったらTimeノードがありました。

これは完全にTextureをくるくる回すための実装ですね。

Rotation Centerは当然ですが0.5、0.5がセットされています。

Rotation Angleの実装です。

TimeはFracで小数点の繰り返しにしています。それにMtoon_Tex_UvAnimMaskTextureノードのTextureのRの値を掛けています。これはMtoon_Tex_UvAnimMaskTextureノードのTextureを実際に見ないと分かりませんが、目とかがグルグルまったりする部分なのかもしれません。

その後のMultiplyノードのBには以下のMtoon_UvAnimRotationが繋がっていました。

これDefault値が0なので通常は回転しません。と言う事になります。

UV値の値ですが、以下の様になっていました。

当然ですが、TexCoord[0]ノードです。

それに何かを足しています。

これはTexCoord[0]の値をXとY方向にずらすための実装ですね。

うーん。何のために使うのか今一分からない。

これでUV値をずらした場合、TextureのCenterはどうなるんでしょうか?

この実装の目的が分からないと何とも言えませんが、要らない気がします。

MultiplyノードのBの先の実装も見てみます。

ええ。これに繋がっているのか。

と言う事はUV値も回転しているの?

いや、これはAddしているのでX方向とY方向にPanしているのか。

うーん。

どこでこれを使用するのか分からないとなんでこんな事をする必要があるのか分かりませんね。

しかしUV Scrollの実装内容については大体理解しました。

このUV Scroll内に以下のUVScrollと言う使用していないNodeがあります。

このNodeはCustom Nodeで以下の様に設定されていました。

これ見ると、Custom Rotatorノードの存在が分からなかった時に、同様の機能をここで実装させていたみたいです。

UVの中心を0.5ずつずらしていないですね。

と思ったら、Custom Node内でずらしていました。

となると、UV値の計算でTimeノードを掛けた値を足しているのは何らかの目的があってやってるのは間違いないですね。

うーん。Ben先生のTutorialでPanのやり方を解説してるのがあったはずです。

来週はそれの復習からやりますか。

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

9.3 公式のDocumentStylized Rendering[7]の勉強

<Foliageに使用されている他のStatic MeshのMaterialについて>

以下のStatic MeshがFoliageに使用されていましたが、そのどれもが同じMaterialを使用していました。

のでFoliageに使用されているStatic Meshに使用されているMaterialについては全部見た事になります。

<城に使用されているMaterialを見る>

今度はどのMaterialを読もうか考えたんですが、以下に示した城のMaterialを見る事にしました。

まずは無難に以下の城の柱の部分のStatic Meshに使用されているMaterialを見ます。

以下の2つが使用されています。

最初のMaterial Instanceの元のMaterialは以下のM_StoneWall_Masterでした。

今週はこれの実装を読む事にします。

うーん。

まずはMain ノードです。

これは普通ですね。

Emissive に何も繋がっていません。これで陰が出ているんですね。

Base Colorの実装を見てみます。

まずLerp ノードがありました。

便宜上、このLerpをLerp1と名付けました。

Lerp1のAはLerp2に繋がっています。

Lerp1のBは以下に示したVector Parameter ノードに繋がっています。

Lerp1のAlphaは以下のTexture Sampleに繋がっていました。

このTexture SampleはTexture Sample2と名付けました。

このTexture Sampleに使用されているTexture のBは以下の様になっていました。

これが以下に示した様な城のBrickを表しているんですね。

Texture Sample2のUVsの実装です。

ここにBrickがもっとRandomに現れるためのMaskと書かれていました。

UVsの実装の目的ですね。

ただ、0.5を掛けただけでBrickがもっとRandomになるとは思えません。サイズが2倍になるだけでしょう。この先の実装も含めた全体的な目的だと思います。

ここのMultiplyノードにはMultiply1と名付けました。

MultiplyノードのAの値を見てみます。

何とPannerノードが使用されています。

公式のDocumentのAnimating UV Coordinates [9]のPannerにはSpeedがありません。

まあ、古いImageをそのまま使用しているんでしょう。

Pannerノードの使用方法はAnimating UV Coordinates [9]を読んだらすぐに思い出しました。TimeにはTimeノードを繋げて、CoordinateにはTexCoord[0]を繋げます。これでPanします。

PannerノードにはSpeedを設定する箇所があるので、X方向だけに動かしたい時はYの値を0にすれば良いです。

このPannerノードを単なるOffsetとして使用する事も出来るそうです。その時はTimeにConstantをセットすれば良いそうです。

この辺を踏まえて以下の実装をもう一回見直すと

PannerノードのCoordinateの実装は単にTexCoord[0]の値に2を掛ける事で、TextureのSizeを半分にしているだけです。

PannerノードのTimeの実装も見てみましょう。

これは単なるConstantをそのMaterialを使用しているStatic Meshの位置から計算しているだけです。

これはPannerノードを単なるOffsetの作成のために利用しています。

言われてみれば、城の壁がPannerしていたらオカシイですね。

これでLerp1のAlphaの実装が理解出来ました。

今度はLerp1のAにあるLerp2の実装を追います。

まずLerp2のAですがLerp3に繋がっていました。

これは最後にします。

Lerp2のBですが以下のVector Parameterに繋がっていました。

ここで色の指定をしています。

最後のLerp2のAlphaですが、

Texture Sample1のRの値にLerpしてClampしていました。

Texture Sample1のRです。

白い部分もあんまりはっきりしていませんね。

だから白を1、黒を0にするためにLerpしてClampしたんでしょう。

以下の城の柱を見ると

Brickと四角の線はほぼ同じ位置かつ同じ大きさです。

なのでこのTexture SampleのUV値は先程のBrickとほぼ同じ値を代入する必要があるはずです。

Brickの大きさや位置を指定している先程のLerp1のAlphaの値を指定しているTexture SampleのCoordinateの実装と同じ実装を使用していました。

当然ですね。

ただしBrickのTextureはこの後で0.5を掛けているので

四角の線よりBrickの方が2倍の大きさになります。

以下のImageをみると

確かにBrickは線からはみ出していますが、2倍の大きさにはなっていないですね。

元のTextureを見るとBrickに使用したGの方が、線に使用したRより小さい事が分かります。

これがBrickの大きさを2倍にしてもそこそこしか線からはみ出していない原因と思われます。

これでLerp2の実装も理解出来ました。

Lerp2のAに繋がっているLerp3の実装です。

基本的にはLerp1、Lerp2と全く同じ構造をしていました。のでここで解説する事はやめます。

ここで一つ気が付いたんですが、Lerp3のAとLerp1のBが全く同じ色を使用しています。のでLerp3のBは実際は見えてないのかもしれません。

この辺まで丁寧に追及するにはこのMaterialの実装のCopyをどこかに作成して、このMaterialを使用したStatic Meshを作成し、Materialの実装を少しずつ変更して変化を確認する必要があります。

しかしそこまでやらなくてもこのMaterialの実装方法が、Stylized Rendering内の他のMaterialの実装方法とそんなに変わっていない事は確認出来たので、これで十分だと思いここで終了する事にしました。

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

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

で、軽く読んだんじゃ理解出来ないんで、がっつり読み込む事にしました。

でそうなると結構、[UE4] 動的法線転写について[10]のサイトの内容をそのまま書き込む必要が出て来ます。のでもし苦情が来たらこの部分の内容は全部消します。

まずMaterialのMain ノードのNormalにパスした値がNormalになるので、法線転写はそこに球体の情報をPassすれば出来るそうです。

やり方としては以下の方法で実装するそうです。

最初のBlendはまあ、出来なくても良いです。球のNormalの情報さえPass出来たら今回はOKとします。

でも、想像するにLerpのAに元の法線、Bに球体の法線、Alphaに混合割合を指定したら出来そうではあります。

この場合、混合した後で正規化する必要はあるんでしょうか?その辺は分かりません。

2番目は言っている事は理解出来ました。3D Modelの顔を球で覆ってその球の中だけ法線転写を使用すると言う意味だと理解しました。

三番目はどうやって補間するんでしょう。

これが一番、やり方が分からないです。

うーん。

考えても分かりません。先に進んで答えを見る事にします。

まずModelの準備だそうです。

私は先週、ImportしたVroidのキャラでやります。

ただこのキャラのMaterialがどうなっているのかまだ全然理解していないので、顔や髪の部分だけ簡単なMaterialに置き換える事にします。

[UE4] 動的法線転写について[10]でも

と書いてありました。

まずSkeletal MeshのBPを作成します。

どうぜ後でSphereを追加するんだからBPで編集します。

そのBPのSkeletal Meshに先週作成したキャラを追加しました。

このModelの顔の部分のMaterialです。

このModelの髪の部分のMaterialです。

この二つに使用するMaterialを作成します。

BaseとなるMaterialです。

実装はこんだけです。

これから顔と髪用のMaterial Instanceを作成します。

セットしました。

これから色を調節します。

顔のMaterialのBase Colorに肌と同じ色をセットしました。

うーん。何これ?

こんなに変な色になるの?

試しにUnlitにしたら肌と同じ色である事が確認出来ました。

まあ、法線転写の確認のためだから別に変な色でも問題ないでしょう。

髪のMaterial InstanceのBase Colorにも色をセットしました。

こっちはそんなに変な色ではないですね。

陰はそれなりに写っています。

ただこれだけだと陰が見にくいのでPost Processに影を黒くするMaterialを追加します。

2022-05-02のBlogで勉強したUnreal CG 氏のToon Shader & Custom Shadow - UE4 Postprocess Tutorial [11]の影の部分の実装をそのまま使用して作成しました。

このMaterialのInstanceをPost Process Volumeの以下の箇所にセットしました。

結果です。

何で髪の部分は黒くならないんでしょうか?

他の部分は、Vroidの付属のMaterialなのでPost Processが効かないのは分かりますが、髪は私がさっき作成したMaterialです。

顔の部分と同じになるはずです。

髪のMaterial Instanceを顔のMaterial Instanceと同じにしました。

これだったら法線転写の影響がはっきり確認出来るでしょう。

でももう時間が無くなってしまったので、残りは来週やります。

10. まとめと感想

今週は途中で急な用事が入ってしまったのでいつもの半分位しか勉強出来ませんでした。

まあ、そう言う時もあります。

11. 参照(Reference

[1] CGHOW. (2022, June 11). UE5 Niagara #ScratchPad Module #8 | Voxel FX. YouTube. https://www.youtube.com/watch?v=kftOZ1Cz-ec&list=PLwMiBtF6WzsqfBv2rYkHe93Whx5AY1u6o&index=8

[2] CGHOW. (2022, June 13). Collision Query | UE5 Niagara #ScratchPad Module #9 [Video]. YouTube. https://www.youtube.com/watch?v=kxFgm8B7Tm4&list=PLwMiBtF6WzsqfBv2rYkHe93Whx5AY1u6o&index=9

[3] Cloward, B. [Ben C. (2022, July 28). Radial Blur Post Processing - Shader Graph Basics - Episode 55 [Video]. YouTube. https://www.youtube.com/watch?v=KLOGaHgo2GY

[4] 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

[5] pinkpocketTV. (2022, January 14). Unreal Engine 5 Beginner Tutorial | Sky And Clouds [Video]. YouTube. https://www.youtube.com/watch?v=lYZoR3ZLD-o

[6] Customized UVs. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/CustomizedUVs/

[7] Utility Expressions. (n.d.-a). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/ExpressionReference/Utility/#qualityswitch

[8] Utility Expressions. (n.d.-b). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/ExpressionReference/Utility/#featurelevelswitch

[9] Animating UV Coordinates. (n.d.). Unreal Engine 4.27 Documentation. https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/AnimatingUVCoords/

[10] 株式会社ヒストリア. (2022, June 30). [UE4] 動的法線転写について. Historia Inc - 株式会社ヒストリア. https://historia.co.jp/archives/11921/

[11] UnrealCG. (2020, June 25). Toon Shader & Custom Shadow - UE4 Postprocess Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=mx_AvrZK3TA