UE4の勉強記録

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

UE5の勉強 -LandscapeのみのGameを作成する-

1.今週の予定

<LandscapeのみのGameを作成する>

以下の内容をやります。

  • GPU Crashed
  • FoliageにおけるStatic Meshの数
  • Shader Complexity
  • 風景の作成の続き

Niagaraの勉強>

CGHOW氏のNoise to Stylized Trail in UE5 Niagara Tutorial [1]を実装します。

<Materialの勉強>

Ben Cloward先生のAdvance Material Tutorialを勉強します。

<戦闘システムの続きを作成する>

効果音をもっと検証します。

<Gaeaの勉強>

BuildしてUEでMaskのLayerを確認するか、RiverやLakeなどの追加用のNodeについて調査します。

<Houdiniの勉強>

FOUNDATIONS | OVERVIEW [1]の続きを勉強します。

<Volumetric Cloudの勉強>

Volumetric Cloudの勉強は一端中止して、UEFNの勉強をします。

DirectXの勉強>

 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [2]のLinking Our Projectを勉強します。

2. LandscapeのみのGameを作成する

先週、一週間休んだので今週はかなり体力とやる気が回復しました。

その代り、何を今までやっていたのかは結構忘れてしまっています。

先々週のBlogを読み直しながらやって行きます。

2.1 GPU Crashed Errorについて

先々週、Foliageを大量に配置すると以下のようなErrorが発生する事がありました。

これがどんなErrorなのかよく分かりません。

これを調べる事にします。

まず公式のSiteにあるGpu crash/d3d device removed error?[2]です。

このサイト、色々な解決方法が載っていますが、このCrashの原因が何なのかについてはほとんど説明していません。

これやったら直ったとか、そんな対症療法ばっかし載っています。

これ映像作品だったらそういう直し方でも良いですが、Gameの場合そのGameをPlayする人達の使用するPCの設定も同じように直してもらうつもりなんでしょうか?

そんなの無理でしょう。

keep getting error: GPU crashed or D3D Device removed. Use-d3ddebbug to enable the D3D debug device. Use gpucrashedebugging to track current GPU state. [4]を見るとGameをPlayしていてこのErrorに遭遇する人もいる事が分かります。

Forumに載っている解決策は全部不完全な感じがします。

JSFILMZ氏がUE5 GPU Crashed or D3D Device Removed Fix [3]でこのErrorについての直し方について説明しています。

これもその原因についてほとんど説明していません。

うーん。

原因は不明。解決策はSiteや動画によってまちまち。

とりあえず、今見つけた解決方法のうち原因らしきものを述べているものに限り以下にまとめます。

と思ったら公式のSiteのHow to Fix a GPU Driver Crash [5]に詳しい解説がありました。

こっちをまず読みます。

原因もしっかり書かれていました。

OOMのMemoryはCPUのMemoryの事でしょうか?それともVRAMの事でしょうか?

TDR Eventは聞いた事がないです。

調べます。

Microsoftの公式SiteにTimeout detection and recovery (TDR)[6]がありました。

分かりました。

要はGPUが計算が忙しくて反応出来なくなると、OSがGPUを強制的にResetしてしまう機能の事です。

当然ResetされたGPUは再起動しますので、まっさらな状態に戻り前の計算は無かったことになります。

残りの3つのBugは直しようが無いので無視します。

最後のHardwareの問題はおっかないです。

更に解説があります。

これらのどれが原因なのかを追究するためには、通常ならCrash Reporterが作成したCallstackとその時のlog files を見ますよね。と書かれています。

よく分かりませんが、そうだと仮定して次を読みます。

しかしCrash ReporterはGPUがCrashした時にCPUが何をしていたのかを説明するだけで、CPUが何をしている時にCrashしたのかについての情報は全く分からないそうです。

のでLog Fileを見るしかCrashの原因を判明する方法はないそうです。

以下の2つのCommandでLog Fileが見れるそうです。

  • -gpucrashdebugging
  • -d3ddebug

このどちらかのCommandを使用した状態でEngineを起動しErrorが起きるまでEngineを使用します。

Errorが起きてEngineが止まったら、[Your Project]/Saved/Logs folderにあるFileをみてErrorの原因を追究します。

だそうです。

うーん。Errorが起きる原因自体は、消してしまったので今すぐこれを試すのは無理ですね。

WindowsをOSとして使用しているPCの場合、AppがCrashしたらdump fileが生成されるそうです。それも参考に出来るそうです。

成程。

<Resolving GPU Out-Of-Memory (OOM) Issues>

Memoryが問題だった場合の解説方法です。

Task ManagerからPerformanceを選択してGPU 0を選択します。

Dedicated GPU Memoryの値を見ます。

この値が最大値に近づくとErrorが起きるそうです。

先々週のBlogを見ると

この部分がパンパンになっている記録がありました。

こうやってその時はあんまり重要じゃないと思っても後から見直すと非常に貴重な情報を書いている時ってありますね。

兎に角、私の場合のCrashの原因は判明しました。

解決策もしっかり載っていました。

最初の解決策は関係ないのでSkipします。

次の解決策ですが、

  • lower resolution textures,
  • lower resolution meshes,
  • culling to reduce objects in the scene.

とあります。

うーん。TextureのResolutionを下げるのは理解出来ますが、Naniteを使用しているのにMeshのResolutionも下げる必要ってあるんでしょうか?

最後のCullingは今週試そうと思っていました。

まあ。

こっちが正しい解決策ですよね。

こういう所を修正しないと、UserがGameをPlayした時も同じようなErrorが起きる訳ですから。

三番目の解決策です。

screen resolutionを下げます。

Level Viewport のScreen Percentageを弄る事でscreen resolutionを下げる事が出来るそうです。

これってPlay画面でもそうなんでしょうか?

調べます。

ここでScreen Resolutionを調整します。

Play中です。

使用GPUメモリです。

Screen Percentageを50に下げました。

Playします。

大体同じ場所に着きました。

GPUのメモリです。

変わってないです。

うーん。

よく分かりません。

残りの2つも関係ないのでSkipします。

残りの記事はTDR Eventなどについてなので今回は関係ないはずです。

一応、原因が判明しました。

2.2 Landscapeから作成し直してみる。

Landscapeだけ作成し直して、VRAMがどれだけ使用されているのか確認します。

この状態でVRAMの使用率は

です。

この状態でPlayをすると

一気に6.3GBまで上がります。

Packagingした場合はどうでしょうか?

Packagingの設定は

を変更する事と

の以下の値を先程作成したMapに変更するだけで良かったはずです。

最後にBuildします。

Buildが終わったのでPackagingをします。

Packagingが完成しました。

公平を期すためにUE5 Editorは閉じます。

今のVRAMの状態です。

Exe Fileを起動しました。

なんとたった3.9GBしか使用していません。

これなら先週作成したLandscapeでも試して見る価値ありそうです。

まずBuildをします。

Buildするだけで結構限界です。

Browserとか全部閉じました。

Buildが終わりました。

Packagingをします。

Packagingが終わりました。

Editorを閉じます。

今のVRAMの使用率です。

Exe fileから起動します。

結構高いですね。

うーん。

一寸工夫が必要である事は間違いないですね。

以下の3つを検討する事にします。

今週は他にも検討する事が有るので、GPU Crashed Errorについての検証はここまでとします。

2.3 FoliageにおけるStatic Meshの数

Cullingについて調べるんだろう。と思っていたらそれは先々週に既にやっていました。

何をするのかと思ったら以下の事をやりたいと言っていました。

やってみます。

Virtual Textureが使用出来るRockのFoliageで試そうとしたら紫色のRockが大量に発生しました。

あ、Virtual Textureをセットするのを忘れていました。

ので別なRockで試します。

こんな感じで島全体にRockを配置しました。

今のRockのDensityの設定が

です。

10倍の100にしてみます。

18万個配置しました。

こんな感じです。

Playしてみます。

7GBまで上昇しました。

Play中に移動するとFPSが落ちる現状が確認出来ました。

これはCullingで対応すべき問題です。

まずFPSを表示します。

うーん。

どうやったのか忘れました。

調べます。

Editor PreferenceのPerformanceにあるShow Frame Rate and MemoryをEnableします。

うーん。

前回やった時はCommandで表示した気がします。

まあ良いです。

今回はこれで表示します。

なんと。この方法で表示すると以下の箇所でFPSが表示される事が判明しました。

これは見にくい。

FPSを表示するためのCommandを調べます。

stat fps

でした。

ああ。

そうでした。

FPSが表示されました。

以下の様にFoliageで石を配置しました。

17万個配置しています。

原因が分かりました。

Landscapeの境界に来ると一瞬だけ止まるです。

Foliageとはなんの関係も無かったです。

これがPackagingした後でも起きるのか確認します。

起きます。

うおお。UEがCrashしました。

UEを再起動しました。

今度はFoliageを全部消して試してみます。

Landscapeの境界に来ても全く引っかかりません。

成程。

理解出来ました。

Foliageの数とLandscapeの境界の両方が関係しています。

この問題については来週また考える事にします。

今週は、Foliageの数が増えるとLandscapeの境界で引っかかる現象が起きる事が判明したので良しとします。

2.4 Shader Complexity

Landscapeのみの状態でShader ComplexityをEnableすると以下の様に

Badを表す赤い色が表示されます。

これってLandscapeのMaterialのせいなのかそれとも元々のLandscapeのせいなのかを調べます。

LandscapeのMaterialを外しました。

Shader Complexityを調べます。

緑になっています。

うーん。

成程。

正しGPUのMemoryはあまり変化していませんでした。

Improve GPU Performance in Unreal Engine 5 by Allocating Maximum VRAM for Texture Streaming [7]に解決策らしきものが紹介されていました。

ぱっと見たのではっきりとは理解していません。

やっている事を簡単にまとめると以下のFolderにある

WindowsEngine.iniの

Pool Size VRAM Percentageの値を70から

0に変更するだけです。

このTutorialはNumen Brothers氏によって制作されていますが、

この人初めて知りました。

Single RPGを作成しているそうです。

そこで勉強した内容をTutorialとしてShareしているみたいですね。

また内容をしっかり見た訳ではないので、何とも言えませんが、ひょっとすると結構役に立つTutorialを作成している人かもしれません。

2.5 風景の作成の続き

以下の風景をもっとRealにします。

以下の様にしました。

うーん。

まだなんか足りないです。

現実の風景と比較して検証します。

塀がないです。

現実の小道には大抵塀が有ります。

塀を追加しようと思ったんですが、時間が無くなってしまいました。

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

2.6 来週の予定

以下の事を来週はやる事にします。

  • Landscapeの境界で引っかかる件について(Foliageの数との関係を見極める)
  • Numen Brothers氏のImprove GPU Performance in Unreal Engine 5 by Allocating Maximum VRAM for Texture Streaming [7]を勉強する
  • LandscapeのMaterialのTextureのサイズを小さくした場合、VRAMの使用率が減るのか試す。
  • EditorにおけるVRAM使用率を減らす方法を調査。(Editorの時だけVRAMの使用率を減らす事が出来たら十分)
  • 風景作成の続き

2.7 UE5.2におけるWater Systemについて(追記)

UE5.2がReleaseされました。

そこでUE5.1ではPackagingすると消えてしまったWater SystemのRiverがどうなっているのか確認します。

2023-01-30のBlogに以下の様に書かれています。

これは確認のためにPackagingしたらWater SystemのRiverが消えていた事について記録しています。

これと同じ事をUE5.2で行い、同じようにWater SystemのRiverが消えるのかを確認します。

もうテストなんで以下のような非常に簡単なLandscapeで試します。

このProjectをPackagingします。

やり方はいつもと同じです。

Exe Fileを起動します。

あれ?

Water SystemのRiverが存在しています。

うーん。

Water Systemって使用出来るようになったのでしょうか?

まだExperimentalではありますね。

3. Niagaraの勉強

今週はCGHOW氏のNoise to Stylized Trail in UE5 Niagara Tutorial [8]を実装します。

先々週、これを勉強しました。

昔、Ribbonを引っ張ると以外に綺麗なEffectになる事を昔偶然発見したんですが、(以下にその例を示しています。)

それをどうやってEffectとして利用したら良いのか分からなかったんです。

今でも分らんです。

そしたらCGHOW氏がRibbonを引っ張って作成するEffectを公開していました。

それがNoise to Stylized Trail in UE5 Niagara Tutorial [8]だったんです。

それで押っ取り刀で駆けつけて先々週このTutorialを勉強しました。

その感想ですが、

  • Ribbonを引っ張る部分の実装が全くない。
  • Ribbonに使用しているImageが美しくなく、引っ張って出来たImageもそれ程美しくない。

でした。

つまり私が知りたかった事はここには全く述べられていませんでした。

先々週のBlogでは、引っ張って出来たImageが美しくないのは黒を使用していないからなのではないか、との推測もしていました。

はい。

自分が望んでいた内容じゃなかった。

それでまあ、一応は実装もするけど、そんなにやる気も出ないでいました。

ところが、先週CGHOW氏は以下の新しいTutorialを公開したんです。

先週は、絶対休息すると決めて、UE関連のものには全く触らないと決めていたんですが、思わず全部見てしまいました。

こっちはRibbonを引っ張ると綺麗に見える事をSkeletal MeshにRibbonを追加する事でEffectとして実現しています。

簡単に見ただけなので細かい点は間違っているかもしれませんが、

Eventを使用してSourceをSkeletal Meshの表面に発生させ、そこに別のEmitterでRibbonを繋げる事で、Ribbonを引っ張ると綺麗に見える事をEffectとして完璧に実装しています。

凄い。の一言です。

しかもこのEffect偶然かもしれませんが黒をしっかり使用していてEffectとしても大変綺麗です。

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

うーん。どうしよう。

2週間、UE5の実装を全くしていないので今週は実装をやりたいです。

後、Niagaraの勉強は筋トレみたいなImageでやっています。好きか嫌いかでやる種目を制限するのはあんまり良くない気がします。

Noise to Stylized Trail in UE5 Niagara Tutorial [8]の実装をやりますか。

3.1 Noise to Stylized Trail in UE5 Niagara Tutorial [8]を実装する

<Textureの作成>

先々週のBlogを見ると以下の様な記述がありました。

結論から言うと、ここで採用された方法は境界をSmudge(指でこすったようなEffect)で消してSeamlessにしているだけでした。

というか今まで勉強したTilingを消す方法は、どんな複雑なやつでも究極的な部分ではつなぎ目をぼやかして目立たなくしているだけでした。

これはなんか別なもっと高度な方法はないんでしょうか?

TutorialではPhotoshopで作成していますが、Photoshopは持っていないのでGIMPで作成してみます。

Tutorialでは以下に示した様な模様を作成しています。

まずこれにそっくりな模様を作成します。

以下の模様を作成しました。

やり方はFilter→Render→Noise→Cell Noiseでやりました。

Cell NoiseのParameterは以下の様に変更しました。

GIMPに詳しい人はもっとそっくりな模様を生成出来るかもしれませんが、これでも十分でしょう。

これで行きます。

今度はOffsetをApplyします。

Tutorialでは以下のようなImageになっています。

GIMPにも同様の機能があるはずです。

Bingで聞いてみます。

だそうです。試してみます。

以下の様になりました。

Smudgeをします。

GIMPのSmudgeは、何処にあるんでしょうか?

これだそうです。

結果です。

Tutorialでは更に2,3回追加でSmudgeしていましたが、私のはこれで充分なので終了します。

<Materialの作成>

作成したNoiseをUE5にImportします。

Materialを作成します。

Mainノードの設定を以下の様に変更します。

Materialを透明にするための設定ですね。

Emissive Colorに先程作成したTextureを追加します。

更にTexture SamplerノードにPannerノードを追加してTextureが動くようにします。

以下に示した様に右向きに移動しています。

しかしTutorialの以下のImageとは大分違います。

うーん。

何で?

Tutorialを見直したら理由が分かりました。

TexCoord[0]のUVの値が以下の様に変更されていました。

同じように変更します。

結果です。

Tutorialと同じ感じになりました。

以下の実装を使用して

以下のImageを作成します。

これで先程のTextureのImageのケツを消す訳です。

黒い方を残したいのですからMultiplyします。

結果です。

あれ?

Tutorialより全然良い感じのが出来ました。

これは名作の予感が!

Opacityを追加します。

単にTextureの結果をそのまま使用するだけだと色が薄いので掛けて色を濃くしました。

更に、色がついてないと良く分からないので色も追加しました。

結果です。

かなり良い感じがしますね。

今度は以下に示した様な線を追加するための実装を追加します。

この部分のやり方が今一理解していません。

最初に実装して、その後で理論を考える事にします。

まずは以下の実装で

以下のTextureを作成します。

これは分かります。

更に白黒逆転してPowerを掛けて

以下の様にします。

これも分かります。

次にTexCoord[0]のUの値を外して、代わりにTexture SampleノードのRの値をPassします。

すると以下のような結果になります。

あ、分かりました。

要は、Sample Codeのある特定の灰色の部分だけが白くなるようにしているんです。

Powerノードの代わりにStepノードを使用します。

結果です。

この結果を先程までの結果に追加します。

ここからのTutorialの調整方法は私のTextureでは同じ結果になりませんでした。

以下に示した様に

単純にStepノードのXの値を変化させたら以下のような白い輪が出来ました。

以下の実装でこの輪っかを前のImageと混合します。

結果です。

全然合ってないです。

一寸自己流で直します。

以下の様に差分を取る事にしました。

Stepノードの前にあったゴチャゴチャを全部外し、Stepで差分を取る事で最も白い部分のみを抽出します。

結果です。

これに前のImageを追加すると以下の様になります。

青い部分がもっと欲しいですね。

以下の様に実装を少しだけ変更しました。

結果です。

うーん。

この状態だとあんまり良くない感じがしますが、Animationで見るとかなり良い感じです。

以下にAnimationも示します。

白い部分に色を追加します。

Lerpノードを使用しています。

この追加方法だと黒も色として追加出来ます。

せっかくですので色は黒にしました。

更に線の太さや透明になる所なども微調整しました。

Niagaraの作成>

今度は今作成したMaterialを使用してNiagaraを実装します。

いつもの通りにFountain Templateを追加してNiagara Systemを作成します。

まずRender SectionにあるSprite Renderer Moduleを消してRibbon Renderer Moduleを追加します。

そのRibbon Renderer ModuleのMaterialに先程作成したMaterialをセットします。

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

あれ?

Preview画面からRibbonが消えてしまいました。

色々試したんですが、出て来ません。

うーん。

Level上に配置して確認します。

出来てました。

もう少し改良します。

Tutorialはこの後も少しだけ色々やっていますが、ここで完成とします。

ちなみにShader Complexityを確認したところ

真っ赤でした。

4.Materialの勉強

今週はBen Cloward先生のSubsurface Scattering - Advanced Materials - Episode 8 [9]を勉強します。

4.1 Subsurface Scattering - Advanced Materials - Episode 8 [9]を勉強する

まず軽く全部見ます。

見ました。

UEにある3つのSkinの作成方法について解説しています。

Sub Surfaceの設定についての勉強って感じでした。

以下に内容をまとめます。

<Subsurface Scatteringについて>

まずSkinの特徴であるSubsurface Scatteringについて解説しています。

これは私のように大学の専門が3D Graphicsだった人には常識なんですが、UEだけ弄っている人には知らない人もいるみたいですね。

以下に示した様に指に後ろから光を当てると肌の一部の部分がぼんやりと透けて見えます。

これは後ろから照らしている光が皮膚を貫いて、中で錯乱してその一部が指の外側から飛び出して来ているからです。

これをSub Surface Scatteringと呼びます。

以下にTutorialに載っていたIllustrationを示します。

通常の物質は光は全部反射して、その反射した光がDiffusive LightとSpecular Lightになりますが、皮膚の場合はその大部分が皮膚を透過して皮膚内部で錯乱します。

この現象があるため、一昔前のCGでは皮膚を作成するのが難しかった訳です。

<Pre-Integrated Method>

このMethodの特徴は計算Costが他の2つと比較すると安い事だそうです。

設定の仕方は簡単で、以下に示したShading ModelのPre-integrated Skinにセットするだけだそうです。

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

ここで新しいのがSub Surface Colorですね。

これが皮膚の内側の色を指定しているんでしょうね。

TutorialによるとこのPre Integrated SkinでSub Surface Scatteringの効果を発揮するためには、Opacityの値を0に指定する必要があるそうです。

このOpacityの値を変化させることで実際のObjectにどんな変化が現れるのかは実装する時に検証する事にします。

Sub Surface Colorですが、以下のように

何かの物体の影になった時に現れるそうです。

ああ。

これが皮膚の暗い部分が赤く見える理由なのか。

アニメとかの塗りを見ると陰の部分を赤っぽく塗っている時があります。

これ常識的に考えたら影の部分なんだから暗くならないといけないはずです。でも肌に関しては影の部分を赤っぽく塗っている方が絵が上手く見えます。

その理由がこれだったんです。

肌はSub Surface Scatteringがあるから、影の部分がより赤くなる事もある訳です。

うーん。

人間の本能的な直感は凄いですね。

<Sub Surface Method>

次のMethodは単にSub Surfaceと呼ばれているそうです。

設定方法は以下に示した様にMainノードのShading ModelをSub Surfaceにするだけです。

Materialそのものの実装方法は以下に示した様に

Pre-Integrated Methodと全く同じです。

Sub Surface ScatteringがPre-Integrated Methodより優れている点は以下に示した様なTransmitted Lightを表現できる事だそうです。

確かにこれは光が透けて見える感じですね。

これ自体は凄いですが、計算CostはPre-Integrated Methodと比較してどれくらい高くなっているんでしょうか?

実装する時にこれは検証します。

後、ぶっちゃけ、Transmitted ScatteringがないとRealに見えない時って無いですよね。特に人の皮膚で以下の写真のような

Transmitted ScatteringがないからRealに見えない。とは思わないですよね。

<Sub Surface Profile Method>

これが最もRealなSkinに見えるMethodだそうです。

設定方法はShading ModelをSubsurface Profileにセットするだけです。

Materialの実装は以下に示した様に

Sub Surface Colorは使用していません。

後、Opacityの値を1にセットする必要があるそうです。他の2つのMethodとは逆だそうです。

Sub Surface Profile Methodでは、皮膚の色をPost Processで計算しているそうです。

うーん。

凄い。

そしてその設定は以下のSub Surface Profileにセットされた

Assetによって決定されるそうです。

Tutorialで使用されているNew Subsurface ...は以下の設定を持っていました。

Sub Surface Profile Methodの特徴は以下に示した様に

Specular Lightははっきりしているのに、Diffusive LightはBlurが掛かって、その延長線上にTransmitted Lightも確認出来る事だそうです。

ああ。

これがSub Surface Profile Methodの特徴なのね。

これ今まで全く聞いた事のない解説ですが、これこそがSub Surface Profile Methodが優れている点みたいです。

公式のDocumentのShading Models [10]に

以下に示したSub Surface Profile Methodと通常のMethodで作成したSkinの違いを示した図が載っていますが

なんの解説も無いので、

Sub Surface Profile Methodが髭が薄くなってる位しか違いが分かりません。

それがRealなSkinを体現しているとは全く思えませんが、それ以外の違いが分からないので???って感じで見ていました。

先程の説明を聞いてもう一回この図を見ると

どこに注目すればSub Surface Profile Methodの特徴が発揮されているのかが分かります。

まず以下に示した鼻の下です。

通常のRenderingではTransmitted Lightが十分に計算されていないため鼻の下は暗くなっています。

Sub Surface Profile Methodの場合は

Transmitted Lightが考慮されるため鼻の下の部分も暗くなってはいません。

このようにSub Surface Profile MethodではDiffusive LightからのTransmitted Lightが十分に考慮されています。

更に言うとこのようにSub Surface Profile MethodではDiffusive LightからのTransmitted Lightが十分に考慮されているにも拘らず、その鼻の上にあるSpecular Lightはしっかり光っています。

つまりSpecular Lightは通常のRenderingと同じ様にしっかりと表示されている訳です。

はい。

理解しました。

Tutorialではこの後、Assetにある以下のParameterについて解説していました。

1だと1mに対応しているそうです。

ここはよく分からないです。Default値である0.1のままで使用する事にします。

4.2 Subsurface Scattering - Advanced Materials - Episode 8 [9]を実装する

それじゃ実装してみます。

<Pre-Integrated Method>

以下の様に実装しました。

結果です。

Normal Textureが適切なのが見つからなかったので外します。

うーん。これでも十分に肌の質感がありますね。

以下に示した通り近づくと陰の部分がほんのり赤くなっています。

Specular Lightが少し強すぎる気がします。

Roughnessの値を上げて調整します。

結果です。

これはドっから見ても肌です。

Sub Surface Colorをもっと赤くしてみます。

結果です。

うーん。

凄い良い感じです。

Shader Complexityは低いみたいですね。

<Sub Surface

Pre-Integrated MethodのMaterialをDuplicateして片方のShading ModelをSubsurfaceにしました。

右側がSub Surfaceです。

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

Transmitted Lightの影響ですが、正直そんなに差があるようには見えません。

TutorialでやっているようなDirectional Lightしかない暗黒空間で試してみました。

これだと全く違いますね。

でも実際のGameでこんな状況になる事ってあるんでしょうか?

せいぜい、洞窟の中とかを探索している位ですよね。

一応、Shader Complexityも調べておきます。

む。

こんなに低いの。Pre-Integrated Methodとほとんど変わらないですね。

これはこっちもありですね。

<Sub Surface Profile Method>

これSub Surface Profileにセット出来るAssetがDefaultでは用意されていませんでした。

これの作り方が分からないとテスト出来ないじゃん。

調べます。

公式のDocumentであるSubsurface Profile Shading Model [11]に

Subsurface Profileの作成方法がありました。

これは来週勉強する事にします。

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

5.戦闘システムの続きを作成する

先週、一週間休んだ時に知ったんですが、

効果音ラボ[12]という効果音だけを集めたSiteがありました。

ここから効果音をもう一回探す事にします。

全部の音を聞いたんですが、正直、今とそんなに変わらない感じがします。

今回は見送る事にします。

今週はゾンビ族の効果音を追加します。

5.1 ゾンビ族の効果音を追加

以下に示したゾンビ族の効果音を追加します。

<攻撃の効果音>

まずは攻撃の効果音です。

ゾンビ戦士の攻撃に効果音を追加します。

あ、思い出した。

ゾンビ戦士の攻撃力は妖精族と同じなので効果音は妖精族と同じものを使用するんでした。

これは簡単です。

すぐに追加します。

追加しました。

以下のMotionの時に音が欲しいですね。

テストして確認します。

W_OpponentSummonDecideから

Stage1に登場するMonsterを全部ゾンビ族にします。

結果です。

ゾンビが攻撃した時はDamage音が入るので、攻撃の効果音に武器の効果音を追加する必要はなさそうです。

次はゾンビ弓士のAnimationに効果音を追加します。

しました。

妖精族の炎攻撃の効果音を追加しました。

テストします。

音も効果も完璧でした。

今度はゾンビ魔人の攻撃に効果音を追加します。

ゾンビ魔人と名乗っていますがゾンビ剣士ですね。これは。

でも直すと別の箇所に色々問題がありそうなんで、このままにしておきます。

音を追加しました。

追加して気が付いたんですが、こっちが炎攻撃でした。

さっきの弓矢でも炎攻撃の効果音を使用してしまっています。

うーん。

でもこれ合ってんだよな。

両方、同じ音を使用する事にします。

テストします。

凄い良いですが、雷攻撃の音も試してみます。

合わないです。

元に戻します。

急用で病院に行く必要が出来ました。

今週の戦闘システムの作成はここで中止します。

6.Gaeaの勉強

6.1 GaeaのMaskとUEのLayer(Mask)は同じではない!

先々週のGaeaの勉強で判明したGaeaのMaskとUEのMaskの違いについてまとめます。

まず単純化するためにMaskに灰色は存在しない事にします。

白黒だけの場合です。

UEのMaskでは2つのMaskが重なる部分は後のMaskが100%上書きします。

まず、UEにおけるMaskです。

2023-03-06のBlogで詳しく検証していますが、以下に簡単にまとめ直します。

以下のLandscapeがあるとします。

このLandscapeに赤で下地をつけます。

次に以下のMaskを

Layerとして適用します。

このLayerには緑を適用します。

白い部分が緑になります。

更に以下のMaskを次のLayerとして適用します。

このLayerには青を適用します。

すると以下のような配色になります。

Layer1とLayer2が重なっている部分(お互いに白い部分)を見ると青くなっています。

つまり前のLayerに対して後のLayerが100%上書きされます。

これに対してGaeaのMaskの取り扱いは全く違います。

先々週のBlogでまとめていますが、もう一度以下に簡単にまとめます。

以下のLandscapeに

以下のMaskを追加し

Layerの色を赤に指定します。

更に以下のLayerを作成し

色を緑で指定します。

この2つのLayerをCombineノードを使って重ねると

以下の様になります。

2つのMaskが重なったところは黄色になっています。

つまりMaskが重なった部分は両方のMaskが混合されるようになるんです。

UEではこの場合、黄色の部分は全部緑色になります。

これがGaeaとUEにおけるMaskの機能の違いです。

6.2 GaeaのCombineノードの設定を弄ってUEと同じ設定にする事は出来ないのか?

これ、先々週のBlogでも試していたんですが、もう一回Challengeします。

Combineノードには以下のParameterがあります。

これのどれかを使用したら出来そうですね。

全部のMethodの条件を確認しましたが駄目でした。

以下に簡単にまとめます。

UEのLayerと同じになる実装は

Switch

条件1:(Layer1が黒 and Layer2 が黒)

結果:Layerは採用しない

条件2:((Layer1が白 and Layer2 が黒)

結果:Layer1を採用

条件3:(Layer1が黒 and Layer2 が白)

結果:Layer2を採用

条件4:(Layer1が白 and Layer2 が白)

結果:Layer2を採用

となっています。

これと同じ実装をGaeaのCombineノードを使用する事で作成出来たら良いはずです。

<Blend>

(Layer1x(1-Ratio))+(Layer2xRatio)を計算していると思われます。

計算の基本がLayer1+Layer2なのでLayer1を全部採用したりLayer2を全部採用したりする事を指定する事は出来ません。

これと同じように全部のMethodを確認したんですが結局は無理でした。

結局は先々週のBlogと同じ結論になりました。

6.3 RenderBucket氏のGaeaのTutorialを勉強する

先週、一週間お休みしたので色々と余裕が出来て、その時間で色々な事をした訳です。

その中にNiagara SystemにおけるFluid Simulationの勉強を復習したのもありました。

それで久しぶりにRenderBucket氏のTutorialを見たんですが、Niagara SystemにおけるFluid Simulation関連のTutorialは全く更新されてなかったです。

それでまあ、Niagara SystemにおけるFluid Simulationの勉強は今しても何の益もない事が確認出来たんですが、

何とRenderBucket氏、以下に示した通りのGaeaのTutorialを2つ載せていました。

休みの時に軽く全部、見たんですがまあ休みだったのであんまり記憶に残っては無いです。

そこで今週はこの2つのTutorialを見る事にします。

6.4 Environment Creation: Making Realistic Desert Rocks In Gaea [13]を勉強する

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

まずGaeaでTerrainを作成する所から始まっています。

特にGaeaについての解説はないですね。

何で他のTerrain作成Softではなく敢えてGaeaを使用すべきなのか?

とかGaeaのInstall方法とかの解説は全く無いですね。

いきなり最初にSlope Noiseノードを追加しました。

以下に示した様にSlop NoiseノードはPrimitive GroupのNodeなので

最初に選択すべきNodeの一つではあります。

あ、そうだ。

私が作成したGaeaにおけるTerrainの作成手順とRender Bucket氏の作成手順を比較しながら勉強する事にします。

2023-02-26のBlogに以下のまとめがありました。

現状、この後にTextureを作成してMaskを追加する工程が入りますが、それを抜きにすればまあ良くまとまっています。

これとRender Bucket氏のTerrainの制作方法を比較します。

最初の工程であるPrimitiveを追加する所は、まあ同じです。というかこの部分はGaeaを使用する以上、他の選択肢は存在しないので同じにならざる得ないです。

TutorialではSlop NoiseノードのParameterをかなり弄っています。

結果として以下に示した様に

最初からかなり良い感じのTerrainが完成しています。

次にCurveノードを追加しました。

私の手順表によると次の工程は

となっています。

お勧めのNodeにCurveは入っていません。

調べるとCurveノードはAdjustment GroupのNodeでした。

どんな機能なんでしょうか?

以下の解説が表示されました。

うーん。

何となく言いたい事は分かりますが。

以下の実装でテストしてみます。

Mountainノードの結果です。

これにCurveノードを追加すると

うーん。高さが変化するの?

Parameterを見ると

Terrainの高さに応じてある値を掛けているのは間違いないですね。

この辺から推測するとCurveノードの機能は、私が手順の2番目で推奨している「基礎の地形を大きく変形するためのNode」ではなく

その逆の「基礎の地形の変形を小さくするためのNode」ですね。

Tutorialでは以下の様に沢山のPointを追加して

Slopeの角度を自然な感じに調整しました。

はあ、成程。

私も真似て以下のようなParameterを作成してみました。

結果です。

すげえ!

Curveノードを使用するとこんなに変形出来るのか!

これが

これになります。

これだけTerrainを変形出来るとなると、

Curveノードは、私の手順の2番目で推奨している「基礎の地形を大きく変形するためのNode」に当たりますね。

うーん。勉強になります。

私が現状、この手順の2番目に使用するNodeは以下に示した

3つのNodeしかないんですが、これにCurveノードも追加する事にしました。

Tutorialの続きを見ます。

次にTerraceノードを追加しました。

私の手順書の三番目は以下の様になっています。

Terraceノードは以下に示した通り、Profile Groupに属するNodeで

その機能は文字通りTerraceを作成する事です。

Terraceを生成する事って山の縁を調整する事でもあるんですよね。広義の意味でとらえると。

となるとここも同じ事していますね。

私はこのTerraceの意味が分からなくて大変苦労しましたが、分かってしまえば簡単で日本語で言うところの段々畑の畑がないVersionの事です。

https://www.nationalgeographic.com/photo-of-the-day/photo/terraced-earth-india-pod

私のMountainの実装にもTerranceノードを追加してみます。

山の崖の部分に

以下に示した通り

見事なTerranceが形成されました。

今、唐突に疑問に思ったんですが段々畑の元のTerraceって自然に出来たんでしょうか?

もしそうならどうやって出来たんでしょうか?

凄い疑問です。

調べました。

凄い壮大な話でしたが分かりました。

簡単にまとめると以下のような話になります。

まず山の間の谷に川が流れています。

この川は当然土石も運んでくるので川底に土石が溜まるようになります。

すると山の間の川は以下のようになるそうです。

ここに気候変動が加わるそうです。

それによって海面が下がると以下のようになります。

はい。Terraceが生成されました。

これは沢山あるTerraceの生成方法の内の一つだそうです。

でもこうやってTerraceが生成できるのが理解出来ました。

Tutorialの勉強に戻ります。

Erosionを追加しました。

私がErosionを追加するのは最後から2番目ですが、

このTutorialではここで既に追加しています。

しかもTerraceノードと平行に追加しています。

当然、この2つをCombineノードで混合して

以下のTerrainを作成しました。

うーん。

成程ね。

これはErosionノードを使用していますが、その目的はTerrain表面にErosionを追加するためではなく、Terrain表面の砂や土の部分の作成のために使用しています。

これは私の手順の

に近いと言えます。

次にAlluviumノードを追加します。

Alluviumノードを追加する事で以下に示した様に

岩の上にうっすらと土が被ったような効果が追加されます。

Alluviumノードの機能については2023-02-13のBlogで詳細に調べていました。

Gaeaに限って説明するとTerrain全体に砂を振り替えたような効果を追加します。

次にErosionノードをもう一回追加します。

Tutorialの解説を聞くと今度のErosionは本当にErosionを追加するためのものの様です。

以下に示した様なErosionの痕が生成されていますから。

私の手順にある以下の部分は当然やってないですね。

まあ、この部分は私の手順のUniqueな部分なので他の人が同じような事をしている方が驚きます。

そしてその次の

をTutorialはやっていますね。

TutorialではここでTerrainの作成は終わりと言っています。

一端、ここでまとめます。

Environment Creation: Making Realistic Desert Rocks In Gaea [13]のTerrainの作成部分を勉強した感想>

使用しているNodeはかなり違いましたが、根本を流れるTerrainの設計の思想は、私が編み出した手順とほぼ同じでした。

やっぱりGaeaで自分で自由にTerrainを設計出来る人は、無意識的にか意識的にかは分かりませんが、私の考えたTerrainの作成手順と同じようなものを持っています。

後、Render Bucket氏はNodeのParameterの値をかなり弄ります。

Parameterも正しく弄るとTerrainの形状が凄く変わる事を知りました。

Nodeの整理が終わったら、今度はNodeのParameterの整理をしたいと思います。

<作成したTerrainに色を追加する>

この部分は要らないからSkipしようと思ったら結構面白い内容だったので以下にまとめる事にします。

Height Map(Erosionノード)にSatMapノードを直接追加します。

すると

こんな結果になります。

なんだこれは、って感じの色塗りです。

今度はSurfTexノードを間に挟みます。

すると以下の様になります。

うーん。

SurfTexノードってColorを追加するためのTextureを作成しているんだと思っていましたが違うんですね。

これ見るとColorをどのように追加するかの指定をするためのNodeみたいです。

次に以下のNodeを追加ました。

SoilノードFlowノードはおなじみのNodeですが、Rock Mapノードは初めて見ました。

調べたらなんとData Groupに属していました。

あれ?

そりゅあ、MaskのためのNodeなんだからその通りかもしれませんが、今まで勉強した記憶が無いんですが?

ちなみにRock Mapノードは以下のようなMaskを作成します。

うーん。

これはかなり圧巻です。

何でこんな有用なNodeに気が付かなかったんでしょう?

確認します。

2023-03-27のBlogで勉強していました。

何だこの結果は?

全然、今回の結果と違いますね。Rockが無い所で使用するとこんな結果になるのかもしれませんね。

更にRock MapノードとFlowノードをCombineノードで混合します。

すると以下のような結果になります。

これはかなり綺麗なMaskです。

今度はそれぞれのMaskの結果にSatMapノードを追加して

更にその結果をCombineノードで混合します。

結果です。

確かにGaea内での見た目はかなり良いですが、これをUEで使用する時はどうなんでしょうか?

何とここで爆弾発言です。

この結果をExportします。と言ってUEにExportするのかと思ったら

などにと言っています。

え?

こんな高価なSoftは使用出来ないよ。

ここは聞かなかったことにして先に進みましょう。

<Exporting a Height Map and Masks>

ExportするNodeに印をつけていきます。

当然、Height Map用です。

このNodeは色を塗った最終状態を示しています。

これらはLayer用のMaskに使用するんでしょうね。

この辺はKlaus氏やAndrea Cantelli氏のやり方と同じです。

Height MapノードにMesherノードを追加して、

Meshの数や形を調整する事が出来るそうです。

これは初めて知りました。

更にNormal Mapノードも使用出来るそうです。

これからBuildの設定について解説するのかと思ったらここで終わりだそうです。

次のTutorialでは、以下に示した様な

Gaeaで形成された極端に引き延ばされたTerrainの一部をBlenderを使用して直す方法を解説するそうです。

ここでこのTutorialは終わりです。

もうGaeaを勉強する時間は無いです。

ここで今週のGaeaの勉強は終わりにします。

来週、続きのTutorialを勉強します。

7.ProceduralなEnvironmentの作成方法について

これを先々週勉強してたんですが、とてもやる時間は無いです。

更にこれをやりたい気力も無いです。

ProceduralなEnvironmentの作成方法の勉強は中止する事にします。

8.Houdiniの勉強

今週は「11. Transform Objects and Geometry」を勉強します。

とうとうFOUNDATIONS | OVERVIEW [1]の最後のTutorialです。

先々週、「10.Tool Workflow」の途中で終わったと思っていたら全部やっていました。ので今週は「11. Transform Objects and Geometry」の勉強になります。

8.1 「11. Transform Objects and Geometry」を勉強する

まず軽く全部見ます。

Objectの移動や操作について解説しています。

パッと見た感じではほとんどの操作は一回は習った事がある感じでした。

以下にこのTutorialの内容をまとめます。

<Rubber Toy>

最初は以下の軸を使用して

Rubber Toyの位置を移動させています。

この軸は左端の以下のIconを選択する事で表示されます。

この移動は矢印の方向のみが可能です。

以下に示した四角を選択した場合、

地面に沿って移動する事が可能だそうです。

右上のIconから

Viewを4つに分割して

以下の箇所から

Link Ortho ViewsをEnableします。

これをする事でorthogonalな画面の内の一つを編集するだけで他のOrthogonalな画面も同時に編集されるようになります。

ここからのTutorialの説明が意味不明です。

以下になるだけ忠実にTutorialの内容を再現します。

まずRubber Toyに表示されている四角を選択してRubber Toyを移動させます。

これがCamera Plane上の移動になると言っています。

???
です。

でそれを直すために以下のIconをEnableします。

すると以下に示したようなConstruction Planeが現れて

Construction Planeに沿った移動が出来るようになるそうです。

はい。

Camera Planeでどの平面を指しているんでしょうか?
謎です。

Shift Keyを押す事でRubber ToyをConstruction Planeから上下に移動させる事が可能だそうです。

Rotationも試しています。

結果です。

Rotationに関しては特に何も注意すべき点は無いみたいです。

Scalingです。

これも通常の操作をしているだけでした。

Default値に戻す方法です。

Parameter Paneの値を選択して右Clickで以下のBoxを表示させ

Revert to Defaultsを選択します。

これで値がDefault値に戻るそうです。

Tutorialではよく見ると値ではなくTranslateの文字の部分を選択しているように見えます。

この辺は実際に試すときに確認します。

次はPose Toolです。

これはAnimationの作成に使用するそうです。

Handle Toolです。

Translation、Rotation、そしてScalingの操作の全部が行えるそうです。

あんまり重要じゃないですが、左上に選択しているToolの名前が表示されているのに気が付いたんですが、このToolの名前はGeometryとなっていました。

本当はこのToolの名前はGeometryと言うのかもしれません。

Pose Toolに戻ります。

Y Keyを押す事でTranslation、Rotation、そしてScalingの操作をTumbleする事が出来ると言っています。

ここではTumbleは切り替えると言う意味で使用していると思われます。

これも実際に試すときに確認する事にします。

因みにHandle Toolを選択している時も、Y Keyで切り替えが出来るそうです。

で、この後にHot Keyを押して移動させるのとは同じ移動でも結果が違います。と解説していますがHot Keyが具体的に何をしているのか不明です。

今度はAnimationを追加します。

まずRubber Toyの位置を下げます。

Kを押してKey Frameを追加します。

この説明がかなり曖昧で、Kを押す前にどのTime Frameを選択するのかを指定する必要があると思うんですがその辺は全く説明していません。

Tutorialをコマ送りで見るとKey Frameが1の時と240の時にKを押しています。

Key Frameが1の時はRubber Toyが以下の位置でKを押して

Key Frameが240の時はRubber Toyが以下の位置でKを押しています。

更に回転を追加した状態でもKを押しました。

Motion PathをEnableします。

すると

以下に示した赤いLineが表示されます。

この線は掴んで移動する事が可能です。

Show Tangentを追加する事で

傾きを調整する事も可能です。

更にRibbon Modeを追加する事で

以下に示したようなRibbonで表示する事も可能になります。

因みにRibbon表示では以下に示した様にObjectの角度を直感的に調整する事が可能です。

ここでRubber Toyでの説明が終わっています。

<Squab>

今度はSquabを使用して解説します。

まずPivot Pointについてです。

Move Toolを選択すると

以下に示した様にSquabの座標の中心が表示されます。

これを中心にしてSquabは回転します。

これがPivot Pointです。

右Clickして以下のBoxを表示させ

Pivot ModeをEnableします。

何と、Pivot ModeがEnableになっていると

Pivot Pointを自由に移動する事が可能になります。

Pivot ModeをOffにして回転させると以下に示した様に

新しく設定したPivot Pointを軸にして回転するようになりました。

今度はGeometry Levelです。

3つのPointsを選択します。

この状態でAttach to GeometryをOffにします。

そして以下のIconを選択します。

この状態で先程選択した3つのPointの一つを選択します。

また右Clickで以下のBoxを開き

Attach to GeometryをOnにします。

すると以下に示した様に

先程選択したPointが中心になって回転する事になります。

Squabを使用した説明はこれだけで、これだけだったら別にこのObjectを敢えて使用する必要ないと思いました。

<Pig Head>

Pig Headです。

これReal過ぎて一寸怖いんですが、最後のObjectはこれを使用して解説しています。

まずVを押して以下のRadial Menuを開きます。

Shadingを選択し以下のRadial Menuを開きます。

Smooth Wire Shadedを選択します。

Pig HeadのWireが表示されました。

この状態でGeometry Modeに入って

Pointが選択出来るようにし、

Pointを選択します。

ここでTを押して

Translates Handleにします。

ここ、一体何を説明しているのかと思ったら

単に以下に示したIconがRotationからTranslateに変更されただけでした。

この状態で上に引っ張ると以下のようになります。

この状態でSoft Radiusを選択すると

以下に示した様に

Pig Headにタンコブが出来たみたくなります。

Scene Paneの左上のIconには以下の種類があります。

まずSecure SelectionをOffにして

Pigheadの耳の端を選択します。

以下の様に耳の形を変形します。

この状態でSoft Edit Radiusを大きくすると

耳の形が以下の様になります。

今度はSlidingを選択します。

更に3を押してEdgeが選択出来るようにします。

以下のEdgeを選択します。

この状態でSoft Edit Radiusを最小にします。

ここまで来たらSlide ModeをEdgeに変換します。

前まではSurfaceが選択されていました。

何とこれで選択しているEdgeを移動出来るようになりました。

次のIconです。

このIconはPeakと呼ぶそうです。

以下のPointを選択します。

更に反対側のPointを取って

拡張するとそれぞれのNormal Vectorに沿って拡張します。

Soft Edit Radiusを調節します。

結果です。

このようにOrganicなObjectを作成する時に効果を発揮します。

次のIconです。

このIconの名前はScruplingだそうです。

正し現況では選択した一つのPointしか影響を当たる事しか出来ません。

まずNを押して

全部のPointが選択された状態にします。

いや突然、Parameterの話されても?

と思いましたが、仕方ないです。

調べます。

以下のEdit1ノードのParameterの様です。

これでScruplingが出来るようになりました。

又、右Clickして以下のBoxを表示して

Smooth Pointを選択します。

今度はPointをSmoothに整頓する機能になりました。

この辺はUEのLandscapeの機能と同じです。

今度は4を押してFaceが選択出来るようにします。

以下のFaceを選択しました。

以下の様に選択したFacesを移動して

Soft Edit Radiusを選択しようとすると

出来ません。

これはSoft Edit RadiusはPointに対してのみ有効だからです。

今度はEdit1ノードを選択した状態で、

TABキーを押して以下のBoxを表示してSoft Transformを選択します。

以下に示した様にSoft Transform1ノードが追加されます。

このSoft TransformノードでもEditノードと同じような調整をしているんですが、TutorialによるとこのSoft Transfromノードの方がよりProceduralだそうです。

どの辺の特徴を見て言っているのか不明です。

単なるTransformノードもあります。

このNodeにはSoft Edit Radiusが無いみたいです。

厳密に選択したPointだけ移動したい時に使用するみたいです。

以上でした。

もう一寸弄りたかったですが時間が無くなってしまいました。

実際に自分で試して見るのは来週やる事にします。

9.Volumetric Cloudの勉強

今週はUnreal Engine For Fortniteの勉強をします。

YouTubeで動画を作成するに当たってUEFNの使用方法についての方が良い気がしています。

取りあえず既に作成したVolumetric Cloudの動画は公開して次の動画からはUEFNの使用方法についての動画にしようと思います。

9.1 先週の推測の復習など

先週から大分情報が入りまして、以下のFortnite何とかの全容が大体理解出来ました。

まあ、先々週の推測で大体合っていたんですが、以下に更に新しい情報を追加で記録しておきます。

Fortniteで稼いだお金の40%を変換すると言うのは、これらのCreatorに+して例えばYouTubeとかでFortniteの実況している人とかも含まれているみたいです。

知らなかったんですがYouTubeでFortniteの実況をすると、YouTubeからお金が貰えるだけでなくEpic Game社からもお金が貰えるSystemになっているそうです。

よく分からない事も依然と沢山あります。

以下にまとめます。

  • 地形以外の作成も出来るのかとか
  • Verseの言語は何処で勉強すればいいのか?
  • FortniteのAccountを作らないとUEFNの使用は出来ないの?

正直、今更Fortniteを始める気は起きません。

Game下手ですし、小学生に負けるのは確実ですから。

何とかGameをしないで中身だけ理解したいですね。

Unreal Senseiが別アカでUEFNのTutorialを出していました。

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

9.2 UEFNを始めるに当たって気を付ける事

まだ中身がどうなっているのか知らないので懸念かもしれませんが、どうやら知らない人と共同でLandscapeを作成出来るみたいなんです。

これって誰でも自由に参加出来るって事でしょうか?

このChat、年齢制限付いているんでしょうか?

今、アメリカは武器なき内乱状態という感じで、共和党民主党がどんでもないレベルで争っています。

先週起きたトランプ元大統領の逮捕もそうですし、今週のTennessee州の民主党議員の除名もそうです。

更にこの後には、Fox Newsに対してのDeformationに対する判決も待っていますし、Florida州の知事とDisneyとの喧嘩もまだまだ続きがありそうです。

この中で、Fox Newsを代表とする共和党保守派の支持基盤である宗教右派が最も得意とする攻撃が「お前はPedophile(児童愛好家)だ。」とレッテルを張ってネットで騒ぎまくって事実無根でもそういう雰囲気を作りあげる事なんです。

今だって、Biden大統領が虐められてる子供を励ましてる動画を見つけて「こいつはPedoだ!」と総攻撃しています。

そういえばYouTuber兼Illustratorである、さいとうなおき氏のYouTube Channelが一発Banされていましたが、私はその攻撃の余波を受けた可能性もあると思っています。

まあ、そういう訳で、特に今は、勝手に18歳以下の人とChatで繋がったりする事はまあ凄く避ける必要がある訳です。

これ日本では凄く軽く考えられているんですが、アメリカだと高校で同級生同士が付き合っていて、片方だけ先に18歳になったような場合でも、逮捕されたりする場合もあるそうですから、まあ凄く気にした方が良い話なんです。

私はYouTubeをやるのはこういう話をする目的もあります。

まあ2つChannelを作成してMainはUEについて、Sub Channelはこういう日本人が知らない時事ネタを解説して日本人を啓蒙するのも良いと思っています。

9.3  Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course! [14]を勉強する

Unreal SenseiじゃなくてFortnite Senseiになっていますね。ここではFortnite Senseiと呼ぶ事にします。

既に一回軽く見ているので以下に内容をまとめる事にします。

<Intro>

このTutorialでは以下のIslandを作成するそうです。

やっぱりUEFNは島を作成する機能しかないんでしょうか?

この辺もおいおい分かってくるようになるでしょう。

<Creating a Project>

Projectの作成方法についてです。

LibraryからUnreal Editor for Fortniteを開きます。

以下に示した様なProject Browserが開きます。

この中から以下のTemplateを開きます。

この辺は普通のUnreal Engine Editorと同じですね。

次にProject名を指定してCreateを押しています。

ここもUnreal Engineと同じです。

すると以下のようなLandscapeを最初から持っているProjectが開きます。

凄い。

<Navigation>

UEFNの操作方法について解説しています。

UEは慣れ過ぎてどんなButtonを押して操作しているのか覚えていません。

多分、同じでしょう。

一応、全部聞きましたが多分UEと同じなので記録には残しません。

<Moving Objects>

以下のMail Boxを使用してObjectの移動方法を勉強するみたいです。

UEFNでもこれらのObjectをActorと呼ぶんでしょうか?

これ知りたいですね。

画面右上にある以下のIconを使ってObjectを動かしています。

こんな基本的な事、教えて動画に出来るのか。

と逆な意味で驚きですが、初心者からしたらこんなに親切に解説してくれる動画は他にないから、とても有用なTutorialになる訳です。

この辺の生徒の感覚と知識を正確に把握出来るかどうかが良いTutorialを作成出来るのかどうかの境目になりそうです。

移動したのが嫌で元に戻したい時はCtrl+Zを押せとか教えています。

やっぱりUnreal Sensei、今はFortnite Senseiは天才です。

こんなのPCを触っている人間からしたら常識過ぎて語る気しませんが、知らない人だって沢山いる訳です。

その人達だって移動したObjectを最初の状態に戻したいと思う時があるはずで、それに対して満点の解答を教えているんです。

私だって始めてCtrl+Zを知った時は、こんな便利な機能があるのかと衝撃を受けてしばらく感動していました。

<Content Drawer>

Content DrawerからObjectをLevel上に追加する方法を説明しています。

次にFortniteに元々あるAssetを追加する方法を説明しています。

うーん。

以下の設定でFortniteのAssetだけを表示する事が可能だそうです。

<Fab Library>

今度はFab Libraryについての説明です。

Fab Libraryってそういえば聞いたことがあるな。

と思ったらUEにおけるMega Scanと同じですね。

どんなAssetがここからDownload出来るんでしょうか?

Tutorial見てるとそのままDrag and Dropしています。

成程。便利ですね。

<Viewport controls>

G Keyを押すと

のが消える事を解説しています。

これ私が知ったのかなり最近です。

初心者の内にこういう事を教われるとかなり違いますね。

User Interface

OutlinerとかDetailの説明とかしていました。

LayoutをDefaultで使用する人には特に必要ない事を説明していました。

ので内容をまとめるのはSkipします。

<Landscape Scripting>

Landscape Modeについて解説しています。

まあ、UEとほぼ同じです。

ScriptingやPaintの方法について説明しています。

Layerに以下のMaterialがセットされていますが、これらの実装も見る事が出来るんでしょうか?

凄い興味深いです。

<Play Your Game>

こっからが重要です。

作成したGameをPlayする方法です。

まず以下に示したLaunch Sessionを押します。

すると以下の画面になるそうです。

ここでStart Gameを押す必要があるのかそれともそのまま待ってるだけ良いのかが分かりません。

まあやってみたら分かるでしょう。

ここでFortniteに入っています。

という事は、やっぱりFortniteのAccountがないと出来ないって事でしょうか?

Player Spawnerについての説明をしていますが、これよく分かりません。

ESC Keyを押すと以下に示した様なMenuが表示されるそうです。

うーん。

やっぱりFortnite一回はPlayしておく必要があります。

この辺の説明、全く実感が湧きません。

異次元の話でも聞いているみたいです。

この状態でUEFNに戻るには以下の様にCursorを端に合わせてGame画面を小さくすると

奥からUEFNが現れるそうです。

Fortniteを開いたまま、UEFNでLevelの調整をしています。

Live Editingと言うやつです。

これは凄いです。

Playerの数を変更しています。

この辺の設定はよく分からないです。

後で勉強する事にします。

途中ですがもうUEFNを勉強する時間が無くなってしまいました。

残りはまた来週やる事にします。

10.DirectXの勉強

10.1  C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [2]のLinking Our Projectを勉強する

まず軽く全部見ます。

見ました。

見てたら思い出しました。

Olympus Game Engine Project内のFileであるIApplicationをBlank ProjectのFileであるApplicationの親として継承させる必要があるんです。

そのやり方をここで学習します。

で、軽く全部見た限りでは何をやっているのかよく分かりませんでした。

と言うか何でそんな方法で別なProjectのFileを親として継承出来るのかがよく分からないし、Tutorialの途中でErrorが発生するんですが、何でそんな直し方をしたらErrorが消えるのかもわかりませんでした。

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

その後で、それぞれの手順が何をしているのかを検証します。

まずDllをImportやExportするCommandを追加します。

それがこれだそうです。

これでOlympus Engine ProjectのIApplication ClassがDllとしてExport出来るようになったんでしょうか?

次に行きます。

今度はImportとExportの関係が複雑で混乱するので以下の方法で整理するそうです。

Olympus.hを開きます。

以下の実装を追加します。

これって単なるMacroですよね。

あ、分かったDllをBuildする時はExportになって、そうじゃない場合はImportになるんです。

うーん。

でもOlympus Engine Projectって常にDllでBuildするような設定になってなかったでしたっけ。

ここでDll以外でBuildするCaseを考える必要があるんでしょうか?

今は検証する時ではないので先に進みます。

次の工程です。

IApplication.hで先程追加したDllをExportするCommandをOLYMPUS_APIに変更します。

はい。

これは当然ですね。

ここは理解出来ます。

この次の工程から訳分からなくなってきます。

まずOlympus Engine ProjectのPropertiesを開きます。

C/C++のPreprocessorを選択します。

更にConfigurationの設定をDebugにします。

そしてPreprocessor DefinitionsにBUILD_DLL;を追加します。

Releaseの場合も同じ設定にします。

ここは何しているのか全く不明です。

後で調べます。

今度はOlympus.hです。

ここでは単にこれで以下のMacroが実行されるようになった。と説明しているだけでした。

あ。

分かった。

先程Propertiesで追加したBUILD_DLLがこれに当たるです。

だからDebugでBuildしてもReleaseでBuildしてもBUILD_DLLになるので、Olympus.hの設定はOLYMPUS_API が declspec(dllexport)になる訳です。

うーん。

でも全部の場合でOlympus Engine ProjectはDLLとしてBuildするんだから、declspec(dllexport)で指定すれば良いだけな気がします。

これでOlympus Engine Project側の設定は終わりだそうです。

今度はこのOlympus Engine Project内でBuildされたIApplication Fileを親としてBlank Project内のApplication Classに継承させるための実装をBlank Project内から行います。

まずApplication Classを開き、普通のClassを使用する時の様に#includeでIApplication.hを呼び出します。

更にApplicationのConstructorにIApplication Interfaceを継承するような宣言を追加します。

当然Errorで表示されます。

このErrorを直すためにBlank ProjectのPropertiesを開いてC/C++のGeneralを選択し

Additional Include Directoriesに

Olympus Engine ProjectのSource Folderを追加します。

え。

そんな事出来るの?

かなり驚きですが、まあここは納得出来ます。

次の手順です。何が目的でやっているのか全く理解出来ないのは。

何と、この後にBlank ProjectのSource Folderも追加しています。

いや、これってなんで追加する必要あんの?

無くてもOlympus Engine ProjectのIApplicationは参照出来るでしょう。

ああ、Tutorialの説明聞いたら分かりました。

このBlank ProjectのSource Folderの追加は別なProjectのFileを読み込む事とは全く関係なかったです。

2023-03-20のBlogでまとめられていますが、IApplication.cppでOlympus.hをInclude出来なかったんですが、

この原因は

これをIncludeするために2023-03-20のBlogでは色々な工夫をしていますが、

ここでBlank ProjectのSource Folderを追加しておくと、こういう工夫をしなくてもIncludeする事が出来るようになるそうです。

ので次いでに、Blank ProjectのSource Folderを追加してるだけです。

やっと理解出来た。

当然ですが、これらの設定はAll Configurationsで行います。

Application Classに戻ります。

あれ、Errorが直っていません。

それはどのDirectoryを参照すればいいのかを指定していないからだそうです。

以下の様にDirectoryを追加すると

#includeのErrorが消えました。

でもPublic IApplicationの方のErrorはそのままです。

このErrorを消すにはBlank ProjectのReferencesにある事を追加する必要があるそうです。

もうReferencesの使い方なんて覚えていません。

ReferencesをClickして以下のBoxを表示し

Add Referencesを選択します。

すると以下のBoxは表示されるので

OlympusにCheckを入れて

OKを押します。

これでReferencesの調整は終わりでした。

え、そうなの?

次にBlank ProjectのPch.hを開き

以下のCodeを追加します。

と思ったら、以下の様に書き換えてしまいました。

???

Tutorialの説明聞いたら判明しました。最初からOlympus.hを指定する予定だったんですが、間違えてApplication.hを追加してしまっただけでした。

これでApplication.hに戻るとIApplicationのErrorが消えています。

これで終わりです。

本当はこの後で、それぞれの手順について何が目的で何をしているのかを検証する予定だったんですが、時間が無くなってしまったのでそれは来週やる事にします。

10.2 「DirectX 12の魔導書」の先々週の勉強を復習する

先々週は、Command Queueを実装した所で終わっていました。

教科書では「3.3.3 コマンドキュー」の所です。

このCommand Queueの機能を完全に忘れてしまっています。

復習します。

2023-02-19のBlogに簡単なCommand Queueのまとめが有りました。それを読み直したら完全に思い出しました。

簡単に説明すると

これです。

これを実装したんでした。

となると今週はその次の「3.3.4 Swap Chain」を勉強する事になりますね。

Swap Chainも色々勉強したはずです。

これも復習しておきます。

全然、覚えていませんが「Direct3D 12 ゲームグラフィック実践ガイド」の勉強ではSwap Chainをそれなりに勉強していたみたいです。

Direct3D 12 ゲームグラフィック実践ガイド」の勉強でSwap Chainをやるためには以下の事を勉強する必要がある。

と書いてありました。

これは大変です。

Swap Chainそのものが何であるのかについても過去のBlogを読んでいる内に思い出しました。

PCのMonitorを表示するのに、大抵はDouble Bufferingを採用しています。

このDouble Bufferingを行うのにSwap Chainが必要だったんです。

後、Swap Chain()関数はどんなVideo Cardが使用出来るのかを調べるにも使用出来る事が書かれていました。

Swap Chain()関数に関してはこれくらいの勉強を既にしていました。

10.3 「DirectX 12の魔導書」の「3.3.4 Swap Chain」を勉強する

それではまず教科書を読んでみます。

<Double Buffering>

Double Buffering、まだ勘違いしていました。

2023-03-13のBlogのDouble BufferingのまとめがDouble Bufferingの今までの私の理解を表しています。

ただこの理解もあんまり納得はしていなくて

以下の疑問を書き残しています。

今度こそ完全に理解しました。

まず、Double Bufferingをしないで直接画面に画像を作成すると絵画途中の画像が表示されるわけです。

こんな感じで。

(「DirectX 12の魔導書」だけは何故か本物の本で買ってしまったせいで、本に載っている分かり易い絵を引用出来ません。ので代わりに私が描いた絵で説明します。)

これが画面のチラつきの原因になるそうです。

そのちらつきを無くすためには、以下のような完成した絵を最初から表示する必要があるそうです。

じゃ、どうするのかと言うと、裏に表示しない画面を作成して

そこで画像を読み込みます。

読み込んで画像が完成したら表の画像と差し替えるんです。

これがDouble Bufferingでした。

これなら画像を処理ために画板?は2枚あれば十分です。

画板Aを表示している間に、画板Bに画像を書き込みます。画板Bに画像の書き込みが終わったすぐに画板Aと交換して画板Bを表示します。そしてすぐに画板Aに新たな画像の書き込みを開始します。

はい。

これなら送られてくる画像のDataを途中で止める必要もありません。ので遅延も防ぐ事になります。

やっと納得しました。

<Swap Chainの概要>

成程。Double Bufferingの意味が本当に理解出来たらSwap Chainの機能も簡単に理解出来ました。

前の説明で画板Aとか画板Bとか言っているのは画像表示用のMemoryの事です。

このMemoryを確保して、切り替え時に画像の参照先を変更するんです。

成程。

こんな事を毎回していたのね。

それで教科書はこの後に実装についての解説をしているんですが、それを勉強する時間は無くなってしまいました。

今週はここまでにして「3.3.4 Swap Chain」のSwap Chainの実装部分は来週勉強する事にします。

10.4 HLSLシェーダーの魔導書を勉強する

これも先々週まで何を勉強していたのか覚えていません。

復習から始めます。

<先週の復習>

まず教科書の「3.1.6 メモリー転送」の「定数Buffer」を勉強しています。

そこで、定数Bufferでは大きく分けると以下の2つを行っているとまとめています。

更に細かくまとめていますがその部分はここには記載しません。

そして実際の実装をSample Codeで確認したところ、

何とこれしか書かれていませんでした。

それでよくSample Codeを読み込んだら、このConstant BufferがSample Code内で作成されたClassである事が判明しました。

Sample CodeにあるConstant Buffer Classを読んで、実際に教科書の「3.1.6 メモリー転送」の「定数Buffer」で説明している事をやっているのかを確認しようとしたところで時間が無くなってしまいました。

はい。

では今週やる事は、Constant Buffer Classを読んで実際に教科書の「3.1.6 メモリー転送」の「定数Buffer」で説明している事をやっているのかの確認ですね。

<「3.1.6 メモリー転送」の「定数Buffer」で説明している内容の確認>

となると「3.1.6 メモリー転送」の「定数Buffer」で説明している内容をしっかり理解しておく事が大切になります。

先週のまとめには、

Constant Bufferの生成では

を行い、

World Matrix、Camera Matrix、そしてProjection Matrixのそれぞれを持つStructの作成では

を行っていると書いてあります。

<Constant Buffer Classを読む>

以下の方法で定数Bufferが作成されているのでInit()関数の実装から見ていきます。

以下に実装を示します。

うん。

やってないですね。

あれ?

一寸、教科書をもう一回読み直します。

うーん。

これが何処から出てきたのかよく分からないです。

「3.1.6 メモリー転送」の「定数Buffer」の説明を読むと

  • Graphic Card上に転送先のMemoryを作成
  • CPU上でWorld行列、Camera行列、そして透視変換行列を計算する
  • 計算した値を作成したMemoryにCopy

の3つしか行っていません。

要は、GPUに行列のDataを渡す必要があるんです。CPU上のMemoryにある行列のDataはGPUからAccessする事は出来ません。のでそのために定数BufferをGPUのMemory上に作成してそこにCPU上にある行列のDataをCopyする。

それをここで行っているだけです。

先週のBlogを読み直したら以下の文が書かれていました。

これが間違っているんです。

教科書の「3.1.6 メモリー転送」の「定数Buffer」にはConstant Bufferを使用してCPUからGPUに行列のDataを転送する方法が書かれています。

決してSample CodeにあるConstant Buffer Classの仕様が書かれている訳ではありません。

その上で

これが何処から出て来たのかが全く分からないです。

うーん。

まあ良いです。

次のDescriptor Heapを読む事にします。

<Descriptor Heap>

定数Bufferは作成しただけではGPUで使用する事は出来ないそうです。使用する前に適切な設定を行う必要があるそうです。

これは定数Bufferだけではなく、Vertex BufferやTextureなどの他のBufferも同じだそうです。

その設定を行うのがDescriptor Herpだそうです。

はい。

そして以下の図が出て来ました。

あ、そういう事か。

この後の疑似CodeでDescriptor Heapの仕様方法が説明されています。

が定数Bufferだけがセットされていて、更にどんな使用する前に適切な設定を施しているのかも不明です。

まあ、そうは言っても定数Bufferが何をしているのかと、それを運ぶDescriptor Heapが何をしているのかは理解出来ました。

はい。

10.5「Direct3D 12 ゲームグラフィック実践ガイド」の勉強

<先週までの復習>

先々週のBlogを読むと以下の流れで勉強していたのが判明しました。

1. 教科書の「3.3 Swap Chainの生成」を軽く読んだ。

2. 以下の内容が書かれていた。

3. 内容が多すぎるので以下の様に分けて勉強する事にした。

4. 最初の「DXGI_SWAP_CHAIN_DESC構造体について」を勉強したが以下の様に何を言っているのか全然理解出来なかった。

で、何で理解出来ないのかその理由について前提条件というかあらすじか書かれていないからだ。と結論付けています。

その後で、円周率の3.14の後の4桁を覚えている人はあんまりいませんが、朝鮮出兵の年号である1592と同じで、以後国(1592)最悪朝鮮出兵と覚えておくと忘れないと、あらすじで覚える事が優位である例を挙げていました。

はい。

大体の流れを理解しました。

<Double Bufferingの復習>

今週は、「DirectX 12の魔導書」の「3.3.4 Swap Chain」でDouble Bufferingの機能を本当の意味でやっと理解する事が出来ました。

で、「Direct3D 12 ゲームグラフィック実践ガイド」におけるDouble Bufferingの説明をもう一回読み直してみます。

「2.3.3 Swap Chainの生成」にDouble Bufferingについて書かれていました。

うーん。

理解した今となってはこの説明でも言いたい事は理解出来ます。後別に間違った事も書いてないです。

でも分かりにくい。

まずMonitorのRefresh RateはDouble Bufferingの根本とは何の関係もないです。

次に例えの例で出している三分クッキングの話もDouble Bufferingの例えとしてはあんまり良くない気がします。

Double Bufferingの話で、最も重要なのは以下の図のような画像がまだ完成していない状態を

Monitorに表示してしまうと、画像がチラついて見えると言う事実なんです。

これを知らないとなんで画像が完成するまで、裏でDataを受け取っているのかが理解出来ません。

この部分の説明がほとんどないので、分かりにくいのかもしれません。

とは言え間違った事が書かれている訳ではないですし、以下の図なんかは非常に正解にDouble Bufferingの挙動を表しています。

Pocol. Direct3D12 ゲームグラフィックス実践ガイド (p.151). 株式会社技術評論社. Kindle 版.

<あらすじの話をもう一回まとめる>

もう時間が無くなってしまったのでここで終わりにします。

今週は、DirectX 12の勉強は復習しか出来ませんでしたが、そういう時もあるでしょう。焦らずゆっくりとやって行きます。

11. まとめと感想

今週は病院に行く用事が出来たので、一寸だけ短いです。

まあ仕方ないです。

12. 参照(Reference)

[1] CGHOW. (2023b, March 10). Noise to Stylized Trail in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=e5c5rhtgaik

[2] Gpu crash/d3d device removed error? (2022, April 5). Epic Developer Community Forums. https://forums.unrealengine.com/t/gpu-crash-d3d-device-removed-error/514360

[3] JSFILMZ. (2022, April 13). UE5 GPU Crashed or D3D Device Removed Fix [Video]. YouTube. https://www.youtube.com/watch?v=Vejhv9QmNGM

[4] Redirecting. (n.d.). https://answers.microsoft.com/en-us/xbox/forum/all/keep-getting-error-gpu-crashed-or-d3d-device/142ab26a-6402-4ac7-a32f-f8cc99d48eb6

[5] How to Fix a GPU Driver Crash. (n.d.). https://docs.unrealengine.com/5.0/en-US/how-to-fix-a-gpu-driver-crash-when-using-unreal-engine/

[6] L. (2023a, February 23). Timeout detection and recovery (TDR) - Windows drivers. Microsoft Learn. https://learn.microsoft.com/en-us/windows-hardware/drivers/display/timeout-detection-and-recovery

[7] NumenBrothers. (2022b, December 25). Improve GPU Performance in Unreal Engine 5 by Allocating Maximum VRAM for Texture Streaming [Video]. YouTube. https://www.youtube.com/watch?v=yMHXwh_q8TA

[8] CGHOW. (2023b, March 10). Noise to Stylized Trail in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=e5c5rhtgaik

[9] Ben Cloward. (2022c, November 17). Subsurface Scattering - Advanced Materials - Episode 8 [Video]. YouTube. https://www.youtube.com/watch?v=an8zDRTjUYc

[10] Shading Models. (n.d.). https://docs.unrealengine.com/5.1/en-US/shading-models-in-unreal-engine/

[11] Subsurface Profile Shading Model. (n.d.). https://docs.unrealengine.com/5.1/en-US/subsurface-profile-shading-model-in-unreal-engine/

[12] 効果音ラボ - フリー、商用無料、報告不用の効果音素材をダウンロード. (n.d.). 効果音ラボ. https://soundeffect-lab.info/sound/various/

[13] renderBucket. (2022, October 3). Environment Creation: Making Realistic Desert Rocks In Gaea [Video]. YouTube. https://www.youtube.com/watch?v=sgsf-sPr9fc

[14] Fortnite Sensei. (2023, March 31). Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course! [Video]. YouTube. https://www.youtube.com/watch?v=0CcoOq963O8