UE4の勉強記録

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

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

1.今週の予定

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

今週は、UE5におけるLandscapeのDisplacementについて勉強します。

その後で、Foliageの勉強をします。

Foliageの勉強についてはUE5におけるProcedural FoliageとAuto Materialについでも調べます。

その後で、NaniteによるFoliageを実装します。

Niagaraの勉強>

CGHOW氏のSprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [1]の実装の続きを行います。

<Materialの勉強>

Ben Cloward先生のSnowy Rock Shader - Advanced Materials - Episode 4 [2 ]を実装します。

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

魔術師が魔法を唱えた後のEffectを作成します。

がその前に先週追加したAnimationがPackagingした後でも動いているのかの確認や、魔法を対戦相手のMonsterに掛けた時にも正しく発動するのかの確認を行います。

<Gaeaの勉強>

先週、作成した手順でTerrainを作成してみます。

<Houdiniの勉強>

公式のTutorialであるFOUNDATIONS | OVERVIEW [3]の続きを勉強します。

<Volumetric Cloudの勉強>

何をやるのかまだ決めていません。

今、思い付くのは雷の追加方法でも調べるとか、雲のParameterの調整方法について公式のSiteと比較するとかです。

DirectXの勉強>

Olympus Mons Tutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [4]の最後の部分を終わらせます。

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

今週はUE5におけるLandscapeのDisplacementのやり方の勉強から始めます。

これ先週調べたら結構根深い問題をはらんでいて、英語圏のCommunityでもかなり炎上していたんですが、全く知らなかったです。

2.1 Unreal Engine 5 - Landscape Displacement Problems [5]を解説する

UE5のMaterialではUE4のMaterialにあったTessellationが無くなりました。

UE5では代わりにNaniteを使用しましょう。という流れだったみたいですが、実際は色々な問題が発生してUEのFourmでもTessellationを復活させろ派と、無いものは無いから諦めろ派で喧嘩とまでは行かないものの、かなり揉めたみたいです。

UnrealityBites氏がUnreal Engine 5 - Landscape Displacement Problems [5]でその経緯について詳しくまとめていますのでまずそれを紹介します。

UnrealityBites氏の動画は初めて見ます。今まで全く私の検索では出てこなかったです。

まずUE4ではMaterialにあるTessellationを使用して以下に示した様な雪の上を歩いているようなEffectを作成する事が出来ました。

砂漠の上の走るTruckの作成も同じ方法で出来ました。

しかしUE5ではTessellationは無くなって代わりにNaniteを使用しましょう。となりました。

UnrealityBites氏の動画でははっきりとは述べていませんが、特にCommunityではUE5でTessellationが無い事に切れている輩はNaniteの使用方法を勉強してない怠け者みたいに扱われたみたいです。

確かにNaniteを使用すると以下に示したように、

Tessellationを使用した場合よりも綺麗なLandscapeを作成する事が出来ます。

Runtime Virtual Textureを追加で使用した場合は更に綺麗で本物そっくりのLandscapeが作成出来ます。

ここからがUnrealityBites氏が主張したい部分で、確かにDisplacementを追加したい場合はNaniteとRuntime Virtual Textureを使用すれば良いですが、砂漠や雪の上での足跡や、Truckの轍の作成はどうなのかという事です。

Epicの解答はVirtual Height Field Meshes

を使用するでした。

以下に示した様にVirtual Height Field Meshesを使用すると

足跡が作成出来るようになりました。

ただしUnrealityBites氏によるとVirtual Height Field Meshesを使用すると

  • MeshのFlickeringが起きる
  • Frame Rateが下がる
  • Textureが不明瞭(Blurry)になる

などの問題が起きたそうです。

以下にUnrealityBites氏による実際の画面を示します。

うーん。

確かに砂漠のLandscapeと比較するとTextureがBlurryですがこの時に使用しているTextureが元々こんな感じなのかもしれません。

UnrealityBites氏は別な方法を採用する事で以下に示した様な足跡をUE5で再現しました。

確かにこのImageを見る限りは砂漠のTextureがBlurryになって無いです。

以上です。

2.2 Displacementの勉強をどうするか?

砂漠ではないですが、砂浜に足跡が残せるようにLandscapeを改良するのは必要です。

のでUE5のDisplacementの勉強はやる必要があります。

でも順番から言うと、

  1. Naniteの配置
  2. Runtime Virtual Textureを使用したLandscapeとNaniteのMaterialの混合
  3. Virtual Height Field Meshesを使用した足跡の作成
  4. UnrealityBites氏のやり方による足跡の作成

だと思います。

今すぐこれを勉強しても使用できる場所がない気がします。

Naniteの配置からやる事にします。

2.3 Auto Materialって何?

これです。

動画見たんですが、Auto Materialについての解説は無かったです。

GoogleでAuto Materialについて調べました。

まず出て来たのが以下のAssetです。

これ無料なんですね。

うーん。凄い。

次に出て来たのが以下のTutorialです。

全部見ましたが、今の私のLandscape用のMaterialの作成方法とほぼ同じやり方でLandscape用のMaterialを作成する方法を紹介しているだけでした。

このTutorialが言うにはこのやり方をAuto Materialと呼ぶんだそうです。

うーん。

他にAuto Materialについての情報がないのでこれで終わりです。

<追記>

Auto Materialの定義が分かりました。

World Aligned Blendノードを使用して、Paintした時に自動で別々のMaterialを選択する事をAuto Materialと呼ぶそうです。

成程。

これなら確かにある程度はAutoです。

2.4 Procedural Foliageについて

まずProcedural Foliageで生成したFoliageとはCollisionする事が出来ません。Characterは岩や木を通り抜けてしまいます。

ひょっとしてUE5.1だとこれが改良されたのかと思ったんですが、もしそうならその事をもっと宣伝するはずです。

していないという事はまだ直ってないと思います。

2022-12-12のBlogにCollision出来るFoliageの作成方法をまとめてあります。

更に2022-12-04のBlogにLayer毎にFoliageを追加する方法がまとめてあります。

今回はこのやり方でFoliageを配置します。

2.5 Naniteの岩をFoliageとして追加する

はい。

それではやっていきます。

Quixel Bridgeから以下のAssetをDownloadしました。

直接、NaniteとしてImportするとMeshが細かすぎるのでMedium SizeでImportしてUE5内でNaniteに変換する事にします。

試しに最初のAssetであるBeach_Boulder_wdpmegmを

Naniteにしてみます。

Level上に配置しました。

良い感じです。

Naniteが本当に効いているのか確認します。

View ModeをNaniteのTriangleに変更しました。

結果です。

Collusionがある事も確認しました。

この岩をFoliageでPaintします。

試しなのでこれ一個でやってみます。

FoliageのPaintを選択して

先程作成したNaniteを追加します。

このRockの設定の内、

以下のInclusion Landscape Layersに

Elementを追加してIndex[0]を作成し、その値をCliffにします。

これでCliffのLayerにだけこのFoliageをPaint出来るはずです。

更に、Collision PresetsをBlockAllにします。

これでFoliageで生成されたRockもCollisionするはずです。

テストします。

おお、CliffのLayerだけRockが生成されています。

Naniteも効いています。

Collisionも確認します。

うーん。

効いてない?

RockのStatic Meshを開いて確認するとComplex Collisionの設定は以下に示した様にありましたが、

Simple Collisionの設定は無かったです。

確か建物を作成した時にLevel上に配置したActorのCollisionの形状を確認する方法を勉強したはずです。

それを使用してLevel上の岩のCollisionがどうなっているのか確認します。

2022-11-14のBlogに書いてありました。

だそうです。

そんなCommandありません。

ええい。

そのまま打ってみました。

Collisionは表示されました。

その結果生成されたRockにはCollisionが無い事が確認出来ました。

FoliageでPaintしたのではなく普通に配置したRockです。

これもCollisionは見えませんがQueenと衝突しています。

うーん。

よく分かりません。

サイズを5倍にして試してみます。

Collisionしませんでした。

これはあれだ。

Simple Collisionを追加する必要があるやつです。

RockのStatic Meshを開いてCollision Complexityの設定を

Use Complex Collision As Simpleに変更しました。

今度はガッツリCollisionが表示されています。

更にRockとOverlapする事も無くなりました。

Foliageで生成したRockのCollisionを確認します。

こっちはCollisionは表示されません。

しかしCollisionはしっかり存在していて

歩きにくいし岩の上に乗る事も出来ます。

2.6 Foliageの配置をもっと改良する

まずこの岩の色からしてSandに配置する事にしました。

以下の4つの石も追加します。

更に海にも配置しました。

今度は石を配置してみます。

もう少し地面にめり込ましたいです。

Z Offsetの値を-3~1にしてみました。

以下の様に少しだけ砂に潜るようになりました。

他の石も追加して以下の様になりました。

かなり良い感じです。

これで砂浜をPaintします。

川の上にPaintしてしまいました。

直しました。

岩も埋めてみました。

うーん。

まあ良い感じです。

今度は草のFoliageを探します。

Wild_Grass_vlkhcbxiaです。

Sea_Wheatgrass_ui2oagjiaです。

うーん。

Ribbon_Grass_tbdpec3rです。

これはありな気がします。

Grass_slBm1です。

これも一寸混ぜたら良い感じです。

あ。草のNaniteをまだ試していませんでした。

これを先にやります。

2.7 草のNaniteを試す

S_Bird_Of_Paradise_wfypeifha_Var10_lod1をNaniteにしました。

何の問題もなく出来ました。

Sea_Wheatgrass_ui2oagjiaです。

これをGrass LayerにPaintしてみます。

Paintしてみました。

Naniteです。

ちなみにPCからうなった音が聞こえたりする事は全くないです。

これぐらいなら全く負担にならないみたいです。

草の向きがLandscapeに対して垂直になっています。

今、思ったんですが、草は別に衝突する必要はないのでProcedural Foliageで生成しても良い気がします。

今度は木を追加してみます。

良い木の3D Modelが見つからないのでUnreal SenseiのTutorialで使用した木と同じのを使用しようとUnreal SenseiのTutorialを見ていたら、Landscapeは大きい部分から作成していくって言っていました。

うーん。確かにそうです。

これはやり直しします。

取りあえずそのTutorialで使用していた木のAssetだけは追加しておきます。

Importした木を配置してみました。

これは良いです。

それで大きなFoliageから並べる事にしました。

この4つのAssetをNaniteにしてFoliageで並べてみます。

ダメでした。

裏側が無いのはCliffに配置すると裏が見えてしまいます。

ので以下の岩を新しくQuixel Bridgeから持ってきました。

これらで試してみます。

色々試しましたが、以下の様な感じです。

Z Offsetの値の単位cmでした。

これくらいの設定で、やっと岩の一部が地面にめり込みます。

岩の色が以上に白くなります。

これはMaterialを改良する必要がありそうです。

以下に示したGaeaが作り出した尖ったLandscapeはこれで隠す事が出来そうです。

来週はこのMeshのMaterialを弄って色をもっと黒くします。

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

2.8 今週得た知見をまとめる

<NaniteによるFoliageの順番について>

まさか、Foliageのやり方にまで正しい順番があるとは思ってもいませんでした。

これはUnreal Sensei氏のTutorialをもう一回見直す必要があるかもしれません。

大きい物から順番に配置します。

確かに大きいものから配置した方が見た目が綺麗になります。

<Landscapeの尖っている部分は隠せそう>

Foliageを上手く配置する事でLandscapeの尖っている部分をいちいち修正する必要はなさそうです。

<非常に大きなFoliageはQuixel Bridge内では見つからない>

Unreal Sensei氏のTutorialでは城を追加していましたがそういう大きなAssetはQuixel Bridge内には無いです。別なAssetを使用する必要があります。

<草や小石のFoliageにCollisionを追加する必要はない>

つまり大きなFoliageはCollisionのあるFoliageとして今まで通りの方法で作成しますが、小石や草のFoliageはProcedural Foliageで生成した方が楽かもしれません。

これは来週検討します。

<Quixel Bridgeの3D AssetはDefaultではCollisionがない>

Quixel Bridgeの3D AssetはSimple Collisionが設定されていません。

何らかの対策をしないとCollisionしません。

<付属のMaterialを使用すると白すぎる>

これは岩の場合ですが、Quixel Bridgeの3D Assetの付属のMaterialを使用した場合は白くすぎます。

これはSpecularの値がPBRの計算値をそのまま使用しているせいだと思われます。

更に、LandscapeとなじませるためにRuntime Virtual Textureの使用が必要になりそうです。

Runtime Virtual TextureをNaniteに使用した事は無いです。更に言うとFoliageに使用した事もないです。これは来週以降勉強する事にします。

2.9 LandscapeのNaniteが出来る件について(追記)

2022-11-28のBlogで書きましたが、LandscapeをNaniteにするのはまったくお勧めしないとありました。

これ

出典を書いていませんが、公式のFourmに書かれていたはずです。

かなり強い口調でLandscapeをNanite化するのを非難していた記憶があります。

こういうのの出典をしっかり書いておくと後で、整合性を取った時に凄く面白くなるのに、勿体ない事をしました。

それは兎も角としてLandscapeをNaniteする方法が分かりました。

Landscapeを選択するとParameterに以下に示したNaniteがあります。

これをEnableしてRebuild Dataを押すだけです。

これでLandscapeがNaniteになります。

えー。ですよ。

こんな簡単にLandscapeをNanite化出来るんですよ。

これ本当にお勧めしない設定なんでしょうか?

もう一回Landscape、Naniteで検索してみます。

ありました。

公式のFourmのNanite landscape? [7]です。

これってUE5.0だとLandscapeをNaniteに変更する事が出来ないからStatic MeshとしてImportしてNaniteにするみたいに解釈したんですが、違うんでしょうか?

下の方まで読んだらLandscapeをNaniteにする方法も紹介されていました。

最後まで読んだら色々な方法が紹介されていました。

  1. Landscapeを作成してそのまま
  2. Landscapeを作成してNaniteに変換
  3. Landscapeを使用しないでStatic Meshだけで作成しNanite化

この1の方法は今の私がやっているやり方です。World Partitionを使用しているだけです。

この2の方法は今知ったやり方でこれからやろうと思っているんですが、高Costで実用的ではない。と言っている人がいました。

この3の方法がUE5のデモでEpic Game社が公開したやり方です。

Epic Game社はLandscapeの使用そのものにそんなに積極的ではないのか、それともUE5.0の時はまだLandscapeがNanite化出来なかったらこうしたのか不明です。

もっと情報が必要です。

調べたんですが、このForum以外の情報が出て来ません。

これは自分で試して良い方を採用すべきという事でしょうか?

3.Niagaraの勉強

CGHOW氏のSprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [1]の実装の続きを行います。

3.1 Sprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [1]の実装の続き

先週は、矢印のSpriteがFlapping(蝶が羽ばたくようにパタパタする事)した所まで実装しました。

今週はその続きから始めます。

なんと赤い矢印の方はFlapping(パタパタ)していません。

先週のBlogを読み直したら緑の矢印だけFlappingする設定を追加して

で終わっていました。

今、矢印のEffectを見るとPreviewで見る限りにおいては確かにFlappingする角度が違う時があるようです。

でもEffectってTimelineで巻き戻しても再現出来ないし、本当にFlappingする角度が変わっているのか分かりません。

赤の矢印をパタパタさせる方を先に実装する事にします。

<赤の矢印をFlapping(パタパタ)させる>

要するに緑の矢印でやった事と同じ事を赤の矢印でやれば良いだけです。

緑の矢印では[PARTICLE]SpriteFacingの値を変更しています。

赤の矢印で、緑の矢印の[PARTICLE]SpriteFacingにあたるのは[PARTICLE]Facing2です。

まずParticle Update SectionのSet Particle Moduleに

[PARTICLE] Facing2を追加します。

[PARTICLE] Facing2のAttributeの設定を

緑の矢印のSprite Facingと同じにします。

結果です。

なんと、赤の矢印と緑の矢印がシーソーのように互い違いに上下し始めました。

あ、これTutorialで見たヤツです。

2023-02-13のBlogを見たんですがこの部分については全くまとめていなかったです。

Tutorialの方を見直したら緑の矢印の方に使用しているParameterのScaleの値をNegativeにしていました。

同じ様にやってみます。

SpriteFacingの方のScaleの値をNegativeにしました。

結果です。

蝶々が羽ばたくような角度で2枚の矢印がパタパタし始めました。

値を微調整して蝶が羽ばたいている感じにしました。

Screenshotでは分かりませんが、蝶のように矢印がパタパタしています。

<Spriteの羽ばたきを蝶のようにする>

いや、もう蝶のように羽ばたいているじゃん。

と思ったらここでシーソーのような羽ばたきを直していました。

いや、読んでなかった。

今読んだらしっかりやり方がまとめられていました。

<Offsetの調整>

今度は、Blogをしっかり読んでから実装します。

まずこれの確認をします。

私の矢印は中心がずれている様には見えません。

TutorialによるとParticle Update SectionのSet Parameterを切った状態で

様になってないといけないそうです。

見てみます。

私のは真っすぐです。

これはやる必要ない。

と思ったんですが、一応確認のために以下の様にParticle Spawn SectionのSet Parametersの

[PARTICLE] Facing2と[PARTICLE] SpriteFacingのYの値を0.33にしてみました。

これも真っすぐになりました。

これYの値が同じならどんな値を入れても真っすぐになるみたいですね。

この値を0.33にすると何が変わるんでしょうか?

Playして確認してみます。

あれ?

矢印の羽ばたく角度が一定になっています。

前まで、角度が大きくなったり小さくなったりしていたんですが、一定になっている気がします。

完全に同じじゃないかもしれませんが、大体一定です。

Pivotの調整ってこの事を言っていたみたいですね。

Tutorialを見て確認します。

うーん。

分からん。

違うかもしれません。

<この矢印のEffectが飛び回るようにする>

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

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

結果です。

確かに矢印が飛び回るようになりましたが、矢印がねじれています。

これを直します。

Particle Update SectionのSet Particles Moduleの

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

これの意味が分からない。

ここは一体何をしているんだ?

これは後で考える事にします。

結果です。

大体においては真っすぐになりましたが、以下に示した様に

少し曲がっている場合もあります。

まあ、気になるほどでは無いのと、直し方も分からないのでこのまま先に進みます。

<沢山の矢印のEffectを生成する>

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

Spawn Rateに50をセットします。

次にParticle Spawn SectionにShape Location Moduleをセットします。

Sphere Radiusの値を100にします。

結果です。

Tutorialみたくバラバラに飛んでいかないです。

Particle Spawn SectionのInitialize Particle Moduleの

Lifetime MinとMaxを

から

に増やしてみました。

結果です。

まだごちゃごちゃしています。

次で矢印のサイズを調整するのでそれをやってから考えます。

<矢印のSpriteのSizeを調整する>

Particle Spawn SectionにあるInitialize Particle Moduleの

Sprite AttributesのSprite Size Modeを以下の様に変更しました。

結果です。

完全に蝶が羽ばたいているのと同じになりました。

2023-02-13のBlogには以下の様に書かれていましたが、

Previewの画面を見る限りでは全く気になりませんね。

おそらく人間の脳は小さい矢印は遠くにあると勝手に認識しているんでしょうね。

<蝶の画像に変える>

まず蝶の画像が必要です。

ネットで探します。

いらすとやにアゲハ蝶のイラストがありました。

これを使用させていただきます。

以下のようなMaterialを作成しました。

結果です。

Wrapを以下の方法で停止します。

Texture Sampleノードの

Sample Sourceの設定を

Shared : Clampにします。

結果です。

このSample Sourceの設定は沢山のTextureを使用する時にもSharedに変更しますし、色々謎のParameterです。

Sample Sourceの解説です。

これ見るとSample Sourceの一番の目的はMaterial内で16枚以上のTextureを使用出来るようにする事のようです。

このMaterialを先程の矢印のMaterialの代わりに使用します。

Render Sectionの両方のSprite Renderer Moduleの

Materialにセットします。

結果です。

当然ですが、片方の羽根しかない蝶々が出来上がります。

これを直します。

ここでTutorialは一個のMaterialから色々やって反対側の羽根を表示していますが、単純に2個目のMaterialを作成して

逆の羽根を表示させたの使用したらどうなんでしょう?

一寸これを試してみます。

結果です。

これでも普通に羽ばたいています。

Spawn Rate Moduleに戻して羽ばたかせてみます。

テカリを調整しました。

Level上に配置してみました。

これでも完璧でしょう。

まあ、でもこれは勉強なんで一応、Tutorialのやり方でもやっておきます。

<Tutorialのやり方>

Niagaraの設定を以下の状態まで戻しました。

Render SectionにあるSprite Renderer Moduleの

UV Scale Bindingの以下の設定を変更します。

そしてParticle Update Sectionに新しいVector 2DタイプのParameterを追加します。

名前は[PARTICLE] MyUVScaleにしました。

値に(-1.0, 1.0)をセットします。

そして羽根が逆についている方のSprite Renderer ModuleのUV Scale Bindingにセットします。

結果です。

おお、直りました。

あ、意味が分かりました。

UV Scaleだから普通は(1, 1)なんです。これを(-1, 1)にしたから羽根の向きが逆になったんです。

これってはっきり言って私が2つ目のMaterialの設定で

TexCoord[0]ノードに加える値をNegativeにしたのと全く同じです。

大変綺麗に飛んでいます。

Tutorialではこの後に

Sample Sourceの設定をShared : Wrapにした場合の調整方法も紹介しています。

これも試してみます。

当然ですが、Sample Sourceの設定をShared : Wrapにしたら

蝶々が連続で表示されます。

これを以下の実装で消します。

Stepノードの機能については、2023-02-13のBlogで以下の様にまとめています。

このNodeは公式のDocumentがないNodeでその機能を判明させるのに偉い苦労したヤツです。

Materialの設定のせいで紙が飛んでいるみたいです。

値を調整してみました。

結果です。

軽く調整しただけですが、本物の蝶が飛んでいるみたいになりました。

以上です。

3.2 Sprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [1]の実装を終えて

やっぱりまだSpriteの向きがよく分からない箇所があります。

来週はCGHOW氏のTutorialであるSprite Rotation Sprite Alignment Sprite Facing | UE5 Niagara Tutorial | Download Project File [6]を勉強する事にします。

4.Materialの勉強

今週はBen Cloward先生のSnowy Rock Shader - Advanced Materials - Episode 4 [2]を実装します。

4.1 Ben Cloward先生のSnowy Rock Shader - Advanced Materials - Episode 4 [2]の実装

まずRockのMaterialを整理します。

その前にRockのMaterialを改良していて元の実装と少し形状が変わっています。

それを直します。

以下のNormalを外して

以下のNormalを使用します。

よく見たらこれだけでした。

まずRock Base Material Functionを作成しました。

念のためにTutorialで確認したら結構間違っていました。

以下に直したMaterial Functionの実装を示します。

次のMaterial FunctionであるRock Detailを作成します。

出来たんですが、Errorが表示されています。

これは単なる警告ですかね。

別にCompile出来ないとかは無いみたいです。

これで試してみます。

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

何もErrorとかないです。

この実装で前に作成したRockと同じ機能があるはずです。

テストしてみます。

一寸白いですが、5倍の大きさにしています。

Detailが無くなった感じはしません。Macro Detailはきちんと効いているみたいです。

今度はものすごく近づいてみます。

これもDetailがしっかり出ています。Micro Detailもしっかり機能しています。

5倍のRockと1倍のRockを重ねた部分です。

TextureのSizeが完全に一致しています。

完璧に出来ています。

それでは最後のSnow Functionを作成します。

私のSparkling SnowのMaterialは以下の様になっていますが、

この実装はTutorialとは少し違っていますね。

仕方ないです。

これを元にしてTutorialと同じようなMaterial Functionを作成します。

これで最後のMaterial FunctionであるSnow Mask以外は出来ているはずです。

Snow Maskの実装も出来ました。

SnowのMaterial Functionを完成させます。

先程のRockのMaterialにこのSnowのMaterial Functionを追加します。

結果です。

元が白すぎて雪が積もっているのかどうか分かりません。

原因が分かりました。

SnowのMaterial InstanceのColorのLerpのAlphaの値にSnowMaskの値がセットされていませんでした。

直しました。

結果です。

Snow Coverageが0の時です。

分かりやすくするために岩を黒くしました。

Snow Coverageが0.5の時です。

雪が積もっているのが分かります。

凄いのが5倍のRockと1倍のRockを組み合わせてこのRockを作成していますが、その境界が全く分からない所です。

Snow Coverageを0.7にしました。

更に雪が積もっています。

近づくとしっかりSparklingも確認出来ます。

あんまり岩を黒くしてしまったので

岩のMicro Detailが見えなくなってしまいました。

岩の色を元に戻します。

Micro Detailも効いていますね。

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

当然ですが雪は岩の上に積もっています。

これで全部実装出来ました。

<先週の疑問>

これ、今となってはあまりに明白過ぎて答えをここに記録するか迷った位ですが

一応、先週の疑問には解答しておいた方が良いと思うので、ここに記録しておきます。

ある面が上を向いていたらその面のNormalも上を向きます。その時のNormalのZの値は1です。よってその面が上を向いている場合はBの値は1になります。

まさしくこの通りの結果です。

勿論、この結果になるためにはNormal Vectorの座標はWorld Spaceに変換されている必要があります。

それだけです。

今週のMaterialの勉強は以上です。

一寸短いですが、勉強した量は普段と変わらないのでまあ良いでしょう。

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

今週は以下の作業をします。

  • 先週、追加したAnimationのBugの確認
  • Packagingして同じように動くか
  • 対戦相手のMonsterに魔法を掛けたらどうなるのか?
  • 魔法を掛けられたMonsterのEffectの追加

5.1 先週、追加したAnimationのBugの確認

先週、追加したAnimationは以下の通りです。

  • 回復魔法
  • 攻撃力2倍の魔法
  • Switchの魔法

まずこれらのAnimationがきちんと動いているのかを確認します。

<回復魔法>

確認しました。

回復魔法を受けたのに、AnimationはDamageなのが一寸変ですが、その辺はEffectで補う事にしましょう。

<攻撃力2倍の魔法>

これも確認出来ました。

このAminationもDamageのAnimationです。

<Switchの魔法>

これもきちんと作動しています。

確認しました。

<妖精族以外のMonsterの時もきちんと動くのか確認する>

先週、どんな実装をしたのか忘れてしまったんですが、妖精族以外のMonsterのAnimationは実装していなかったはずです。

それだけ確認しておきます。

どこでAnimationをセットしたのか忘れてしまいました。

それから調べます。

Level BPのPlayer Monster Attackの

以下の箇所で実装していました。

そういえば、魔法をかけられたと言う意味でMagicedと言う実際には存在しない英単語を使用していたんでした。

魔法をかけられたと言う意味の英単語から調べる事にします。

Enchantedだそうです。

Enchantって軽いおまじない位のImageだったんですが、こういうFantasyばりばりの魔法の場合も使用出来るんでしょうか?

分からん。

Googleの検索で出てきた用法は全部、おまじない系です。

うーん。

まあMagicedよりはましでしょう。

Enchantedに直しておきます。

以下の3つのFunctionの名前を直しました。

Play Enchanted Monster Animationノードの実装を見ます。

あ、ここでもMagicedが使用されていました。

Game ModeのVariableです。

直します。

これって他のBlueprintから呼び出している場合も勝手に直してくれんでしょうか?

多分そうでしょう。

Level BPに戻ったら直っていました。

ただしCompileする必要がありました。

一心配なのでPlayして確認します。

普通にPlay出来ましたし、Screenshotには撮れなかったですが、魔法を掛けられた時のAnimationも普通に発動していました。

今度は以下の関数を読んでいます。

実装を調べます。

全ての魔法を掛けられた場合で、以下の関数が呼ばれていました。

実装を見ます。

何と、全部の種類のMonsterのAnimationがセットされていました。

という事は全部のMonsterで魔法を掛けられた時の効果が確認出来ると言う訳です。

これは勘違いしていました。

ただこれってまた脱線しています。

こんな機能は今は要らないです。

5.2 Packagingして同じように動くかの確認

これ先週もPackagingは試していたはずです。どこで試したのか確認にします。

確認しました。

Dragon族の攻撃Effectを追加した後で、Packagingのテストを行っています。

つまり以下の

  • 魔術師のEffect
  • 魔法を掛けられたMonsterのAnimation

の二つの機能はまだテストしていません。

テストしましょう。

Packagingします。

2分位で完成しました。

Exe.Fileから起動します。

まず魔術師が魔法を使用した時のEffectです。

普通に発動していました。

次に魔法を掛けられたMonsterのAnimationです。

普通に発動していました。

Screenshotは撮れなかったです。

まあ、全部動いているのは確認出来ました。

5.3 対戦相手のMonsterに魔法を掛けたらどうなるのか?

これ滅茶苦茶、大切なBug出しです。

しかし、今これをやると、Effectの追加を途中で止める必要が出て来ます。

のでこれはEffectが終わってからやる事にします。

5.4 魔法を掛けられたMonsterのEffectの追加

今週のMainである魔法を掛けられたMonsterのEffectの追加を行います。

<回復魔法>

まずはEffectを選ぶ所から始めます。

そのものずばり、Healと言う名前のEffectがありました。

こんな感じです。

これを使用してみます。

あ。

Play Enchanted Monster Animation Helper()関数の実装で

全ての魔法のAnimationをDamage Animationで代用していました。

そもそもこの関数はMonsterがDamageを食らった時に使用する関数です。

回復用のEffectを追加するには別の関数を作成する必要があります。

Damage AnimationをDuplicateして回復用のAnimationのための関数を作成し、そこに回復用のEffectを追加します。

Recover Animation()関数を作成しました。

これを回復魔法を使用した時にDamage Animationの代わりに使用します。

テストします。

回復魔法を掛けられたMonsterは普通にAnimationが発動しました。

全部のMonsterのAnimationにEffectを追加するのは大変なので、

取りあえず妖精族のAnimationにだけEffectを追加します。

ここで使用しているAnimationは以下のものですが、

ここにEffectを追加してしまうと、Damageを食らった時も回復用のEffectが発動してしまいます。

のでDuplicateして以下のAnimationを別に作成しました。

ここに先程のEffectを追加します。

Notifiesに新しいTrackを追加し名前をNiagaraに変更します。

Niagaraの項にAdd Notifyから

Play Niagara Particle Effectを追加します。

Play Niagara Effectを選択して

Niagara System に先程のHealのEffectを追加します。

Preview画面です。

Healingされている感があります。

Level BP内のRecover Animation関数の以下のPlay AnimationノードのAnimationの設定を変えます。

これで回復魔法を掛けられた時にEffectが発動するはずです。

Testします。

綺麗に発動しています。

思ったより地味なEffectです。

<攻撃力2倍魔法>

まずEffectを選びます。

NS_ky_gaitherが良い感じです。

これで試してみます。

Recover AnimationからDouble Animationを作成しました。

Double Animation()関数内で使用するAnimationを別に作成しました。

ここに先程のNiagaraをセットします。

結果です。

Double AnimationのEffectをこのAnimationに変更します。

Play Enchanted Monster Animation Helper()関数の

Doubleの場合にDouble Animation()を予備だすように実装します。

これで攻撃力2倍の魔法を使用した場合、NS_ky_gaitherがEffectとして発動するはずです。

Testします。

結果です。

奇跡的にEffectが発動している時にScreenshotを取る事が出来ました。

滅茶苦茶綺麗です。

<位置交換魔法>

今度は最後の位置交換魔法のEffectを追加します。

まずはEffectから探します。

NS_Muzzle_6にします。

こんなEffectです。

回復魔法や攻撃力2倍魔法のEffectを追加した時と同じように作成します。

まずLevel BP内にSwitch AnimationをDamage Animationから作成します。

次にSwitch用のAnimationをDamage AnimationをDuplicateして作成します。

ここに先程のEffectを追加します。

こんな感じに追加しました。

Switch Animation()関数のAnimationをこのAnimationに変更します。

Play Enchanted Monster Animation Helper()関数の

Switchの箇所をSwitch Animationに変更しました。

これで交換魔法を使用した場合、NS_Muzzle_6のEffectが発動するはずです。

テストします。

結果です。

綺麗なEffectが現れました。

このEffectの良いところはMonsterが交換した後も少しだけ持続している所です。

Monsterの交換が魔法によって行われた感じが良く出ています。

これですべての魔法のEffectが完成しました。

対戦相手のMonsterを元に戻して実際にPlayしてみます。

Stage 9で負けました。

Effectを見ながらPlayしましたが、全く問題なかったです。

5.5 対戦相手のMonsterに魔法を掛けたらどうなるのか?を確認します

これはかなり大きな問題なので少しずつ試していきます。

まず対戦相手の妖精族に魔法を掛けた場合、どうなるのかを確認します。

まず以下の文字が表示され

Screenshotは取れませんでしたが、回復のAnimationとEffectは普通に流れました。

そして最後にHPの数字が変化しました。

つまり全部出来ています。

となるとゾンビ族、亡霊族、ドラゴン族全てに魔法が掛けられた時のAnimationを追加すれば良いという事になります。

これは後で考える事にします。

今までの予定を確認します。

5.6 予定の確認

今度は音楽の追加です。

正直、戦闘の効果音を追加するよりBackground Musicの追加をしたいです。

その後で、

そしてPackagingで終わりです。

うーん。

これは3月までには全部終わりそうです。

これはこれで完成させてしまいます。

ミニゲームとして完成させてから、後でどう伸ばすのか考えます。

今後はどうやって売るかを考える必要がありそうです。

5.7 販売戦略を考える

何というか一寸時間が余ってしまったんですが、何かを次の勉強をやりたい気持ちが起きないので、この戦闘システムがミニゲームとして完成したとしてどうやったら売れるのかを考える事にします。

まず私が考えている販売の戦略としてはYouTubeで宣伝です。

Volumetric CloudのTutorialを作る予定なのでそこでこんなGameを作成しました。とこれで遊んで感想を聞かせてください。みたいな感じで宣伝します。

ただ、このGameどの程度面白いのか不明だし、面白いって感覚自体が主観的なものなので、そんなに高い値段では売れないと思います。

コミケとかでそれこそ10ページ位の自作の漫画を1200円位で売っているじゃないですか。

やっぱりそれくらいの値段で売りたい訳です。

やっぱりこのGame、完成するのに大体1年は掛かっています。その労力に対しての正当な評価は欲しいんです。

この辺の値段の設定ってどれくらいが適切なんでしょうか?

よく安くすれば買ってくれるだろうと100円とかにする人がいますが、それって作品の評価を自分で下げてしまっている気がします。

うーん。でも漫画本一冊と考えると400円ぐらいでも適切か。

このGame、クリアするのにかかる時間って、一回で最後まで倒せれば30分位です。2~3回挑戦したら1時間半位ですかね。

400円位が適切なのかもしれません。

このGameの売りって何なんでしょう?

うーん。400円位なら表紙を滅茶苦茶綺麗なイラストにしたら買ってくれそうです。

でもそれだと最後までPlayしてはくれそうにないです。

やっぱり最後までPlayする予定の人に買ってもらいたいです。

このGameは元々、Hunter x Hunterとポケモンgoの面白さを追求した結果出来たGameです。

このGameでは、そのConceptは半分位しか実現出来ていませんが、それなりには面白いはずです。

ただここが面白さのPointです。という事を最初から説明しないとこのGameを買った人がそれに気が付かなくて途中で止めてしまう可能性が高いです。

そこをどう説明するのかを考える必要があります。

更に一言で説明する必要があります。

Turn Based Command Fighting Systemと言っても面白さは全く伝わりません。

最初に死んだMonsterがいるチームが負ける独自のターンベース戦闘システム!

うーん。

ノリとしては正しい気がします。

Monsterが一体死んだら負け! 全く新しいターンベース戦闘システム。

あ。そうかおもちゃでもこのGameはどうやって遊びます。って説明する必要があります。

子供はその説明からこのGameは面白いかどうかを判断して買うかどうかを決めるわけです。

説明文が必要なのか。

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

簡潔なルールの説明でこのGameの面白さを伝える訳です。

  • 貴方は魔法使いです。
  • 魔法使いはMonsterを召喚してMonster同士に戦闘を行わせます。
  • 召喚したMonster同士は勝手に戦います。
  • Monster同士の戦闘中は、貴方は補助魔法を行使して味方のMonsterが戦闘を有利に進められるようにします。

うーん。全然ウキウキしない説明です。

でもGameのRuleは一応説明出来ています。

文をもっと推敲する必要があります。

以下の様に変えてみました。

  • 貴方は魔術師見習いです。ただし10年の修行の上、もう少しで一人前の魔術師になれるところまで来ました。
  • 師匠が貴方に言いました。今から最終試験を行う。もし試験に合格したら魔術師見習いを卒業して魔術師になれると。
  • 最終試験は、師匠を魔法決闘で10回倒す事。
  • 魔法決闘は以下のRuleで行います。
    • 魔術師はお互いに三体のMonsterを召喚します。
    • 召喚したMonsterは勝手に戦います。
    • Monster同士の戦闘中、魔術師は補助魔法を行使する事が出来ます。補助魔法を使用する事で、味方のMonsterが戦闘を有利に進められるようにします。
    • Monsterが一体でも死んだらその時点で負けです。

前よりはましになりました。

まだ全然ダメですが。

でも何が足りないのか段々分かってきました。

このGameをやる理由です。

それこそがRole Playing なんです。

主人公が、魔術師の見習いとして10年も修業して、やっと一人前の魔術師になれるかもしれないチャンスが来ました。

このチャンスは絶対にものにしたいはずです。

そこで魔術師になるための条件としてこのGameをClearする事が来るわけです。

このGameのUserは主人公が一人前の魔術師になった時の喜ぶ姿を見たいので、このGameを一生懸命Playする訳です。

これですわ。

Storyが無かったんです。

DramaがないのでこのGameをやる必要もありません。

そういえばCyberpunk 2077もアニメでStoryが出来てから凄い人数がPlayするようになりました。

6.Gaeaの勉強

今週は先週、作成した手順でTerrainを作成してみます。

6.1 手順の復習

先週作成した手順は以下の様になっています。

今読み直したが、特に不明な点はないです。

ただしそれぞれの手順で、どのGroupのNodeを使用すれば良いのかとかはまだ決まっていません。

6.2 Geo Primitivesを使用して基礎の地形を作成

当然、Mountainノードを選択します。

ここで使用できるnodeは、基本的にはCanyon、Fault、HillそしてMountainの4つのNodeだけです。

それぞれのNodeのDefaultの形状を以下に示します。

<Canyon>

結果です。

文字通りCanyonが形成されています。

隙間を見ましたが、結構狭いです。洞窟の代わりに使用する事は少なくともDefaultの状態では無理かもしれません。

<Fault>

Faultって何?

この場合は、過失って意味じゃないのは分かります。

形状から見ていきます。

おお、これって洞窟の作成に使えそうです。

近づいてみます。

こっちの方が洞窟に使用出来そうです。

次いでにFaultの意味も調べました。

やっぱりGeologyの専門用語としてFaultがありました。

ふーん。です。

Stata(地層)とかの専門用語も分かるようになって来ました。

そういえばNational Geographicには解説が載ってないのでしょうか?

調べてみます。

検索したら地震の話しか出てこなかったです。

<Hill>

結果です。

丘というより島って感じです。

あ、そういえばIslandも使い方が難しいですがここで使用する事が可能でした。

Islandの使用方法もここにまとめておきます。

<Island>

Islandの使用方法はKlaus氏のTutorialのHow To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [8]に詳しく解説されています。

これをそのままここにまとめ直します。

Islandノードを配置します。

結果です。

真っ黒い板が現れました。

それだけです。

何これ?状態です。

次にIslandノードのPropertiesにあるEdit Islandを押します。

すると以下に示した様な画面が現れます。

この画面上に上から見た島の大体の形状を書き込みます。

青が私が書き込んだ絵です。

灰色が実際に生成された絵でこの形状はIslandノードの他のParameterによって決定されます。

これでOKなので今度はClose Editorを押します。

結果です。

全然3Dじゃないです。

ここから更に加工が必要です。

まずIslandノードを右Clickして

Show asを選択してTerrainを選択します。

以下の様になりました。

Klaus氏によるとたまにならない時があるそうです。

その時は別なNodeを一端選択してこのNodeに戻るとこの状態になると言っていました。

Small Tip(豆知識)ですね。

この状態でもまだ使用出来る感じではないです。

次にDistanceノードをつなぎます。

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

今度はDistanceノードのShow asの設定をTerrainに変更します。

結果です。

あれ、Klaus氏のTutorialでは綺麗な島がこれで形成されたんですけど。

あ、別なNodeを選択してもう一回Islandノードを選択してみました。

結果です。

島が形成されました。

これがIslandノードを使用した島の作成方法です。

かなり複雑なんで基本的なNodeからは外しました。

6.2 Displace、Fold、CarverなどのNodeを使用して基礎の地形を大きく変形する

Displace、Fold、Carverノードはどれもあまり使用した事がないです。それぞれの変化を確認します。

<Displace>

Default値ではあんまり大きな変化はないですね。

前に勉強した時はどのように使用したのか調べます。

2023-02-01のBlogで使用していました。

読みましたがParameterの機能を公式のサイトで調べただけでした。

<Fold>

Foldです。

結果です。

結構、変わりました。

FoldノードはLook Dev GroupのNodeであんまりTerrainを大きく変形させるNodeとは思っていませんでしたが、Displaceノードより全然変形させます。

Foldノードについては2023-02-06のBlogにまとめられていました。

このBlogのFoldノードに関するまとめは以下の解説が表示された事と

Look Dev Groupに属しているのにTerrainを大きく変化させる事の2つが述べられているだけでした。

National Geographicの記事でFoldを説明したものが無いか探します。

Fold Mountain [9]がありました。

Fold Mountainと言っていますが、Gaeaで言うところのFoldと同じ意味でしょう。

これ文章の説明も分かり易いですが以下のVideoの解説が段違いに分かり易かったです。

良く日本では地震の説明で、以下のような2枚のPlateが重なっている絵が登場します。

大体こんな感じで、説明されます。

向かって左側のPlateは下に潜っていきますから右側のPlatはそれに引きずられて下に移動します。

そして右のPlateが一気に元の位置に戻る時に、地震が起きます。

これ。

これって小学生の頃から疑問だったんですが、右側のPlateの存在です。

向かって左側のPlateは下に潜っていきますから問題ないですが、右側のPlateは左側のPlateに阻まれて潜る事が出来ない訳です。

右側のPlateだって押し込まれているじゃないですか。そのエネルギーがどこに消えているんでしょうか?

なんと。この小学生からの疑問を解決してくれました。

以下の様になるそうです。

そりゃそうだ。

だって押してくる力の逃げ場がないんだから。

この右側のPlateがグニャと歪んで出来た山の事をFolding Mountainと言うそうです。つまりこの歪みがFoldingだったんです。

よし。Foldingも理解しました。

後この変形は綺麗なのでこれを採用する事にします。

<Carver>

一応、Carverノードの変化も確認しておきます。

結果です。

Carverノードもかなり大きな変化をします。

2023-02-06のBlogに以下の解説がありました。

流石にCarverと言う言葉はGeologyの言葉には無いですね。

これはこれで大きな変化を追加します。

今回はFoldを採用する事にします。

6.3 Apertureノードを使用して縁を調整する

結果です。

Terrainで尖っている部分が削れて平になりました。

6.4 表面をLookDevで調整する

まずSurfaceノードを追加してTerrainの表面を細かくします。

更にShearノードを追加して、表面を更に細かくします。

このSurfaceノードとShearノードの組み合わせが良い感じです。

6.5 噴火や隕石の落下などの天変地異を起こしTerrainを破壊する

SwirlやWarpノードを使用します。と書かれているのでWarpノードから試してみます。

Warp

Warpノードを使用します。

WarpってBend out a Shape。つまり滅茶苦茶怒るって意味でした。

うーん。

その割にはあんまりTerrainが変化していません。

仕方ないです。Parameterを弄ります。

NoiseのSizeとStrengthの値を以下のように変更しました。

結果です。

おお、Terrainが滅茶苦茶になりました。

更にCanyonizerを追加してCanyonを追加します。

結果です。

良い感じです。

これで行きます。

<Swirl>

これはAndrea Cantelli氏のTutorialで散々使用したので今回はPassします。

6.6 時間が経ってTerrainが変形する

まずはApertureを使用して縁を平にします。

結果です。

尖っている部分が平になりました。

6.7 平地の部分のTerrainを作成する

Ridgeノードなどを使用します。と書かれていますが、それ以外のNodeも調べる事にします。

Geo Primitive GroupにあるNodeで平地の部分に使用出来るNodeは全部、調査してまとめたと思ったんですが無かったです。

ここでやる事にします。

<Badlands>

荒地って意味でしょうか?

こんな感じです。

これ平な部分がありますね。平地のTerrainを追加するにはあんまりふさわしくないNodeかもしれません。

<Crater>

結果です。

Craterって何の事か思ったらクレーターの事でした。

隕石群が降り注いだ後ですね。

地球だと思ったら月に居た。とか色々使えそうなNodeです。

<Dunes>

まず結果から示します。

何か砂浜見たいですね。

Dunesノードの解説です。

まずDunesの意味を知りません。調べます。

砂丘の事でした。

成程。

砂丘だと分かると後は特に疑問もないですね。

<Sand>

せっかくなんで次はSandノードを見ます。

Dunesとどう違うんでしょうか?

こっちの方が目が細かいです。

Sandノードの解説です。

これ読むとSandの方がDunesと比較して小さいのが特徴のようです。

それだけの違いみたいですね。

<Igneous>

Igneousの意味です。

溶岩が個体化した形状を示しているようです。

全体的におとなしい変化しかないです。あんまり溶岩の感じはしないです。

<Plates>

これはさっきFoldの所で散々勉強したPlateじゃないですか。

ナニコレ?

これがPlateなの?

この盛り上がっている所がPlateが衝突した所なんでしょうか?

よく分かりません。

このNodeは平地に使用するには激しすぎます。

<Range>

結果です。

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

Rangeって山に関係する用語だったんですね。

調べるとRangeとBasinが相互関係にある存在でした。

色々な図で解説していますが、一個だけ選びました。

https://gotbooks.miracosta.edu/geology/images2/extension.jpgより

尖っている部分がRangeで凹んでいる部分がBasinです。

RangeのImageをもう一回見ると確かに尖っている部分と凹んでいる部分がありますね。

<Ridge>

解説です。

Ridgeは山の尾根の部分を意味しているはずです。

あんまりそんな感じはしませんね。

<Rocky>

解説です。

結果です。

うーん。

確かに岩々した地面を作成しています。

ただこれって実際の地形ではどのような時に生成されるのかが不明です。

<Slump>

解説です。

SlumpedはCollapsedと言う意味だそうです。

確かに凹んで平らになっています。

<Worselands>

解説です。

Ruggedは壊れたと言う意味でした。

結果です。

8.8 Combineノードで平地とそれまで作成したTerrainを合成する

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

全部のNodeで試しましたがSandノードが一番きれいに平地に形状を追加しました。

Combineノードの設定です。

こんな感じです。

うーん。

雰囲気が出て来ました。

8.9 LookDevを使用してTerrainの表面を仕上げる

あんまり砂の表面に変化を与えたくないので軽く掛けます。

Surfaceを掛けました。

うーん。

もうかなり良い感じです。

8.10 最後にErosionを追加する

最初はErosionかWizardノードを追加して終わりにしようと思ったんですが、気が付いたら以下の様なNodeを組んでいました。

BreakerとHydroノードで亀裂を追加し、Thermalで亀裂の下方にDepositが溜まるようにしました。

結果です。

以下に示した様に岩の間に砂が積もっている感じが出ています。

一応、望んだ形状が作成出来ました。

6.11 更に最後にMicro Erosionノードを使用して表面を仕上げる

MicroErosionノードを追加しました。

以下に示した様に細部が追加されました。

これで完成です。

6.12 独自の手法に基づいてTerrainを作成した感想

先週完成した以下のTerrainを作成するための手順

に基づいてTerrainを自分で組んでみました。

その結果がこれです。

かなり凄いTerrainが作成出来るようになった気がします。

後は、Geologyの専門用語なんかを覚えて、それぞれのNodeの関連をもっと詳しくなったら更に凄いものが作成出来そうな気がします。

このやり方は守破離で例えると守の段階で、まだ右も左も分からない初心者向けの手順として作りました。

でその初心者である私自身が使用してみたら、もう驚愕の結果が出て来ました。

これで一つの完成として良いと思いました。

この手順で一つだけ疑問に思ったのが、平地を合成した後で、Look DevやErosionを使用する所です。

SandやDunesを平地に使用した場合、Look DevやErosionを使用して平地にそれ以上の変化を加えると見た目が悪くなる気がしました。

平地にWorselandsなどを組んだ場合はその後でLook DevやErosionを使用した方が、全部を一括して見た目を良くするので統一感が出て良いかもしれません。

この辺はCase by Caseでやり方を変更した方が良いかもしれません。

この次のStepとして考えているのが、Combineノードなどをもっと多様して雪山やCanyon、砂漠、湖などを一個のTerrainに含ませる事です。

その一つの例としてMountainとFaultを組み合わせて山と洞窟のあるTerrainの作成とかも考えています。

今週はこれでGaeaの勉強はお終いです。

来週はまたAndrea Cantelli氏のTutorialに戻ります。来週からGaea Tutorial for Beginners #6 | Texturing our first terrain [10]を勉強する予定です。

7.Houdiniの勉強

先週は公式のTutorialであるFOUNDATIONS | OVERVIEW [3]のSelect Geometryの途中まで勉強しました。

7.1 Select Geometry

先週は以下の所で、もう理解出来なくなったので終了します。

となっています。

でも今、読み直したんですがこれ理解する必要どこにも無いですよね。

続きをやっていきます。

Shiftを押しながら選択すると以下の様に追加で別な箇所を選択する事が出来ます。

これはまあどのSoftでも同じです。

Ctrlを押しながら選択した箇所を選択するとその部分が非選択になります。

これはまあSoftによって違いますが、例え忘れたとしてもCtrlかAltをまず試すので問題ないです。

Scene Viewの上部のIconの内、以下のBoxを選択して

どこのFaceでもいいのでその上でDouble Clickします。

すると全部が選択されます。

Nを押しても同じだそうです。

Nも試してみます。

同じじゃないです。

Double Clickした時はそのGroupに属しているFaceが全て選択されましたが、Nを押した時はObject全てのFaceが選択されました。

今度はScene Viewの上部のTool Barにある以下のIconを選択しました。

これ今気が付いたんですが、以下の3つのIconって

GeometryのPoint、Edge、そしてFaceを表していました。

PointとEdgeはまあ分からなく無いですが、最後のFaceのIconは何なんでしょう。

このIconがFaceを表しているって全く想像出来ないです。

Edgeを一個選択した状態でDouble Clickすると

Loopを選択します。

これはあれDouble Click繋がりで紹介したんでしょうか?

こういう操作って結局忘れてしまいます。

さらにこんなに詰め込まれて教え込まれる訳ですから、更に忘れてしまうんですが、一回勉強しておくと、後で何となく思い出したりするので全くの無駄ではないです。

でもまあ凄い退屈である事は確かです。

Blenderの勉強を去年した時も、一か月くらいEdgeのLoopの選択方法を繰り返したりしていましたが、もう完全に忘れました。

EdgeのLoopを選択出来るとどんな得があるのかが分からないので、結局この操作方法を覚える気にならないんです。

そういう訳でこういう操作方法はサラッとやって先に進む事にします。

Nodeを組むようになったらこっちのものです。そこに辿り着くまでは、我慢してやっていきます。

今度はFaceでLoopを選択する方法です。

Scene View上部のSelect PrimitivesのIconを選択して

HoudiniではFaceの事をPrimitiveって呼ぶんですね。これからはPrimitiveと言います。

ここでFace、いやPrimitiveを一個選択します。

ここでEdgeでやったようにDouble Clickすると

当然ながらこうなります。

Loopを選択するためにはこの状態でMouseの真ん中のButtonを押すそうです。

試します。

何の変化も起きません。

あれ?

Tutorialを見直します。

分かりました。

まずLoopをしたい方向に一個か二個ずれたPrimitiveの上にMouseを移動させAを押します。

すると以下に示した様な水色のLoopが表示されます。

この時にMouseの真ん中のButtonを押します。

すると以下に示した様にPrimitiveのLoopが作成されます。

以下に示した様にShiftを上手く使うと2重のLoopを選択する事も可能です。

今度はObject以外の場所にCursorを移動した状態で右Clickして以下のBoxを表示させます。

そのBox内からConvert Selection toを選択してPoint Selectionを選択します。

すると選択した箇所がPrimitivesからPointsに変化します。

今度はPointを一個だけ選択した状態で

Scene Viewの左側のTool Barの以下のIcon、Moveを選択します。

この状態だと一個だけのPointを自由に動かす事が出来ます。

この状態だとScene Viewの左下に以下のBarが表示されています。

このBarを弄ると

選択したPointの周りのPointもそれなりに影響を受ける事になります。

Move Modeは以下に示した様に独自のTool Barが表示されます。

その中から以下のIconを選択しました。

このIconを選択すると

Pointを選択した時はPoint Modeに自動で切り替わります。

Edgeを選択した時はEdge Modeに切り替わります。

当然、Primitiveを選択したらPrimitive Modeに切り替わります。

凄いけどこんなの絶対忘れます。

これでSelecting Geometryはお終いでした。

お終いなんだけど、私が今すっごい気になっているのが以下に示したNetwork PaneにあるEdit1です。

これ外したら、Tommyのたんこぶは直るんでしょうか?

なんかそんな気がします。

試してみます。

Yを押しながら線を横切る事でEdit1とTestGeometry_Tommy1の接続を切りました。

結果です。

やっぱりTommyのたんこぶが無くなりました。

思った通りでした。

短いんですが、正直もう勉強したくなくなってしまいました。

Houdiniの勉強はここまでとします。

8.Volumetric Cloudの勉強

先週は、M_VolumetricCloud_03は雲を発生させる事が出来ない事が分かってShockを受けてしまってそこで作業が止まってしまいました。

あれから色々考えましたがとりあえずはM_VolumetricCloud_02_Profiles_PaintCloudsに注目して作業をする事にします。

今週は以下の事をやります。

  • M_VolumetricCloud_02_Profiles_PaintCloudsのParameterの調整
  • M_VolumetricCloud_02_Profiles_PaintCloudsの雲を移動させる
  • M_VolumetricCloud_02_Profiles_PaintCloudsで雷を発生させる

8.1 前文の代わりに

UE5のTipを紹介しながらこういう話をYouTubeではしていこうと思っているので、ここに書きます。

まあ去年までやっていた前文みたいな内容です。

<Section 230とYouTube について>

これって、アメリカでは凄い大きなNewsになっているのに日本では全く紹介されていません。

このNewsに関して私は言いたい事があるんですが、日本だとこのNews自体が全く知られていないんです。

のでこれがどんな話なのかをまず紹介します。

そしてそれに対する私の意見を述べようと思います。

Section 230とはYouTubeなどのInternetで第三者がVideoなどを公開出来るためのServiceを提供する人が、その公開された内容に対して責任を持つ必要がない事を保証する法律です。

分かり易い例えを示します。

YouTubeで違法にワンピースの映画がUploadされたとします。

それの責任はその動画を上げた人が全部持つ事になります。東映はその動画を上げた人を著作権違反で訴える事は出来ますが、YouTubeを訴える事は出来ません。

いやYouTubeを訴える事は出来るかもしれませんが、裁判では100%負ける事になります。Section 230によってYouTubeはその著作権違反に対して全く責任がない事が保証されているからです。

ところが、ISISのテロによって殺された被害者の家族が、ISISの宣伝動画をYouTubeが載せていたのだからYouTubeにも責任があると訴えていた件で、日本の最高裁判所にあたるSCOUTが、Section 230があるにも関わらずYouTubeにはISISの動画を乗せていたんだから責任があると判決を下したんです。

もうアメリカは大騒ぎです。

その判決が出た次の日にYouTubeのCEOは辞任しました。

それぐらい驚きの判決だったんです。

これからYouTubeはどうするのか?

YouTubeは多額の賠償金を負わないようにするために、Userが上げる動画に対して、ものすごい検閲を課す可能性が高いです。

そうなった場合Internet上に言論の自由が残るのかどうかとか、凄い議論が巻き起こっています。

女性の中絶を禁止するかどうかはその州が決める事みたいな、今までの判例を平気で無視して新しい判決を下す今のSCOUTがまともに機能しているのかどうかはおいておいて、この件に対しては私の意見は大多数のアメリカ人の意見と違って今回のSCOUTの判決は正しいと思っています。

それは何故かという事をここで説明します。

まずSection 230が有ろうがなかろうが、基本的には上げた動画の責任は動画を上げた人が負うのは当然です。

その上で動画をInternet上で見る事が出来るYouTubeのようなServiceを提供する所がその責任の一端を負うのかどうかですが、これはSection 230がある以上、負う必要はないはずです。

ここまでは、私の意見もみんなと同じです。

しかしみんながこの問題を考えるに当たって考慮する必要があるのに、忘れている事が一つあるんです。

それはYouTubeのお勧めを表示するAlgorithmです。

これ、見たいものが完全に個人の嗜好に依存している場合は非常に優秀です。

例えば、私の場合、UE5のLandscapeのDisplacementに関する動画が見たい。みたいな場合、本当にピンポイントでそれに関係する動画をお勧めで進めてくれます。

しかし、物事には相反する意見が混在するものもある訳です。

例えば、マスクです。

マスクをした方がコロナの感染を防ぐからマスクした方が良いと言う人と、マスクはしても無駄と言う人がいます。

これをマスクはしても無駄と思う人が、同じような意見を言う人ばかりお勧めに出てきたら、ほらやっぱり俺の思っている事は正しい。となるに決まっています。

大体、相反する意見があった場合、普通の人なら、別々な立場の人達が三人位、ある一方の意見を主張しているのを聞いたら、そっちの意見が正しいのかと思うようになります。

これはある意味、体感統計学とでも言うべきで、相反する意見に対してどちらが正しいのかを判断するのに、色々な立場の人から無作為に3人選んでその人達の意見が全部同じだったらその意見が正しい。と普通の人が思うのは当然です。

ところが、YouTubeのAlgorithmはこの無作為に3人選んでいるように見せかけて、ある一方的な意見のみが抽出されるようにしていたんです。

80%の人がマスクをした方がコロナに感染しない。と思っていて20%の人がマスクは無駄と思っていたとしても、その20%の人達だけの意見を抽出して聞かせ続けたら、普通の人だったらマスクをするのは無駄かもしれない。と思うようになります。

これはYouTubeにも責任があるでしょう。

先程のISISの宣伝動画に関して言えば、ISISがイスラムが欧米から差別されている。戦ってイスラムを守ろう。と言う動画を一個見て、良いねボタンを押したら、その動画ばっかりお勧めに出て来るようになるわけです。

その時に、お勧めにISISに入ったら奴隷のように扱われて逃げる事も出来ないとか、イスラムを迫害している欧米がイスラムの権利を主張する言論の自由を守っているよね。とかの相反する意見も一緒にお勧めに出てきたら、普通の判断力のある人だと、あれISISって本当はオカシナ組織なんじゃない。と気付ける訳です。

これ、普通のAlgorithmだったらそういう相反する問題に関しては、その意見に関して述べている色々な意見を無作為に拾ってその視聴者が自分の考えを構成する手助けになるはずです。

しかしYouTubeはそういう時も一部の極めて極端な意見だけをまるでその意見が一般的であるかのように勧めるAlgorithmをずっと維持している訳です。

のでISISのようなテロ組織でも嘘にまみれたプロパガンダを流す事でどんどん新人をリクルート出来た訳です。

この部分に関して私はYouTubeの責任だと思っています。

8.2 M_VolumetricCloud_02_Profiles_PaintCloudsのParameterの調整

Volumetric Cloudを扱うに当たって最低限知っておくべきParameterを2023-01-22のBlogで簡単にまとめましたが、この時参考にした資料に公式のDocumentであるVolumetric Cloud [11]を含めるのを忘れていました。

のでまずVolumetric Cloud [11]を勉強します。

その上でVolumetric Cloud [11]で使用しているParameterと2023-01-22のBlogでまとめたParameterを比較検証し、それらのParameterが重要で絶対勉強すべきかどうかを判断します。

その後で最低限絶対覚えておくべきParameterを使用する事で、M_VolumetricCloud_02_Profiles_PaintCloudsがどう変化するのかを検証します。

Volumetric Cloud [11]を勉強する>

<<Volumetric Cloud Component>>

ここを見るとかなり大量のParameterを紹介しています。

多すぎて一つ一つの紹介をするのは不可能です。

後で、2023-01-22のBlogでまとめたParameterと比較してどれを勉強するのかを決定します。

あ、こっちじゃなかったです。

公式のDocumentでVolumetric Cloudの紹介しているのはVolumetric Cloud Component [12]でした。

こっちの勉強をします。

Volumetric Cloud Component [12]を勉強する>

まず軽く全体を読みました。

結構内容が濃いです。後、色々言いたい事がある内容でした。

これはかなり長いまとめになりそうです。

ので別な節でやる事にします。

8.3 Volumetric Cloud Component [12]を勉強する

<Intro>

最初の文でVolumetric Cloudはmaterial-driven approachだと言っています。

これ完全に何かの専門用語ですが、Game関連のDesignerが使用する用語じゃないです。

多分、Computer ScienceのGraphics分野で使用されている専門用語でしょう。

Googleで検索しましたが、この用語を正しく解説しているサイトが紹介されませんでした。

うーん。

困った。

Chat GPTに聞いてみました。

成程。

これ読むと、material-driven approachはComputer Scienceの3D Graphics分野の専門用語と言う訳ではなく、Systemや商品を開発する時に、あるMaterialが最初にあってそのMaterialの特性を生かした商品を作成していく場合に用いられるビジネス用語のようです。

いや、Chat GPT凄いです。

後、数カ月したらBingでChat GPTが使用出来るようになるそうです。

そうなったらDefaultのBrowserはEdgeに切り替えます。

兎に角、この文の意味が分かりました。

Volume Renderingが先に合って、その後でこの技術は雲の生成に使えるから雲を作成したという事です。

これ日本語の方はどのように訳しているんでしょうか?

気になります。

日本語訳の方を見てみました。

マテリアル主導型アプローチと訳していました。

これってそういう日本語の専門用語あるんでしょうか?

Googleでマテリアル主導型アプローチで検索してみます。

出て来ません。

そんな日本語は存在しませんね。

日本において商品を設計するための手法としてMaterialの特性を先に考えるなんで発想自体ないんでしょうね。

いやそういえば、もう何年も日本企業が何か新しい製品を作成したって話聞かないです。

もう商品開発なんてやってないんでしょうね。

この専門用語に対応する日本語が無い事から、日本の技術力の落ち目が感じられて、なんか哀れです。

<How are clouds rendered?>

ここで大事なのは以下の文です。

three-dimensional volume texture that is ray-marched

つまりVolumetric Cloudは以下の技術を使用しているって事です。

  • Ray Marchを使用している
  • Volume Textureを使用している

これって結構最新の技術だと思います。

私がVolume Renderingを習った時は、Ray MarchingをしてVolume Renderingで作成したObjectに影を出す技術はかなり最先端で論文でしか読んだことなかったです。

つまり今までどのGameにも使用されていない最新のRendering技術がUE5ではだれでも簡単に使用出来る事になったって事です。

おお。

更に以下の解説がありました。

ただ最新のRendering技術だから導入したんじゃなくて、この技術はDesignerやArtistの人達が望んだ雲を自由に作成出来るからあえて導入したとありました。

まあ社交辞令でしょう。

<Ray Marching the Cloud Volume>

Ray Marchingについての解説をするのかと思ったら違っていました。

元々Ray Marchingを雲に対してして行い、雲の中の光の反射や影などを計算するのをReal timeで行うのは不可能でした。

それを最新の技術で可能にしました。

更に、もっと改良してそんなに凄いPCじゃなくてもRay Marchingを使用したVolume Cloudの作成をReal Timeで出来るようになったよ。

という話でした。

凄い。

<Light Multiple Scattering>

まずMultiple scatteringが何なのかについて解説しています。

光が水滴などのParticleに衝突すると散乱(Scattering)します。この現象をMultiple Scatteringと言うそうです。

これってSingle Scatteringだと思うんですが、

どうなんでしょう。

この後の雲の例だとMultiple Scatteringになると思うんですが?

それは兎も角として、

次にこのMultiple Scatteringが雲の中で起きた場合について解説しています。

雲の中の水滴は、決して光を吸収しないで、ほぼ100%散乱(scattering)するそうです。

ので雲の中で光は減衰せず、散乱(Scattering)を繰り返す事になります。

この結果、以下の事が起きます。

  • 雲全体が白く見える
  • 雲全体が厚く見える

そしてこの散乱(Scattering)を繰り返すせいで、実際の雲の中の光の移動を計算する事がものすごく難しくなります。

はい。

じゃどうしたのかと言うと、雲の中の光の透過率(のOctave)をトレースする事で実際の散乱(Scattering)の近似値を計算するそうです。

当然ですが、トレースする回数が多いほど、本当の値に近づきます。

Volumetric Advanced Material Outputは、このトレースする回数を指定します。

因みにGameでは0か1を使用すべきと書いていました。

Volumetric Advanced Material Outputって

これの事でしょう。

これのどこでトレースする回数を指定しているんでしょうか?

これですわ。

後、このParameter、Ben Cloward先生の所で勉強した記憶があります。

検索して調べたら2022-08-22のBlogで勉強していましたが、Ben Cloward先生のTutorialじゃなくてWorldofLevelDesignのTutorialでした。

でも大した事は書いてなかったです。Octaveの意味が分からないと理解出来ないとか書いてないです。

Octaveは単なる計算方法なので、Octaveを一つの計算の塊と理解すれば、ここでは十分です。

<Cloud Occlusion and Shadowing>

雲のOcclusionと影は以下の2つ要素によって決定されるそうです。

  • Atmosphere Light
  • Volume Could に使用されるMaterial

まずAtmosphere Lightって

そんなActor無いんですが。

Sky Atmosphereの事でしょうか?

後ここで言う影とは雲によって形成される影の事だそうです。

この影を計算する方法は2つあって

  • Ray Marched
  • Beer Shadow Maps

だそうです。

これどちらかを決定するためには、先程のVolumetric Advanced Material Outputにある以下のParameterを

EnableするとRay Marched、DisableするとBeer Shadow Mapsになるそうです。

いや、

これは絶対Ben Cloward先生のTutorialで勉強しました。

はっきり覚えています。

探し出しました。

2022-07-18のBlogで勉強していました。

あれ、こっちでは雲の中の影を作成するって言っていました。

どっちが正しいのか分かりません。

今、いたずらにこの解答を追い求めても理解出来ない事が増えて更に混乱する事態になると思いますので、今は謎のままにしておきます。

この辺は今後の勉強で明らかになるでしょう。

慌てず勉強する事にします。

OpenGLでVolume Renderingを勉強した時は、魚のCT ScanとかをRenderingしていましたので、雲のようなVolumeをRenderingした事はないんです。

いずれはDirectX 12を使用して直接、雲を作成して生のHLSLでこれらの機能を実装したいです。

あ!

突然理解したんですが、この公式のDocumentであるVolumetric Cloud Component [12]の内容をBen Cloward先生は2022-07-18のBlogで勉強したTutorialで解説したみたいです。

成程。

点と線が繋がって来ました。

と言うと、このVolumetric Cloud Component [12]の内容は一応は勉強済みではあるという事です。

<Directional Light Interactions and Shadowing>

先程、Atmosphere Lightって何を指しているの?と言いましたが、ここに書いてありました。

Atmosphere Lightは、Atmosphere中の光を管理する太陽光や月の光を指しているそうです。

そしてそれらを管理しているのは当然Directional Lightです。

Directional Lightの以下のParameterについての解説です。

ここでCast Shadows on CloudsとCast Shadows on Atmosphereは要らない機能です。

ので大切なのはAtmosphere Sun LightとCast Cloud Shadowsだけです。

まずCast Cloud Shadowsですが、これは雲の影を地面に投影します。後God Rayも形成するそうです。

Atmosphere Sun Lightは、

これDefaultで設定されていて気にした事無かったです。

Documentの解説を読んでも何も分からないです。

いつもの解説を見たら以下の説明が表示されました。

うーん。よく分からない。

試しにDisableしてみました。

はい。

真っ暗になりました。

そういう事か。

Directional LightがAtmosphereと干渉しなかったら当然真っ暗になります。

<Real Time Sky Light Capture>

これはSky LightにあるParameterです。

これをEnableにすると他の空を形成するActorの値も考慮してSky Lightを計算する事になります。

それ以上は知りません。

<Sky Lighting Cloud Ambient Occlusion>

Sky Lightにある以下のParameterについての解説でした。

これ色々難しい解説をしていますが、簡単に言うと雲の底の影を濃くします。

ここでVolumetric CloudのParameterの解説が終わりました。

今週のVolumetric Cloudの勉強はここまでにして今日勉強した内容をまとめます。

8.4 Volumetric Cloud Component [12]のParameterの紹介の部分を勉強した感想など

まずここで紹介されたParameterは全部、勉強済みです。

これまでVolumetric Cloudの勉強でまとめたParameterで既に勉強したParameterです。

ここで紹介されたParameterはBen Cloward先生がVolumetric Clouds - Building Worlds In Unreal - Episode 32 [13]で説明してくれていました。

今週はParameterの部分だけしか勉強出来なかったです。

もうやる気が出ません。

今週は更に以下の事もやる気だったんですが、もう疲れてしまいました。

YouTubeに動画を上げるつもりならもっと映像として映える事をする必要があります。

こっちをもっと頑張るべきですね。

特に雷の発生方法とかが分かったらかなり映像として映えます。

来週はこっちを頑張ります。

Lightningの実装があるのはM_VolumetricCloud_02_Profiles_PaintClouds_Morningです。

他のMaterialにもあるのが有るかもしれませんが、今週見つけられたのはこれだけです。

来週の勉強の足しにします。

9.DirectXの勉強

9.1 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [4]の最後の部分

これ見たら何もしていませんでした。

ので次の動画の勉強をします。

9.2 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [14]を軽く全部見る

今週はTutorialを見て全体の構成を理解します。

<Intro>

ここではDirectXを使用出来るGame Engineを作成します。と言っています。

いや、今まで作成しているのがそれじゃないのか?と突っ込みたくなってしまいますが、どうもGame Engineの定義が私の思っているのと違うみたいです。

このTutorialではGame Engineとして活動する新しいProjectを追加するそうです。

今まで作成したProjectはGameを作成するためのProjectで今度作成するProjectがGame Engine用のProjectになるという事でしょうか?

そしてDLL、Dynamic Link Libraryも作成するそうです。

これって今から作成するGame Engine用のProjectがDLLになるって事でしょうか?

今一、はっきりしませんが、まだIntroを見ただけです。

これから解明されていくでしょう。

これだけじゃなかったです。

その後でこのGame EngineのためのFrame Workの基礎の作成も行うそうです。

ここではGeneric Back End Systemを使用するそうです。

<Creating Olympus

新しく作成したProjectの設定を変更しています。

やっている事は前のTutorialで最初のProjectの設定を変更した時とほぼ同じです。

Configuration TypeにはDynamic Libraryを指定していました。

これってCompileした後のTypeがDynamic Libraryになる設定でしたっけ。

うーん。

分からん。

まあいいです。

やっていく内に分かっていくでしょう。その辺は

<An Application Interface>

ここではGame EngineとGameの2つのProgramの全体のDesignについて検討するそうです。

まず全体を軽く見てみます。

大体分かりました。

まずBlanck Projectの方でGameのFrameになるApplication Classを作成しました。

ところでこのApplication Classは全てのGameで必要になるものです。

Game EngineであるOlympusの方でInterfaceとして作成して、それをBlank Projectの方で継承した方が、毎回GameのProjectを作成するたびにApplication Classを一から作成する必要が無くなり便利になります。

のでGame Engineの方でIApplicationというInterfaceを作成しました。

こんな流れだと思います。

まあ、細かい点に関しては実際に実装する時に確認します。

<Linking Our Projects>

先程、Game EngineであるOlympus Projectで作成したIApplicationはGame ProjectであるBlank Projectから呼び出す事は出来ません。

この2つのProjectはLinkされていないからです。

ここでその2つのProjectをLinkする方法を学習します。

まず、軽く全部見ます。

見ました。

思っていたよりかなり複雑な作業でした。

後、それぞれの実装方法で一寸納得できない箇所がありました。

これは実際にやって確認してから検証する事にします。

<Finish Touches>

全部見たんですが、最初の感想は「何をやっているのかよく分からない。」です。

Game EngineであるはずのOlympus Projectの方にWinMain()関数を作成したあたりから本当に何をしているのか分からなくなってしまいました。

最後はOlympus ProjectのDLLを使用してBlank Projectを動かしていたので、Olympus ProjectがGame EngineでかつDLLである事は間違いないです。

もう一回見ます。

Blank Projectを実行したらApplication Classを開始したい訳です。

しかしBlank ProjectにはWinMain()関数があるので、実行したらWinMain()関数が実行されます。

実装を改良してBlank Projectが実行されたらWinMain()関数が実行されるのではなくApplication Classが実行されるようにします。

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

これ以上の細かい実際の実装方法についてはこの章を勉強する時に、詳しくまとめる事にします。

<The Olympus Engine>

次のTutorialで何をするかの簡単な説明がありました。

そんだけです。

<Outro>

特にないです。

9.3 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [14]を軽く全部見た感想

段々、本格的になって来ました。

こっちはDirectX 12の勉強というよりGame Engineの作成方法のTutorialって感じです。

でもそれが実装のLogicに一貫性を与えていて、色々な所で学びがあります。

これもゆっくりしっかり勉強していきます。

9.4 「DirectX 12の魔導書」の3.3.2 DirectX D12の初期化の実装をする

先週は、D3D12CreateDevice()関数のParameterにセットするそれぞれの変数の求め方を勉強しました。

これでD3D12CreateDevice()関数を実装するに必要な情報は全部得たはずです。

今週はD3D12CreateDevice()関数を実装します。

まず以下に示したD3D12CreateDevice()関数の2番目のParameterにセットするLevelのArrayを実装します。

これどこに作成すればいいのか分かりません。

Sample Codeで確認します。

以下の箇所にありました。

CreateWindow()関数の後ですね。

以下の箇所ですね。

むむ。

Sample Codeでは、LevelのArrayを作成する前にEnableDebugLayer()関数を使用していました。

これは何をしているんでしょうか?

一応調べておきます。

公式のDocumentであるID3D12Debug::EnableDebugLayer method (d3d12sdklayers.h) [15]を見つけました。

Debug LayerがEnableされるのは分かっています。Debug Layerが何なのかが分からんのです。

Remarksです。

Debug LayerはD3D12 Deviceが呼ばれる前に呼ぶ必要があるそうです。

これぐらいの情報しかないです。

Debug Layerが何なのかが分からないとこの関数が何をしているのかよく分からないです。

今度はDebug Layerについて調べます。

Direct3D 11の記事ですがDebug Layerについての解説を見つけました。

公式のDocumentであるSoftware Layers [16]です。

以下の解説がありました。

これ読むとLayerと追加するとCoreのLayerの時には無かった機能が追加されるみたいですね。

Debug Layerの解説がありました。

これを読むとDebug Layerは

  • Extensive Additional Parameter
  • Consistency Validation

の2つの機能を追加するみたいです。

うーん。大体理解しました。

この解説はDirectX 11のものなのでDirectX 12では完全に同じではないかもしれませんが、まあ大体同じと見なして先に進みます。

EnableDebugLayer()を追加しました。

あれ、Errorになっている。

うーん。

調べたらなんとSample Codeには以下の実装がありました。

EnableDebugLayer()ってこうやって使用しないといけないのか。

ID3D12Debug::EnableDebugLayer method (d3d12sdklayers.h) [15]を読み直したら以下のようにして使用して下さい。と書かれていました。

Sample CodeのEnableDebugLayer()関数内の実装とほぼ同じですね。

唯一の違いはSample Codeの以下の部分です。

この部分が何をしているのか分かりませんね。

この関数の機能を調べるのはID3D12Debug interfaceのMember Functionを調べれば良いので簡単です。

公式のDocumentであるID3D12Debug interface (d3d12sdklayers.h) [17]には

Releaseは載って無いです。

という事は単にObjectを解放しているだけでしょうね。

後、私がC++を習った時は「厳密に言うとC++にはMethodは無くて、他のObject Oriented LanguageのMethodにあたるものはMember Functionと呼ぶ。」と習ったんですが、MicrosoftのDocumentではしっかりMethodと呼んでいますね。

一応、Releaseの機能が載っている公式のDocumentのIUnknown::Release method (unknwn.h)[17]も示しておきます。

それではSample Codeの丸コピーですがEnableDebugLayer()関数の実装を追加します。

一応、追加する場所もSample Codeにあった場所とまったく同じ箇所にしておきました。

Errorが消えました。

そして今週の本題であるLevelの配列を追加しました。

うーん。

もうちょっとやりたいですが、これだけやる訳にも行きません。

今週の「DirectX 12の魔導書」の勉強はここまでにします。

9.5 HLSLシェーダーの魔導書を勉強する

今週は「2.3.4 頂点シェーダー」を勉強し直します。

更にそこで行われている実装も同時にやっていきます。

まずは以下の実装をSample.fxに追加しました。

実行します。

以下の三角形が表示されました。

全てのVertexの値が2倍に変更されています。

今度は以下の設定に変更します。

はい。

以下の様になりました。

ここはVertex Shaderで頂点の位置を変更出来る事が理解出来たら十分だと思います。

ので細かい事が気にしないで先に進みます。

ここから「2.3.5 入力頂点構造体」に入ります。

入力頂点構造体!

これ英語でなんて言うんでしょうか?

成程。日本語で勉強するとそれぞれの専門用語も日本語になってしますのか。

これは面倒です。

Deep Lで翻訳したらinput vertex structureと出て来ましたがGoogleでinput vertex structureと調べるとDirectX 10の話しか出てこないです。

うーん。

要は以下に示した様なVertex ShaderのParameterにパスするためのStructの事を指している訳でしょう。

何故か、DirectX 12のHLSLの情報が検索に全く引っかかりません。

Chat GPTにDirectX 12で三角形を描くCodeを作成してもらってそのVertex Shaderを表示してもらいました。

ここでは入力頂点構造体として使用されているStructの名前はVertexInputになっています。

このVertexInputを専門用語では何と呼ぶのかと聞いたら、Vertex FormatとかVertex Declarationと呼ぶと答が返ってきました。

しかしこれらの用語で検索してもあんまりそれっぽい結果は帰って来ませんでした。

うーん。

分からん。

ここはHLSLのStructの書き方という入力頂点構造体の意味よりはより一般的な意味で解釈して次を読む事にします。

この後、HLSLにある一般的なStructが紹介されています。

それらのStructを使用して作成する入力頂点構造体は、Semanticを使用して入力頂点構造体内で使用されるStructが何に使用されるのかを定義しています。

この教科書のSampleでは

が使用されていますが、UVやColorなどの他のSemanticも知りたいです。

調べます。

これはすぐ見つかりました。

公式のDocumentであるSemantics [18]に一覧表がありました。

こんな感じでした。

お、UVを指定するSemanticはTEXCOORD[n]ですね。

これは教科書にも載っていました。

SV_Positionが無いじゃん。

下の方にありました。

最初の方の説明はよく分かりませんね。

Shaderで使用される場合は、Pixelの場所を示す。とあります。

うーん。

これに先程のPositionの値を代入しているのか。

先に教科書の「2.3.6 出力頂点構造体」を読む事にします。

ここでは出力DataとしてPositionを指定する時はSV_Positionを使用する必要がある。と簡潔に書かれています。

入力はPosition、出力はSV_Positionと覚える事にします。

それ以上は後で、もっとHLSLの理解が進んでから勉強する事にします。

以上でした。

Semanticについてはまあ理解出来たと思います。

9.6 「Direct3D 12 ゲームグラフィック実践ガイド」の「2.3 Direct X 12の初期化処理」を勉強

先週のBlogを読み直したら「2.3 Direct 3D12の初期化処理」の変数の追加の部分は一応全部終わっていました。

今週はその続きの関数の追加を行います。

うーん。

ここでもMember Functionと呼ばずにMethodと呼んでいますね。

それぞれのMember Functionを追加しました。

まずはInitD3D()関数の実装からやるそうです。

InitD3D()関数では以下の事を行うそうです。

Pocol. Direct3D12 ゲームグラフィックス実践ガイド (p.134). 株式会社技術評論社. Kindle 版.

おお。

やっとDirectX 12らしい勉強になって来ました。

先週までの理解が正しければCommand Queueとかの生成にD3D12CreateDeviceを使用するはずです。

その辺の確認も楽しみです。

SwapChainは何をするための変数なのかまだ分かりません。

次のCommand Allocatorも先週、初めて知った変数でその目的は不明です。

Command Listは理論や機能は散々勉強しました。

以下の図のヤツです。

Render Target Viewはよく分からんですが画像を先に生成して貯めておくBufferみたいなもんでしょうか?

最後にFenceを生成しています。

Fenceも一応は既に勉強してはいます。今の解釈ではMulti-ThreadでいうLockみたいな機能だと思っています。

うーん。

これ見るとDescriptor Heapとかはここでは作成していませんね。

じゃ実際のCodeを見てみます。

まずはDeviceの生成です。

あ。

これはD3D12CreateDevice()関数じゃねーか。

緊張して本を読んでいてすっかりこの関数の存在を忘れていました。

はー。

先週のほとんどと今週の半分位はこの関数の勉強をしていたのに、実装見るまでDeviceの生成にこの関数を使うって思い付かなかった。

はー。

疲れているのかもしれません。

いーや。

今週はここまでにして残りは来週やる事にします。

一寸は休憩する事も大切です。

10.まとめと感想

それぞれの分野でそれなりの成果が出て来ました。その中でLandscapeの生成だけはあまり誇れた成果が出て来ていません。

DirectX 12の勉強なんか、これ何時になったらDirectX 12の勉強が始まるの?って感じで、ずっとWin32を使用してWindowの生成を行っていましたが、とうとうDirectX12の勉強が始まりました。

今年の2月までの成果をまとめるとLandscapeの作成以外は順調と言ったところです。

話は変わりますが、Volumetric Cloudの所で書ききれなかった話があるんでそれをここにまとめる事にします。

物って生活必需品と贅沢品に分けられるじゃないですか。

最近、実は情報も生活必需品と贅沢品に分けられる事に気が付いたんです。

知っていると得だけと知らなくても問題ない情報と絶対知らないといけない情報があるんです。

絶対知らないといけない情報は生活必需品のように扱われます。その逆に知っていると得だけと知らなくても問題ない情報はまるで贅沢品のように扱われます。

そして生活必需品に当たる情報はどんな労力を払っても(たとえお金を払っても)人は手に入れようとするんです。

この生活必需品に当たる情報を発するYouTube Channelは再生回数がとんでもなく多くなるんです。

それに対して贅沢品に当たる情報は、無理してまで手に入れようとはしません。これを発しているとみなされたYouTube Channelの再生数はその質が高くてもかなり低くなります。

はい。

そしてGameをPlayするって贅沢品的情報に当たるんです。

つまりほとんどの人はGameをPlayする必要はないんです。

ところがGameに関しての情報は生活必需品的情報なんです。

  • そのGameがどれくらい流行っているのか?
  • そのGameが話題に出た時に、どんな事を知っている必要があるのか?
  • そのGameが社会からどんな受け止められ方をされているのか?

こういう情報はほとんどの人にとって生活必需品的情報に当たります。

だからGameをPlayする動画って再生数低いでしょう。それに対してGameについて語っている動画は再生数が異常な位高くなります。

これって突き詰めるとGameって買う必要ないんです。買ってもいいけど絶対買わないといけないものではないんです。

それに対してUE5で作成された現実と区別のつかない映像を見る事は生活必需品的情報に当たるんです。

「あのUE5で作成された映像、凄かったよな。」みたいな話題についていくために、UE5で作成された映像は絶対見る必要がある生活必需品的情報になるんです。

だからあのUE5で作成された駅の映像は凄い再生された訳です。

でそれを分かったうえで、UE5でGameを作成しますか?

それよりUE5で映像作った方が良いんじゃないですか?

って事をまとめておきたかったんです。

この話、忘れそうなのでここに書いておく事にしました。

11.参照(Reference)

[1] CGHOW. (2022b, December 27). Sprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=U1uLVV979xE

[2] Ben Cloward. (2022b, October 20). Snowy Rock Shader - Advanced Materials - Episode 4 [Video]. YouTube. https://www.youtube.com/watch?v=UHUJJ_nE5dQ

[3] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[4] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[5] UnrealityBites. (2022, April 28). Unreal Engine 5 - Landscape Displacement Problems [Video]. YouTube. https://www.youtube.com/watch?v=U5KNl62FEE4

[6] CGHOW. (2021, July 23). Sprite Rotation Sprite Alignment Sprite Facing | UE5 Niagara Tutorial | Download Project File. YouTube. https://www.youtube.com/watch?v=EIP6mg8V5YU

[7] F. (2022, August 5). Nanite landscape? Epic Developer Community Forums. https://forums.unrealengine.com/t/nanite-landscape/621927

[8] Klaus. (2022b, May 21). How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Obfq-Zh3iXs

[9] Fold Mountain. (n.d.). https://education.nationalgeographic.org/resource/fold-mountain/

[10] Andrea Cantelli. (2020b, June 6). Gaea Tutorial for Beginners #6 | Texturing our first terrain [Video]. YouTube. https://www.youtube.com/watch?v=d879QNdQG7U

[11] Volumetric Cloud Component Properties. (n.d.). https://docs.unrealengine.com/5.1/en-US/volumetric-cloud-component-properties-in-unreal-engine/

[12] Volumetric Cloud Component. (n.d.). https://docs.unrealengine.com/5.1/en-US/volumetric-cloud-component-in-unreal-engine/

[13] Ben Cloward. (2021, May 27). Volumetric Clouds - Building Worlds In Unreal - Episode 32 [Video]. YouTube. https://www.youtube.com/watch?v=dolfk2z4LDo

[14] OlympusMonsTutorials. (2021, March 17). C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [Video]. YouTube. https://www.youtube.com/watch?v=YgZSSE3qZqA

[15] S. (2022b, July 28). ID3D12Debug::EnableDebugLayer (d3d12sdklayers.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12sdklayers/nf-d3d12sdklayers-id3d12debug-enabledebuglayer

[16] S. (2020, August 19). Software Layers - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-devices-layers

[17] S. (2021c, June 29). IUnknown::Release - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-release

[18] S. (2021e, August 21). Semantics - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics