UE4の勉強記録

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

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

1.今週の予定

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

先週Gaeaで作成したTerrainを使用してUE5.2でLandscapeを作成し直します。

<Materialの勉強>

Render Bucket氏の以下のTutorialを勉強します。

Niagaraの勉強>

CGHOW氏のRibbon Fire in Unreal Engine 5.2 Niagara Tutorial [1]の続きを勉強します。

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

BGMを更に追加します。

<Gaeaの勉強>

Colorの勉強か、Klaus氏のTutorialのまとめを行います。

<Houdiniの勉強>

今まで勉強したFOUNDATIONS | OVERVIEW [2]の復習の続きを行います。

<UEFNの勉強>

UEFNの勉強の続きをします。

YouTube動画の作成>

Davini Resolveを使用して動画の作成の練習をします。

DirectXの勉強>

 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [3]のFinishing Touchesを勉強します。

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

2.1 先週作成したLandscapeを軽く見て回る

よく考えたら既にGaeaで作成したHeight MapをImportしてLandscapeを作成した上に、Water SystemのOceanを追加していました。

これがどんな感じなのか確認します。

PlayしてThird Personで歩いてみました。

今回はLandscapeのXYのSizeをGaeaの時のSizeと同じにしました。

そしたら以下に示した様な不自然に尖った地形は見られません。

LandscapeのScaleは以下に示した様に

普段の約5倍のサイズなんですが、逆にLandscapeの形状はこちらの方が綺麗に見えます。

今のLandscapeのSizeは以下に示した様に25km^2になっています。

良く飛び回って見るとあちこちに凸凹している箇所はありました。

しかしこれだけだったら30分位かけたら全部直せそうです。

直します。

2.2 Landscapeの凸凹を直す

Smoothの設定は以下の様にしました。

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

一寸、撫でただけですぐにSmoothになりました。

これが

こうなりました。

完成しました。

雲も直す必要がありますね。

これは後でやります。

2.3 Materialを追加する

Landscape用のMaterialは前のLandscapeで作成したのをそのまま使用します。

結果です。

かなり良いです。

上空から眺めました。

うーん。凄い。

これはかなりRealです。

Shader Complexityも確認します。

あれ、これ真っ赤じゃないですか。

あ、LandscapeをNanite化するのを忘れていました。

Landscapeを選択して以下の設定からNanite化します。

出来ました。

もう一回、Shader Complexityを確認します。

今度は負担が少なくなっています。

2.4 Water SystemのWater Body Oceanを調整する

今度はWater Body Oceanを調整します。

以下の様にSpline Pointを増やしました。

Play画面です。

遠方用のLayerがかなり近いです。

ここが海とBeachの境界です。

よく分かりませんね。

Sea Layerの色を水色にしました。

これで境界をもっとしっかり作成します。

どんな感じかPlayして確認します。

Water Body Oceanの位置は以下の様になっています。

もう少し高くしても良い気がします。

4mほどOceanを高くしました。

新しい海岸線にそって境界を直しました。

海岸線を歩いてみます。

やっぱり場所によっては海岸が反りあがっていました。

この辺は海岸線とLayerのSeaがそろっていました。

一時間かけて海岸線を走りましたが、半分も走れませんでした。

離れ小島が沈んでしまっています。

Water Body Islandを追加して島を抜き出しました。

このやり方で正しいのかどうかは不明です。

確認します。

PlayでSimulationにして確認しました。

離れ小島自体は存在していますが、高さが無い平な状態です。

どうやって離れ小島を表示するのかは後で調べる事にします。

調べました。

まずIslandを表示するのに使用するWater Body SystemはWater Body Islandで間違いなかったです。

そこはあっていました。

しかしその後で、Water Body Islandの以下のParameterを弄って島の海岸線と海の交わり方を調整していました。

あ、こんなParameterがある事、すっかり忘れていました。

Water Body Systemの勉強ももう一回やり直す必要がありますね。

Sea LayerのMaterialを元に戻しました。

うーん。

私が考えているのとは一寸違いますが、これはこれでかなり良いです。

2.5 Packagingを試す

どんなに綺麗な島を作成出来たとしてもPackagingが出来なければ意味は無いです。

Packagingを試します。

出来たみたいです。

テストしてみます。

圧巻の一言です。

ただよく見るとLandscapeの境界がおかしくなっている箇所があります。

これらの箇所はLightingをBuildし直せば直るはずです。

後で、試してみます。

PCがそれなりに音を発しています。

GPU使用率>

TaskでGPUの使用率を調べてみます。

たった19%です。

ただVRAMの使用率がほぼ100%で、UEやBrowserを開いたままの状態でテストしているとは言え、それなりにGPUに負担が掛かっているのは間違いないです。

<Landscapeの境界がオカシイ件について>

UE5に戻って確認します。

以下の箇所はWorld PartitionのSub Landscape同士の境界です。

可視で確認しやすいようにGを押して境界線を消すと

Landscapeの境界に線でも引っ張ったかのようなLayerの違いが発生しています。

UE4の時もWorld Compositionを使用すると、Sub Landscape同士の境界で全くおなじ現象が生じました。

その時はBuild Lighting Onlyを使用するとすぐに直りました。

ところがUE5で同じ事をやろうとしたら

まあ、出来ない訳です。

調べたらUE5ではLumenを使用しているから基本的にはLightingをBakeする事は無いので、LightingをBuildする必要もないそうです。

いや、でも現実にSub Landscape毎にLandscapeのRenderingの結果が違ったままSaveされているじゃないですか。

うーん。

これの直し方が分からない。

LandscapeのMaterialを外してみました。

分かり易い様にLandscapeの境界線を消します。

全く違いがないです。

ところがLandscapeにMaterialをセットすると

以下の様にはっきりとLandscapeの境界がはっきり見えるようになります。

<Camera Speedの値がおかしくなってしまった件>

全然、話は変わりますが

Camera Speedの値が1から10の間じゃなくてなんか変な値になっています。

なんでこうなったのか分かりました。

Mouseの右Clickを押しながらMouseのWheelを回すとCamera Speedを変更する事が出来ます。

今の私の場合は最高が0.99、

最低が0.01です。

でCamera Speedを最低の状態にしてCamera SpeedのUIを開きます。

Camera SpeedのUIも最低になっています。

ところがですね。

今度は、Mouseの右Clickを押しながらMouseのWheelを回してCamera Speedの値を最大値である0.99(今の私の場合)に変更します。

そしてまた、Camera SpeedのUIを開いて見ると

なんとUIの設定は最低のままになっています。

何これ。

しかもこの状態でUIのCamera Speedを動かすとCamera Speedの最大値が960に変更されてしまいます。

こんな感じでCamera SpeedのUIの値が変更され続けてしまっています。

これはどう考えてもBugです。

しかもこの値UE6.2を再Installしても直りません。

いくらPreviewでもこんなAppを初めて作成した子がするようなBugが存在する事に恐怖を感じます。

アメリカのSoftware産業の凋落のはじまりを感じます。

2.5 Let's Build the RPG! - 56 – Landscape Cave Sculpting and Lighting – Unreal Engine 5 Tutorial [4]を勉強する

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

今から勉強する事にしました。

Numen Brothers氏の他のTutorialをパラパラと見たんですがかなり良さそうです。

のでこれからチョクチョク勉強させてもらうようにします。

長い。30分以上あります。

のでそれぞれの節事にまとめる事にします。

<Intro>

このTutorialでは

  • CaveをLandscapeから直接作成する方法
  • God RayなどのCave内のLighting
  • Cave内にも追いかけて来るAI Characterの実装方法

を勉強するそうです。

最後の「Cave内にも追いかけて来るAI Characterの実装方法」は今は勉強する必要はないので、軽く見るかもしくは見ないでお終いにします。

<Today's Goals and Key Concepts>

具体的には以下の事をやるそうです。

前に一回見たせいか、非常に分かり易いです。

今度はKey Conceptだそうです。

Numen Brothers氏のTutorialで勉強するのはこれが初めてですが、毎回こうやってKey Conceptを表示するんでしょうか?

なんか学校の勉強の様です。

Landscape Visibility Maskとか聞いた事もないです。

Landscape ModeからSculpt Visibilityって何を言ってるんでしょうか?

このTutorialを勉強した後は、これらのTechnical Termを理解出来るようになっているんでしょうか?

次のEnvironmental Light Mixerは何なのか知っています。

新しいMapを作成した時に空を追加するやつです。

Volumetric Fogですか?

これある事は知っていましたが勉強した事は無いです。

Light Shaft BloomはCave内の光の調整に必要なParameterだったはずです。

<Getting and setting up free Quixel Bridge assets used in this episode>

ここで使用しているAssetについての説明がありました。

全部Quixel Bridgeから持ってきたそうです。

概要に貼ってあるURLからここで使用している全てのAssetのAddressをまとめたSpreadsheetをDownload出来るそうです。

これですね。

ただ今回は以下の4つのAssetしか使用しないそうです。

話は変わりますが、海に泡がついています。

これってどうやるんでしょう?

Foamが有ると無いでは海のRealさが100倍位違います。

これも後で勉強します。

ここでQuixel BridgeからImportしたStatic MeshにCollisionを追加する方法を説明しています。

これ。

去年自分でやったやつです。結構調べるのに時間かかったはずです。

Blogを調べたら2022-11-14のBlogにこの話が書かれていました。

DefaultのCollisionを使用したら以下の様に屋根のStatic MeshのCollisionにPlayerがぶつかって動けなくなっています。

これを以下の方法で直しています。

このTutorialでもまったく同じ方法で直しています。

正しこのTutorialはこれから更に先があります。

このStatic Meshに使用されているMaterialを開き、そのParameterにあるPhys Materialに

前に作成したStone_PMを追加しています。

このStone_PMはTutorialの11で作成したそうです。

一応、Tutorialの11を確認しておきます。

これですね。

何とこのTutorial、足跡を作成するためのTutorialです。

確かにこのTutorial無いでPhysical Materialを作成しています。

<Landscape material setup and cutting holes in landscape>

今度はLandscapeのMaterialについてです。

Landscapeに穴を開けても対応出来るように、LandscapeのMaterialに改良を加えるそうです。

まずMain NodeのBlend ModeをMaskedに変更します。

するとMain NodeのOpacity Maskが使用出来るようになるので

Landscape Visibility Maskノードを繋げます。

TutorialではこのNodeはLandscapeのHoleをPaintする事が出来るようしてくれるとあります。

うーん。

今一、分かりにくい。

公式SiteのLandscape Visibility Tool [5]に簡単な解説がありました。

これによるとLandscape Visibility Maskノードを使用したMaterialは

以下に示したLandscapeのSculptのVisibilityを使用して

以下の様にMaterialを透明にしたり逆に不透明にしたり出来るそうです。

なっ!

こんな事が出来るの!

スゲー勉強になる。

Landscapeに戻りました。

あれ?

Numen Brothers先生、一寸Tilingが激しすぎませんか?

Cave様に2つ、穴をあける場所を決定します。

山の麓であるココと

その裏側であるここに穴をあけるそうです。

うーん。

成程。

これって2つの穴の高さは大体同じにしないといけないんでしょうか?

Tutorialで言っていますが、更にCaveの天井の一部を破壊して太陽光がそこから差し込めるようにするそうです。

ここでLandscape Modeに入ってSculptを選択しVisibilityを選択しています。

これは先程のLandscape Visibility Tool [5]の説明と同じですね。

Brushで先程の場所をゴシゴシすると

以下の様になりました。

ほえ!!

なんなのこの色は?!

気持ち悪いんですが。これって本当に穴が開いているんでしょうか?
何か灰色系の水色を塗りたくったみたいです。

LandscapeのMaterialが透明になっているのかどうかすら分かりません。

山の反対側にも同様にします。

<Cave ceiling trick

ここは先程作成したCaveの内部を作成していきます。

Tutorialの話によるとCaveの中を手動で沢山のStatic Meshを並べるよりもかなり効率的な方法があるそうです。

Numen Brother氏はこれをEpiphanyと呼んでいます。

凄いですね。

まずCeiling、つまり天井から作成します。

使用するAssetはこのTutorial Seriesの9でDownloadしたモノたちだそうです。

ここのPointは使用するAssetが全部3D Rockだという事です。

つまり裏側から見ると透明に見えるStatic Meshは使用してないという事です。

これらのFoliageを使用します。

Foliage Modeに来てこれらのRockを追加しました。

BrushとFilterの設定です。

Static Mesh全部を選択してMeshの設定を変更します。

Densityを10にします。

Align Max Angleを30にセットします。

Ground Slope AngleのMaxを90にします。

そしてZ Offsetの値を-200にします。

何個は全く使用した事のないParameterが存在していますね。

大体名前から推測出来ますが、一応実装する時にどんな機能なのか調査する事にします。

ここでTutorialが忠告しています。

この方法でCeilingが作成出来るのは、ここで使用しているRockの大きさをTutorial 9で大体同じにしているからだそうです。

FoliageをPaintします。

山の下を全部Paintする。って言っています。

Landscapeの下に入り込んでいます。

確かに天井になっています。

<Cave floors>

今度は洞窟の床の部分を作成します。

以下のFolderに入っている

巨大なStatic Meshを使用するそうです。

以下のStatic Meshを使用していました。

このStatic Meshを上手く配置して以下の様にしました。

床だけでなく壁にもなっています。

もしここで上記のようなImageが見えない場合は、

Post Process Volumeを選択して

BrightnessのMinimumとMaximumの値をそれぞれ1にセットして下さいと言っています。

これは単に作業しやすいようにUE Editorの画面を明るくしているだけだそうです。

今度はCaveの反対側の穴に移動します。

先程Ceilingで追加した岩が穴を塞いでいます。

Foliageから穴を塞いでいた岩を消します。

こちらも同じようなStatic Meshを使用してFloorを作成していきます。

今度は2つの床の間を繋ぐためのStatic Meshを配置します。

以下のようなStatic Meshの断片がLandscapeを貫いて地面が飛び出した時の対処方法です。

Landscapeを盛り上げて隠してしまいます。

もっと劇的な対処方法があるのかと思ってあえて記録に残しましたが、これなら書く必要なかったです。

Testしています。

普通に歩いていますが、ここで重要なCommentを2つ言っていました。

一つは、全てのMeshにCollisionのSetをしてある。と言う事です。

もう一つは、ここに使用しているStatic Meshが使用している全てのMaterialにPhysical Materialをセットしている事だそうです。

これはTutorialの19の設定が関係しているらしいです。

今、このTutorialの説明を聞いただけではよく分かりません。

この節の最後に以下のようなPlaneを追加して平な箇所を作成していました。

次のTutorialでNiagara Fluidを使用して水たまりか滝をここに生成するそうです。

うーん。

凄い!

<Setting up entrances and exits>

以下のMeshを使用して入り口の門を作成するそうです。

こういうArt的なTechniqueは特に参考になる事以外はSkipして記録には残さない事にします。

と思ったんですが、かなり参考になるTechniqueが使用されています。

それぞれのTechniqueの記録を残しておきます。

まず以下のように階段を追加しています。

この階段が白過ぎますが、これを後で直すそうです。

一体どうやるんでしょうか?

VisibilityからLandscapeの透明な部分を調整して洞窟の入り口と一致させています。

入口の周りに岩を配置して以下の様にしました。

洞窟の内側から入口を見た場合です。

出口側も同じように作成しました。

内側から見た場合です。

ここでやっと階段の白過ぎ問題を直します。

なんとMaterialに使用しているTextureの値を変更するそうです。

TextureのSaturationの値を1.0から0.3にし、RGB Curveも1.0から1.5に変更しました。

これは階段じゃなくて門に使用されているTextureでした。

階段に使用されているTextureも以下の様に値を変更しました。

結果です。

うーん。

この結果だけみて階段が白過ぎから適切な色になったかどうかは判断出来ませんね。

ただこういう方法でStatic Meshの色の調整が出来る事は勉強になりました。

<Creating a light hole (for natural light to shine through) in the top of the cave>

ここで洞窟に差し込むGod Rayを作成するそうです。

まずGod Rayが差し込む箇所のCeilingの岩を消します。

Landscapeも消します。

まわりにStatic Meshを配置します。

内側も同様に作成します。

この後はLightingの設定になります。

ので今週のLet's Build the RPG! - 56 – Landscape Cave Sculpting and Lighting – Unreal Engine 5 Tutorial [4]の勉強はここまでにします。

来週は今週勉強した内容を元に実装をするのか、それともこの続きを勉強するのかは分かりませんが、どちらかは必ずします。

2.6 Let's Build the RPG! - 56 – Landscape Cave Sculpting and Lighting – Unreal Engine 5 Tutorial [4]を勉強した感想

Numen Brother氏のTutorialを勉強したのは今回が初めてですが、圧巻の一言です。

最新のTechniqueを用いて、Gameを制作している人が抱えている問題の解決策をズバッと示してくれます。

なんか、Unreal Sensei氏のTutorialを初めて見た時のような衝撃がありました。

もしかしたらUEでRGBを作成したい人は、この人のTutorialを全部、勉強するのはMustになるかもしれません。

兎に角、凄いの一言です。

3. Materialの勉強

今週は予定を変更してRender Bucket氏のTutorial、Unreal Engine 5.2 - Intro To Strata/Substrate Materials Tutorial [7]とUnreal Engine 5.2 - Crystal, Ice, Gemstone Materials Tutorial [8]を勉強する事にしました。

この2つのTutorialはUE5.2の新しい機能についての説明です。

まだUE5.2の新しい機能について勉強していません。Render Bucket氏のTutorialで勉強する事にします。

3.1 Unreal Engine 5.2 - Intro To Strata/Substrate Materials Tutorial [7]を軽く勉強する

このTutorialはStrataについてです。

と言ってもStrataがどんな機能なのかよく知りません。

地層のように何層もの半透明なMaterialを重ねた表現が出来るんでしょうか?

となると先週実装した

こういうやつを指すんでしょうか?

まず軽く全部見ます。

見ました。

以下の3つのMaterialを作成していました。

まずSilkです。

次にGlassです。

最後に透明な膜につつまれたPlasticです。

最後のヤツはMaterialが層になっていました。

これがUE5.2の新しい機能なのかと思ってRoadmapで確認したら

名前がSubstrateに代わっていました。

Substrateで検索したらSmart Poly氏がSubstrateに関するTutorialを一個公開していました。

うーん。

ま、あんまり考えても仕方ないです。

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

<Substrateの基礎>

Project Settingを開いてSubstrateを起動させます。

普通のMaterialを使用してM_Strataを作成しました。

Materialを開きます。

ひえ。

中身が全然違う。

これは先程のProject SettingでSubstrateをEnableしたからこうなったらしいです。

BSDFってBlenderみたいですね。

BSDFはBi-Directional Scattering Distribute Functionの略語だそうです。

Substrate Slab BSDFノードのそれぞれのPinの機能について解説しています。

こんなの一々勉強していたら、これだけでMaterialの勉強が終わってしまいます。

この辺は何となく話を聞いて終わりにします。

<Substrateを使用して金属のMaterialを作成する方法について>

この後、Substrateを使用してどうやってMetallicなMaterialを作成するかの説明をしています。

こんな感じのMaterialになっています。

Substrate Slab BSDFノードのBase Colorに以下のRGB値をPassします。

すると以下に示した様に

金のMaterialになります。

そして以下の実装でも

以下に示した様に、さっきの実装と全く同じ結果になります。

Tutorialではこの理由を説明していますが、内容が細かすぎるのでここにまとめるのは止めます。

<Silk>

ここでやっとSilkの作成です。

Tutorialの説明を聞くとSubstrate Slab BSDFノードのFuzzの使用方法を解説するためにSilkを作成するそうです。

FuzzってImage的にはSweaterについている毛だまりなんですが、一応調べます。

はい。タオルの表面みたいな感じを指していますね。

まず以下の実装を作成して

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

ここまでの作成もかなり興味深い説明がありましたが、今回はFuzzの使い方だけ以下にまとめます。

Fuzz RoughnessとFuzz Amountに値をセットします。

結果です。

なんか輪郭線が見えますね。

Fuzz ColorのDefault値が黒なのかもしれません。そのせいで輪郭線のように見えるのかもしれません。

Fuzz Colorを追加しました。

結果です。

おお、これはFuzzっています。

なんか桃の表面っぽいです。

フワフワ感があります。

ほお。

凄いですね。

<Glass>

今度はSubstrateを使用して透明なMaterialを作成する方法についてです。

以下のSubstrate用のMain NodeのRefraction何とかを使用出来るようにする必要があります。

まずRefraction Methodの設定をIndex Of Refractionに変更します。

そしてShading ModelをTranslucent Colored Transmittanceに変更します。

すると以下の様にRefractionが使用出来るようになります。

Tutorialでは1.57をセットしました。

他の実装です。

この部分の説明はSkipします。

結果です。

お、確かにGlassっぽいです。

Level上で試しています。

これは完全にGlassです。

Parameterを追加して曇りガラスのようにもしていました。

Tutorialの説明だとUE内でGlassの計算をきちんとしたしたのはSubstrateが初めてだそうです。

SphereにSubstrateで作成したGlassを追加すると以下の様になります。

Specular Lightがありません。

これを追加します。

Main NodeのLighting ModeにSurface Forward Shadingをセットします。

すると以下の様にSpecular Lightが追加されます。

結果です。

おお、Plasticで出来た玉っぽいです。

一寸だけ、SubstrateにおけるGlass Materialの感想を書くと影がそのままですね。

Glassの影って七色に光って独特な色彩を描きます。

その辺は再現出来ていません。

<透明な膜に包まれたPlastic>

最後にFilmに覆われたMaterialを作成します。

以下のように実装しました。

簡単に説明するとSubstrate Vertical Layerノードを使用して2つのMaterialを混合して作成しています。

上のLayerは透明なFilmを表すためにSubstrate Thin-Flimノードを使用します。

結果です。

なんと下のLayerが全く見えません。

下のLayerを上のLayerを透過して表示するためには

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

SSS MFPは物体の表面下にどれくらい錯乱光が侵入するかを示しているそうです。

そこにSubstrate Transmittance to Mean Free Pathノードを追加する事でその値を色と厚さから変換してくれるそうです。

結果、

おお。

Film貼ってある感が出ています。

Level上でのImageです。

最後にSubstrate Vertical LayerノードにあるParameter、Use Parameter Blendingについて解説しています。

これを使用すると質は落ちるが、計算Costが安くなるそうです。

使用した結果です。

明らかに安物感が追加されました。

3.2 Unreal Engine 5.2 - Intro To Strata/Substrate Materials Tutorial [7]を軽く勉強した感想

以下に簡単な感想をまとめました。

<Substrateについての感想>

Substrateと言うのが存在しているのすら知らなかったです。

UE5.2 のRoadmapにおけるSubstrateの説明でClear Coatの代わりになるMaterialと言っているので、層になっているMaterialを表現するために開発されたものと理解しました。

その点から評価すると、Costや今もまだExperimentalな状態である事を考慮してもかなり性能が良いと思いました。

これから、PBRの代わりにこのRendering方法が主流になるんでしょうか?

UEの公式Forumに以下のSubstrateに関してのDocument [9]がありました。

以下のようなCourseで勉強出来、これ読んだらSubstrateの概要はかなり理解出来そうです。

もうUEの分野は大きすぎて、全部を勉強するのは不可能になって来ています。

どういう人がこのSubstrateを勉強する必要があるのか、その辺を最初に説明して欲しいです。

なるだけ早くGameを完成させたいと言う人には、Substrateの勉強の優先順位はかなり低くなるはずです。

逆にMaterialの専門家になりたい人や既に専門家の人には、Substrateの勉強はMustになるでしょうね。

ただMaterialの専門家だったらShading言語における実装方法も知っておく必要がある訳です。そうなるとこのSubstrateを最初に勉強するよりも何層もある表面の光の錯乱の状態やそれを支配する方程式の勉強から入った方が結果としては速く理解出来そうな気もします。

物体表面における光の振る舞いをSubstrateがどのように数式化したのかは、どこかに説明されているんでしょうか?

その辺が気になります。

その中間にあたるLevel DesignerやEnvironmental ArtistそしてParticleの製作者なんかはこの辺のTutorialで勉強するのがピッタリな気がします。

<このTutorial全般についての感想>

いつものRender Bucket氏のTutorialと言う感じで、細かい点まで説明されていながら全体を簡潔に説明する事にも長けていて、非常に分かり易いTutorialでした。

ただ一言、言わせてもらうとこのTutorialを見て思うのはこの前のGDCのEpic Game社の発表であった以下の

車の塗装なんです。

これを見た時に、スゲーと単純に思いました。

この辺について一寸でも解説して欲しかったです。

<Silkの実装に対しての感想>

Fuzzの説明は非常に分かり易かったです。

何気にSilkがかなり特集な光の反射や錯乱を起こす話は、Render Bucket氏の物理に対する理解の高さを示していて、安心して勉強する事が出来ました。

<Glassの実装に対して感想>

これは実はあんまり感想がないんです。

Specular Lightを追加するとガラスが本物っぽくなるのは驚きでした。

<透明な膜に包まれたPlastic>

これ、先週、Ben Cloward先生のAdvanced Materialで作成した

とどう違うのかが知りたいですね。

Clean Coatを使用した場合の結果は

これです。

この辺の実装や背景となっている方程式や光のScatteringの理論なども知りたいです。

3.3 Unreal Engine 5.2 - Crystal, Ice, Gemstone Materials Tutorial [8]を軽く勉強する

これはどう考えてももうやる時間は無いです。来週やるか、もしくはやらないかもしれません。

ただ、ここに紹介されている氷のMaterialの作成方法は非常に興味があります。

2023-03-20のBlogにも書きましたが、私の考える氷って以下に示した様な

半透明の物体なんです。

ところが今Photorealisticな氷と言うと以下に示した様な

不透明な物体が氷として認識されています。

これに非常に不満があります。

その辺をSubstrateがどうしているのかが非常に興味があります。

4. Niagaraの勉強

CGHOW氏のRibbon Fire in Unreal Engine 5.2 Niagara Tutorial [1]の続きを勉強しようと思ったんですが、

このVFXがあまりにも綺麗で気になって仕方ないです。

のでこっちを勉強する事にしました。

4.1 Disintegration into Sand Unreal Engine 5.2 Niagara Tutorial [10]を勉強する

これです。

凄い綺麗です。

まず軽く全部見ます。

見ました。

そんなに難しいTutorialではなかったです。

昔やった椅子が消えると消える箇所にParticleが発生するEffectの実装に似ています。

砂が地面に落ちるのをどうやって再現してるのかと思ったら、単にGravity Force Moduleを追加しているだけでした。

後は黒いTextureにParticleを発生させるためMaterialをAddからTranslucentに交換していましたが、このMaterialがよく分かりません。

それでは一個ずつ見ていきます。

<Materialの作成>

まずMaterialを作成します。

これ何に使用するんだったけ。と最初から忘れています。

多分、Chairの消えるEffectに利用するためのものでしょう。

MaterialのPreviewの表示にChairを選択します。

以下の様にTextureを繋げます。

当然Chairは以下の様になります。

Tutorialではこの白黒の場所にParticleを発生させると言っています。

Chairに沿ってParticleを発生させるのなら意味が分かりますが、これはどういう意味で言っているんでしょうか?

今度はNiagara Systemを作成しました。

いつも通りFountainを追加しています。

いつも通り速度関連のModuleを全部消します。

Emitter Update SectionにあるSpawn Rate Moduleの

Spawn Rateの値を1000に変更して

更にParticle Spawn SectionにStatic Mesh Location Moduleを追加して

Preview MeshにSM_Chairを追加します。

以下の様になりました。

Particle Spawn SectionにあるInitialize Particle Moduleを選択し

Mass ModeをUnsetに、

Sprite SizeをUniformに

Uniform Sprite Sizeを2.0にします。

これもいつもの設定です。

ただMass ModeをUnsetする必要ってそんなに無いと思っています。

Propertyを選択して

Sim TargetにGPU Compute SimをセットしてCalculate Bounds ModesにFixedをセットします。

Emitter Update SectionのSpawn Rate ModuleのSpawn Rateの値を20,000にします。

これはGPUなら適切な値です。

こんなになっていました。

ここまでは別に説明されなくても自分ですぐに作成出来ます。

ここからどうやって椅子が砂に変換するEffectを作成出来るのかが不明です。

このSpriteを以下のイスのようにするそうです。

全く意味が分かりません。

Spriteに色を付けて白い部分は白いSprite、黒い部分は黒いSpriteを発生させるのでしょうか?

先程のNoiseはTestした時に確認するのが難しいので、以下のTextureを使用するそうです。

ここで黒が出て来るのか。

椅子のImageは以下の様になっています。

Tutorialでは、NiagaraでどうやってTextureに適用するのか?と言っています。

うーん。

よく意味が分かりませんが続きを見てみます。

Scratch Pad Moduleを作成して

以下の様にしていました。

Sample Texture 2DノードのUVの値を決定するのに、Map Getノードの[PARTICLE] PositionのXYの値を使用します。

Sample Texture2DノードのValueをMap Setノードにセットした[PARTICLE] Colorにセットします。

はい。

これはTextureの色をパスしています。

TutorialがSpriteを椅子の様にするって言っているのはSpriteの色を椅子と同じにすると言う意味で間違いなさそうです。

更にMap Getノードに[PARTICLE]Tileを追加してTextureのUV値に掛けます。

Tutorialでは以下の実装と同じ事をしています。と説明していました。

まあ、これは説明しなくても同じ事をしているのは分かるでしょう。

Niagara Systemに戻ってTextureにMaterialで使用しているのと同じTextureをセットします。

結果です。

色が全く違います。

後、黒の部分にParticleが生成されていません。

うーん。

あ、そういえば今作成したScratch ModuleノードはParticle Spawn Sectionの最後にセットしていました。

Scratch ModuleノードのTileの値を0.01に変更しました。

結果です。

おお。

緑色に光っています。そして黒いTextureの部分はSpriteがSpawnしていません。

想像どおりの結果になりました。

Tutorialでは今度はTextureが黒い部分が透明になっているのを直すと言っています。

この原因はSprite Renderer Moduleに使用しているMaterialであるDefault Sprite MaterialがAdditiveだからと言っています。

このMaterialにTranslucentのMaterialを使用すれば良いと言って以下のMaterialを代わりにセットしました。

これは。

このMaterialの実装が分からんやん。

ただ想像するにMaterialのMain NodeにあるBlend ModeをTranslucentにしただけな気もします。

この辺を弄ったら黒が色として表現出来るMaterialが作成出来たはずです。

黒い色を表示した以下のEffectは2023-02-06のBlogで作成していました。

この時のBlogを見るとBlend ModeはTranslucentではなくMaskedになっています。

どっちでも良いと思います。

来週実装する時に試してみます。

結果です。

要はこれと同じになれば良いんです。

そういうMaterialを作成してSprite Renderer ModuleのMaterialにセットします。

TextureのSizeと位置が、Particleと椅子で違います。

それはそれぞれのTexture Sampleで使用しているUV値が違うからです。

Material側のTextureのUV値をParticle側のTextureのUV値に揃えます。

うーん。Absolute World Positionノードか。

言われてみればその通りですが、これは思いつかなかったです。

結果です。

Tutorialではここでどうやって椅子をDissolveするかを説明しますが、もう何回も色々なTutorialでやっているからと言って滅茶苦茶、短い説明しかしませんでした。

以下のような実装をして

椅子が以下の様になって

お終いです。

Stepノードを使用する事で白と黒に分かれるのは分かります。

後で、StepノードのYの値を変化して椅子を全部黒くするはずです。

黒い部分は透明になるの?

あ、思い出しました。

さっき軽く見た時に、後でEmissive ColorじゃなくてMask Opacityに繋ぎ直していました。

それなら黒い部分がDissolveしてもおかしくないです。

Tutorialの次のStepです。

やっぱり想像した通りです。

次にBase Colorに以下の色を追加しました。

うーん。

これは砂の色になるのか?

分かりません。

TutorialではNiagara Systemに戻りEmitterをDuplicateして以下のEmitterを作成しました。

要らないModuleを消したり、Spawn Rate Moduleを消してSpawn Burst Instantaneous Moduleを追加したりしていますが、本筋とは関係ないので記録はしません。

来週この部分を実装する時はTutorialを見て確認します。

Sprite Render Moduleを消してMesh Renderer Moduleを追加して

椅子を表示します。

このMesh Renderer ModuleのOverride Materialsに先程のMaterialをセットします。

結果です。

先程の茶色はこういう風に使用されるのね。

うーん。このEffectの仕組みを段々理解して来ました。

椅子が消えるEffectと、椅子が消えかけている箇所からParticleが発生するEffectを組み合わせて、椅子が砂に変化しているような錯覚を起こしていたわけです。

あー。理解しました。

Particle Update SectionにDynamic Material Parameters Moduleを追加します。

ここでMaterialの設定の間違いに気が付いて直します。

Blend Modeの設定をMaskedにして

Noiseの実装をOpacity Maskに繋ぎました。

結果です。

今度はDissolveしています。

Dynamic Material Parameters ModuleのDissolveの値を以下の様に変更します。

設定を以下の様に変更していますが、

この辺の細かい点は実装する時にまた確認します。

今度はParticleをSpawnしているEmitterの改良です。

このParticleがDissolveしている椅子のEdgeから発生するような実装を追加するはずです。

Materialを開きます。

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

結果、

Edgeの部分だけが白くなりました。

うーん。

これ答えを見てるから簡単に見えますが、一番最初に考えた人は天才ですね。

はい。

Tutorialはここまでやって実装を元に戻してしまいました。

よく考えたらこのMaterialは椅子をdissolveするために使用していました。

ここで説明した理論をParticleを生成するEmitter内で実装します。

まずParticle Spawn SectionにあるScratch Moduleの

TextureをNoiseに変更します。

本当にScratch Module内で同じ実装を作成するのかそれとも別な所で特別なModuleを使うのか、全く予測出来ないので一寸だけ先を見て来ます。

Scratch ModuleないでEdgeだけ白くなる実装をしていました。

あ、分かった。

これで黒いParticleをすぐにKillすればEdgeだけParticleが生成するEffectが完成します。

Scratch Pad Module内の実装は全容を示した所が無いのでまとめはSkipします。

来週実装する時はTutorialを見ながらやります。

黒いSpriteの消し方ですが、

Particle Spawn SectionにあるKill Particles Moduleに

以下の設定を追加して

黒のSpriteをすぐにKillします。

うーん。

容赦ない。

なんかひよこの雄を誕生したすぐ後に消去する感じに似てますね。

結果です。

今度はこのParticleのDissolveがもう一方のEmitterにある椅子のDissolveと同じ挙動を示すように設定します。

細かいBugを直した後の結果です。

おお、Particleの発生と椅子のDissolveが一致しています。

Particleの色を椅子と同じにします。

色を指定しても変化しません。

理由はScratch Pad Module内で[PARTICLE] Colorを使用していたからです。

もうこのParameterは要らないので消します。

結果です。

うーん。

凄い!

ここでCurl Noiseを追加します。

さらに凄くなりました。

Dissolveの仕方がいつも同じなのでRandomizeしました。

このやり方も簡単なのでここにはまとめません。

最後にGravity Moduleを追加して

Spriteが落下するようにしました。

完全に理解しました。

来週実装します。

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

先週は病院に行く用事があってほとんど出来ませんでした。

BGMを追加して完成させます。

5.1 BGMを追加する

Game開始から戦闘開始の間のBGMを探します。

以下のBGMを使用します。

Wavに変換してUEにImportしました。

Cueに変換してLoopにします。

Level BPを開き以下の関数でBGMを管理します。

関数の中身は以下の様になっています。

今、流れているBGMを止めて指定したBGMを新しく流します。

先週、戦闘用のBGMを実装した箇所もこの関数で実装し直しました。

テストします。

Bugとかはなく正常に動いていました。

ただし次のBGMへの切り替えの時間が短すぎます。

Play BGM()関数内のFade OutノードとFad InノードのDurationの時間を

0.2から1に変更しました。

更に2に変更しましたが、なんかあいません。

間に一秒位の無音の時間が欲しいです。

理由が判明しました。

関数で処理するとFade Outが終わる前にSet Soundノードが実行されてFade OutのDurationの時間に関係なく前の音が終了してしまいます。

これの解決策はあれだ。Speakerを複数配置してそれぞれ別な音を流すようにすることだ。

いや、Eventにして別ThreadでBGMを扱う事が正解です。

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

同じBP内でEventを扱う際にはBindをする必要は無かったみたいです。

一生懸命Bindしようとしていました。

音楽が変わる時に、このEventを呼び出します。

これでBGMの変化がSmoothになるはずです。

テストします。

OKです。

曲の切り替わりで、違和感が無くなりました。

何度も聞き直しましたが、BGMの繋ぎには問題が無くなりました。

ただこの場所でBGMを切り替えるのが適切なのかどうかはまた別の問題でもう少し後の方が良い気もします。

一応、これでBGMも完成とします。

5.2 次の作業を確認する

次の作業を確認します。

2023-01-01のBlogに戦闘システムの予定がまとめられていました。

ここまではやりました。

以下の作業がまだやってない部分です。

成程。

またUIの改善か。

来週からUIの改善を行います。

UIの改善で絶対しないといけない事を以下に記しておきます。

  • Main Menuの追加
  • Widget毎のInstructionの直し、もしくは追加
  • Widget毎のUIのDesignの直し
  • Widgetに使用しているTextureの直し

これらの事をまずやります。

<Main Menuの追加>

Main Menuそのものがありません。Main Menuを作成します。

Main Menuに追加するボタンについても考える必要があります。

Main Menuについては去年、散々時間を費やして結局無駄になった苦い経験があります。

2022-12-25のBlogに、その時の反省と総括がまとめられてありました。

それをよく読んでからMain Menuの作成に何が必要なのかを考える事にします。

Widget毎のInstructionの直し、もしくは追加>

GameをPlayして気が付いたんですが、Widgetによっては何をすれば良いのかの指示が全くないものがあります。

例えば以下のStageのWidgetですが

開始ボタンを押す必要がある事が分かりません。

次のWidgetです。

このWidgetには「どちらかのカードを選択して下さい」と書かれています。

その指示を読めば、「PlayerがどちらかのCardを選択する必要がある。」と理解出来ます。

このようなそのWidgetが開かれている時に何をすれば良いのかを示すInstructionが全くないWidgetが何個かありました。

それを直します。

Widget毎のUIのDesignの直し>

WidgetのDesignを直します。

例えば以下のWidgetですが

右端のMonsterが全く見えません。

更に「読みましたボタン」がBoxの右上にあるので、見つけにくいです。

こういうUserが不便に感じそうな箇所を直していきます。

Widgetに使用しているTextureの直し>

最後にWidgetに使用しているTextureをもっと綺麗にします。

こういうやつを直していきます。

5.3 今年に入ってからの「戦闘システム」の作業を見直す

今年に入ってからは毎週、「戦闘システム」の完成を目指して作業して来ました。

これは単なるミニゲームですが、このGameの根本を支える哲学には以下のそれなりに深い内容が一寸だけ含まれます。

Gameにおける戦闘の面白さを徹底的に詰めた結果、戦闘には

  • 戦闘前に徹底的に準備する戦略的な面白さと
  • 戦闘中に工夫する事で敗北から勝利へと逆転する戦術的な面白さ

がある事が判明しました。

戦闘前に徹底的に準備する面白さの代表がPokémonだと思われます。

私はPokémon GOしかやった事ありませんが「次のRaid Battleに出て来る伝説Pokémonを倒すにはGolem(ゴローニャ)が6体必要。」って噂を聞いて、

わざわざ新宿御苑まで行ってGeodude(イシツブテ)を集めまくった事がありました。

途中から雨が降って来て、結構濡れてしまいましたが、大満足で帰った記憶があります。

こういう、戦闘前に徹底的に準備する面白さとは別に、戦闘中に工夫する事で敗北から勝利へと逆転する戦術的な面白さがある事も判明しました。

これを一番、はっきりと示してくれたのがHxHで、HxHの戦闘は逆転に次ぐ逆転で、漫画なのに読者に息する暇さえ与えません。

この一発逆転が何故起きるのかを詳細に検証した結果、JRPGで言う補助魔法や回復魔法の存在が逆転のKeyである事が分かりました。

一般のJRPGでは補助魔法や回復魔法は、脇役の存在でそんなに注目されていません。しかしこれらの魔法を主役だけが使用出来るようにする事で、この逆転の興奮をGameでも再現出来るのではないかと推測しました。

この点を踏まえて、最初は単純にこの2つの面白さを備えた戦闘システムを作成しようとしました。

しかしそれはそんな簡単でない事はすぐに判明しました。

戦闘中に逆転出来るシステムを組めば組むほど、戦闘前に準備する必要が無くなり、戦闘前の準備をするのがアホらしくなります。

逆に戦闘前の準備で勝負がついてしまう戦闘システムを作成すると、戦闘が開始した瞬間に勝負の結果が見えてしまうので、戦闘中がツマラナイものになってしまいます。

まさに矛盾で、この2つの面白さは、どちらかを立てると残りが立たなくなると言う両極の存在だったんです。

そういえば、先程の例で出てきたPokémon GOでも実際のRaid Battleが始まったら、脳筋状態になってひたすら携帯の画面を叩いているだけでした。

集める楽しさを極限まで高めたので、戦闘中に工夫する事で敗北から勝利へと逆転する戦術的な面白さが無くなってしまった訳です。

それでも画面を死に物狂いで叩いているのはそれなりには楽しかったですが、戦闘が開始した瞬間に勝負の結果が見えている事で、戦闘中に工夫する楽しさが無くなってしまった事は間違いないです。

ここである発想を思い付きます。

定性的には、この矛盾を解く事は不可能ですが、定量的には可能なのではないか?という事です。

つまり、戦闘中に工夫する事で2倍程度に強い敵までなら倒す事が出来る。

逆に戦闘中に脳筋で戦うと半分の強さの敵にすら負ける可能性も出て来る。

このようなシステムを作成すれば、ある程度、戦闘中に工夫する楽しさを保ったまま、戦闘前の準備も楽しいGameが作成出来るのではないかと考えた訳です。

そして「2倍程度に強い敵までなら倒す事が出来る。」ようにするためには、補助魔法や回復魔法の種類を少なくしたり弱くしたりすれば良い訳です。

そして戦闘は別の何かにやらす必要があります。

召喚したMonsterに戦わす事にしました。そしてPlayerはひたすら補助魔法や回復魔法を駆使して戦局を有利にする事に徹します。

このような発想に基づき、取りあえず戦闘部分のProtocolだけ作成したのが今回のMini-Gameです。

ここで確認したかったのは、この2倍程度の敵を倒せる程度の工夫でも、戦闘中にUserがそれを行う事で、User自身が戦闘中に工夫する楽しさを感じる事が出来るのかどうかです。

それを確認する目的で作成しています。

自分でPlayした結果は、それなりと言うか、想像以上にかなり楽しかったです。

これは偶然ですが、召喚したMonsterが一体でも死亡すると戦闘に負けるRuleにしたので、

味方のMonsterが死なないようにする事と、敵のMonsterのどれかを倒す事の2つを常に考える必要が生じました。

そのため戦闘中に必要な工夫がそれなりに複雑になり、その結果かなり戦闘中が楽しくなりました。

この辺の根本の目的を確認して今年の今までの作業内容を復習します。

と思ったらもう時間がないので実際の見直しは来週やります。

6. Gaeaの勉強

今週はGaeaの何を勉強するんでしたっけ?

先週のBlogを読んだら思い出しました。

結構、重要な内容があるので節で分けてまとめます。

6.1 先週の復習

まず2023-04-10のBlogなどでまとめていますが、UEのMaskはLayer InfoでWeight-Blended Layer (normal)を指定した場合、以下に示した様な

後から指定したMaskが100%上書きする仕組みになっています。

それに対してGaeaでは以下のような実装で

Maskを混合すると

以下に示した様に

重なった部分が混合されたLayerになります。

これCombineノードの値を色々変えてもUEのMaskと同じ結果を作る事は出来ませんでした。

GaeaのCombineノードの組み合わせを色々考えたんですが、UEのMaskと同じ結果をGaea上で再現する事は出来ませんでした。

ところが、先週勉強したKlaus氏のHow To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [11]に以下の実装が紹介されていて

このやり方で実装すると以下に示した様に

UEと全く同じ結果をGaeaでも再現出来る事を示していました。

はーあ。

やっぱりKlaus先生は半端ではなかった。

そしてやっぱりColoringやそのためのMaskの作成を勉強する必要がある事も再確認させられました。

6.2 How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [11]のTextureを再勉強する

まずKlaus氏のTextureの作成方法をもう一回勉強し直します。

実際のMaskの作成はTextureの前の節のCreating the Base Shapeから始まっています。

最初にSeaノードを使用したBeachの作成方法についてです。

まずSeaノードの2番目のOutputです。

以下に示したNodeになります。

海の部分が白くそれ以外が黒くなっています。

次はSeaノードの最後のPinです。

ここはBeachの部分を白く示すそうです。

結果です。

うーん。

よく分からないですね。

海の部分にもBeachが続いていると言う事なんでしょうか?

Tutorialの説明を聞くとThe beach has some waterと表現しているので、そうなんでしょう。

そして海で覆われていない部分のBeachだけのMaskの生成方法を説明しています。

BeachのMaskをCombineノードのAにつなげ、SeaのMaskをCombineノードのBに繋げます。

そしてCombineノードの設定で

MethodをSubtract、Ratioを100%に変更します。

これは黒が0、白が1だとすると納得出来ます。

Beachから海の部分を引いた訳ですから、

Beachの部分で海の部分である場所は

1-(1.00 x 1)= 0

となって0になります。

先週もこの部分は勉強してBlogにまとめてありますが、何で引き算すると陸上のBeachの部分だけがMaskされるのかについては全く考察していません。

こんな感じで先週の勉強を更に詳しく調べる感じで進めていきます。

ここでSeaノードのVariationについての解説をしています。

この値を大きくするとBeachのそれぞれの部分の高さが変化するそうです。

Shore SizeとShore Heightについても解説していますが、今一よく分かりません。

確認します。

以下のMountainのModelで確認しました。

Shore Heightはどの高さまでをBeachにするのかを決定します。

これは分かりました。

Shore Sizeですが、0にしても100%にしても変わりません。

公式のQuadspinnerのGaeaのSea Nodeのサイト[12]を見ると

うーん。

そうなの?

Shore Sizeを0にします。

今度はShore Heightの値に応じてBeachが現れました。

VariationもTutorialの説明通りではなくなんか変な変化をします。

Sea Nodeのサイト[12]には以下の解説がされています。

あー。

分かりました。Coastal Areaとか、Shoreの言葉の正確な定義を知らないから意味が分からなくなるんです。

調べました。

同じ意味でした。要はどっちも海岸線と言う意味です。

ただし違いも分かりました。

ShoreはCoastよりも小さい範囲を指すときに使用するそうです。

うーん。

大体分かりました。

まずShore Sizeですが、Erosionが大きくなります。

Shore Sizeの値が小さいとErosionがほとんどなくなり山の亀裂などの表面がかなりはっきり見えます。

そして川下に貯まるErosionとしてのBeachの大きさも小さくなります。

そんな感じでした。

この値は常に100%で良い気がします。

Shore Heightは、どの高さまでBeachになるのかを指定しています。

最後のVariationですが、Coastの形状が変わると言うより、Beachとその周りの山の形状が変化します。

ここからBeachのMaskは一端、消去して以下の実装を作成しています。

ここで先週は少し混乱してSlopeノードを使用したMaskの作成方法とそのMaskを使用したTextureとColoringの方法をごっちゃにしてしまっています。

今週はその部分をしっかり整理します。

まずSeaノードにSlopeノードを追加する事でMaskを作成します。

このSlopeノードの設定方法については2023-03-20のBlogで簡単にまとめてあります。

次にこのMaskを使用してColoringする方法です。

まず普通のColoringですが以下に示した様に

先程作成したSlopeのMaskは全く必要ないです。

まずTextureノードをSeaノードの結果に繋げていますが、

公式のTextureノード [13]の解説によれば

TextureノードもMaskの一種である事が分かります。

Textureノードの結果を見ると

こんな感じでMaskされています。

ここに以下のSatMapsノードを追加する事で

それぞれ以下のような結果を作成する事が出来ます。

ここから先程のSlopeのMaskを使用します。

Combineノードの設定は以下の様になっています。

結果です。

このCombineノードの設定だと、Slopeノードの結果の黒い部分が茶色の結果のSatMaps、白い部分が緑の結果のSatMapになります。

これを繰り返すだけです。

ここから後は、どうやってMaskを作成するのかだけが違って後は全く同じ結果になります。

Flowノードを使用したMaskです。

BeachとSeaノードです。

これはBeachノードを最初に使用してその後でSeaノードを使用しているため、結果的にBeachのAreaは先程の実装(以下に再表示)と同じになっています。

これだけです。

となるとこの実装でMask用のNodeの機能を検討する必要があります。

6.3 もう一度Data GroupのNodeを検証する

以下のNodeたちですね。

前に勉強した事があるはずです。

調べます。

2023-03-20のblogで勉強していました。

今見直すと結構しっかり勉強しています。

全部、読んでみます。

<Textureノード>

Textureノードについて

と書いていました。

これは今なら分かります。

TextureノードがやっているのはUEのMaterialにおけるMacro Varianceみたいな感じで、Terrain全体にRandomな模様を追加する事でRealisticな雰囲気を出しているんです。

更にここにSatMapノードを追加する事で以下に示した様な自然なTerrainを表示する事も可能です。

つまりSatMapノードを使用するColoringの下塗りをするためのNodeでもあります。

<Curvatureノード>

このNodeも

2023-03-20のblogでは

と述べています。

これもTextureノードと同じ目的で使用出来ます。

以下の実装でTextureノードの代わりにCurvatureノードを使用しました。

結果です。

非常に綺麗なColoringが出来ています。

<Distributionノード>

これも2023-03-20のblogではMaskで使用する事はないと書いています。

こんなMaskをします。

砂漠とかのMacro Varianceとして使用出来そうです。

岩肌の部分のSatMapノードに使用してみました。

結果です。

うーん。かなり良いです。

<Ditherノード>

これも以下に示した様な白黒の模様を付けます。

Textureノードの代わりに使用して

砂漠などに以下のようなMacro Varianceを追加する事が出来ます。

<ProTrusionノード>

これもTextureノードの代わりに使用出来ます。

が以下の実装で

こんな結果になりました。

<RockMapノード>

ここから2023-03-27のBlogのまとめを読む事になります。

RockMapノードの結果です。

なんか独特の芸術性があります。

以下の実装で使用します。

結果です。

どっから見ても凄い綺麗なColoringになりました。

<SurfTexノード>

これもTextureノードと同じタイプのNodeで以下のようなMaskを行います。

以下の実装で使用すると

こんな結果になります。

うーん。

これも凄い綺麗です。

<Velocityノード>

これもTextureノードと同じタイプです。

こんなImageになります。

結果です。

うーん。

これも凄い。

特に以下に示した様な砂浜の模様が凄い綺麗です。

これでTextureノードと同じタイプのNodeを全部調べました。

<Data GroupのTextureノードタイプのまとめ>

GaeaにおけるMaskの基本の形が以下の様になっているとは、全く気が付きませんでした。

この実装でData GroupのMaskを作成するNodeは2か所で使用されています。

この①で示したTextureノードの箇所で使用されるMaskは以下に示した様な

UEのMaterialでいうMacro Varianceと同じ効果を追加するためのものでした。

GaeaのData GroupのNodeは何回か勉強しましたが、こんな目的のために使用されるとは、今の今まで気が付きませんでした。

これはかなりGaeaの理解が進みました。

来週はこの基本の形状の②の部分にあたるNodeについて検証します。

7. Houdiniの勉強

Houdiniは先週から始めたFOUNDATIONS | OVERVIEW [2]の復習の続きをやります。

7.1 FOUNDATIONS | OVERVIEW [2]の復習の続き

2023-02-13のBlog

Geometry LayerのNodeの操作について勉強しています。

以下に示した様なNodeの繋ぎ方などの基本的な操作方法です。

以下の操作方法が紹介されていました。

  • Y+MouseでLineを切断
  • 切断したNodeをJ+Mouseで繋ぐ
  • Nodeを間に挟む方法
  • CursorをNodeに重ねた状態でAlt+左ClickでそのNodeの複製が作れる
  • CursorをNodeに重ねた状態でAlt + Ctrl + Shift+左ClickでNodeのReference Copyが作成出来る
  • 線の上でAltを押しながら左ClickするとUEのRe Routeのような点が作成出来る
  • Nodeの形状を変えたり、色を変える方法
  • NodeにCommentを残す方法
  • UEのBPにおけるComment機能と同じものの作成方法
  • 複数のNodeをまとめて一個のNodeに変換する方法

だいたいこんな事を勉強していました。

更に次のTutorialであるParameterも勉強しています。

ここではParameter Paneの操作方法を学でいます。

以下に学んだ内容をまとめました。

  • MouseのMiddle Buttonを押すとBoxが表示され移動する単位を選ぶ事が出来る。
  • Paste Relative Referencesを使用して2つのObjectの動きを同調する方法

ここからはTime Lineの操作方法についてです。

  • Kを押す事で以下のKey Frameに位置や角度を記憶させておく事が出来る
  • MotionFXの使用方法

この週は結構、Houdiniの勉強をしていますね。

2023-02-19のBlog

Motion FXの使用方法を勉強しています。

これの事です。

使い方の説明が書かれていましたが、実際にこのBoxを開いて比較しないと意味が分かりません。

次のTutorialであるSelect Objectsも勉強していました。

ここではScene ViewにあるObjectの選択方法について勉強していました。

以下の内容を勉強しました。

  • Scene Viewの左側にあるToolの中の矢印のIconをClickするとObjectを選択出来るようになる
  • Object上で左ClickすればそのObjectを選択出来る
  • Object以外の場所で左ClickするとBoxが表示される
  • Ctrlを押しながら、選択されているObjectを左ClickするとそのObjectは選択から外れる
  • Shiftを押しながら、選択されていないObjectを左Clickすると、その前に選択されていたObjectはそのまま選択された状態で、更に新しいObjectを選択した状態になる
  • 矢印が選択されていない状態でもSを押しながらObject上で左ClickするとそのObjectを選択する事が出来る
  • (矢印が選択された状態で)Aを押すと全部のObjectが選択できる
  • (矢印が選択された状態で)Nを押すとその選択されたObjectの選択が全部外れる

大体、こんな感じでした。

次のTutorialであるSelect Geometryも勉強しています。

  • Smooth Wire Shadedを使用するとObjectのGeometryを表示できます。
  • Scene Viewの右端にある白い点のIconを使用してVertexを表示します。
  • PointやEdgeを使用する事で表示されたVertexやEdgeを選択する方法
  • EdgeをDouble ClickするとそのEdgeに繋がっている全てのEdgeを選択する
  • Faceを選択する方法
  • 選択したFaceの裏のFaceは選択されないようにする設定
  • GeometryのそれぞれのGroupだけを選択する方法
  • Paint Brushを使用してFaceを選択する方法

を勉強しました。

2023-02-26のBlog

Select Geometryの続きを勉強しています。

  • Shiftを押しながら選択すると追加で別な箇所を選択する事が出来る
  • Ctrlを押しながら選択した箇所を選択するとその部分が非選択になる
  • を選択した状態で、どこのFaceでもいいのでその上でDouble ClickするとそのObjectのGroup全体が選択される

  • Nを押すとObject全てのFaceが選択される
  • FaceでLoop上に選択する方法
  • 選択したFaceをPointに変換する方法
  • の使い方

以上を勉強しました。

2023-03-06のBlog

Accessing Toolsを勉強しています。

ここではHoudiniを使用してCupを作成しています。

以下に示した様なCupが砕ける所まで作成しました。

2023-03-13のBlog

Accessing Toolsの続きを勉強しています。

先週のDataをSaveするのを忘れていたらしくまた一からCupを作成しています。

その過程で、以下に示した様にCupの取手が捻じれてしまい

何度やり直してもその捻じれが直せない状態になってしまいました。

Default Pairing Shiftの値を1に変更すると

直りました。

後は特に問題なく最後までやって終わっています。

2023-03-20のBlog

Tool Workflowを勉強しています。

このTutorialでは以下の形状を作成しています。

勉強しながら作成するのは大変なので、この週ではやり方をBlogに書き出していました。

しかも途中でGive Upして残りは来週やると書いてありました。

2023-03-27のBlog

Tool Workflowの続きを勉強しています。

それが終わったら今度は実装をしています。

以下の部分までやりました。

2023-04-10のBlog

一週間の休憩を挟んでいます。

Transform Objects and Geometryを勉強しています。

あれ、先々週の残りは?と思ったら

こう書かれていました。

3つのObjectを使用してそれぞれ別な内容を勉強しています。

Rubber ToyではObjectにAnimationを追加する方法を勉強しています。

SquabはPivot Pointの移動のさせ方を勉強しています。

Pig Headでは

Pointを選択したり、一般の3D Softで行うようなObjectの形状を変化したりするやり方を勉強しています。

2023-04-17のBlog

先週勉強したTransform Objects and Geometryを実装しています。

Construction Planが何なのか不明で調べています。

  • Construction Planeと言う座標を使用している時にObjectを移動させると、左右にしか移動しない事だけが判明しました。
  • Shiftを押すと今度は上下だけの動きになります。

後は特に問題なく実装していました。

これでFOUNDATIONS | OVERVIEW [2]の勉強は終わりです。

<勉強した内容をまとめた感想>

うーん。

結構、勉強した内容を忘れているかと思ったんですが、そんな事は無かったです。

それなりには覚えていました。

まあ、これは基礎の基礎なのと、初めてHoudiniを触ったのを考慮するとこの位出来ていれば十分な気がします。

この後ですが、いわゆるProceduralな3Dの制作方法を勉強したいです。

特に建物の作成方法を知りたいです。

7.2 次のTutorialを探す

以下のProject-Based Learningを勉強する事にします。

もう基礎は飽き飽きしていますので、今度は一寸背伸びしても何かを作成してみたいです。

丁度建物をProceduralで作成するTutorialがありました。

MODEL A PROCEDURAL HOUSE [14]と書かれていました。

全部で8回のTutorialですね。

最初のIntroductionだけ見てみます。

見ました。

20秒しかないIntroductionでほとんど何も説明してないと同じでした。

よく見ると18.5を使用しています。

私のVersionは19.5でした。

19.5のTutorialでは以下のがありました。

なんとこっちのTutorialは無料じゃなかったです。

19.5でProceduralな方法で建物を作成するTutorialは他に見つからなかったです。

19.0なら以下のTutorialがありました。

しかもYouTubeにTutorialがUploadされていました。

Castle Wall Tool [15]と言う名前でした。

多分、これもProceduralな方法で作成しているんでしょう。

最初のTutorialを見たら以下の様に説明していました。

うん。

来週からこのTutorialを勉強する事にします。

7.3 GDCの動画

Epic Game社がGDCで発表したHoudini関連の動画がYouTubeにUpされていました。

これも見る事にします。

と思ったら流石に時間がないのでこれは来週やる事にします。

8. UEFNの勉強

YouTubeにEpic Game社がGDCで発表したThe Verse Programming Language | GDC 2023 [6]がUploadされています。

まずこれを勉強する事にします。

8.1 The Verse Programming Language | GDC 2023 [6]を見る

まず軽く見ました。

結構理解出来ない所がありました。

まずTransactionの定義が分かりません。

Game内で買い物をする事をTransactionと呼びますが、それを指していない事は明白です。

Multi-Threadにおける一つのThreadの作業を指してると考えると辻褄が合うような気がしますが、それでいいんでしょうか?

一寸だけ調べます。

調べました。

あんまり深い所は分かりませんが、Transactionの例で出て来る銀行の預金を移動させる話やお金を払って本を買う話は、別に複数のThreadで行う必要は無いと思います。

なので普通に実行してもTransactionの例にあるようなお金を払ったけど本がもらえない。とか預金を移動している間に預金が消えてしまったと言う結果が起きる可能性はそんなに高くない気がします。

これらの例って適切なんでしょうか?

あんまりDatabaseとのやり取りについての見識がないので、その辺がよく分かりません。

Databaseとのやり取りも実際はMultithreadで行っているんでしょうか?

それともConcurrencyの問題で、お金を払ったけど本がもらえない。とか預金を移動している間に預金が消えてしまったと言う結果が起きるでしょうか?

まあそれくらいの理解しか現況出来ないので、それでこの動画の内容を理解出来ると仮定して先に進むしかないです。

後、Verseを使用してObject-Orient的なProgrammingを書いても良い。というか別にFunctional Programmingを強制するつもりはない。と答えていた気がします。

この部分は確認します。

後、心に残ったのは、Verseは他の言語が既に解決した問題をもう一度解くために開発したのではく、これからMetaverseの時代になるに当たって解決しなければならないProgrammingの問題を解決するために作成された言語で、しかもFortniteの世界的な成功が、資金面からもそれを可能にした。というような内容を言っていた事です。

これを私なりに解釈するとVerseが次世代のC++のような主力の言語になる可能性は十分にある。という事です。

それではもう少し詳しく見ていきます。

<Metaverseとは?>

いきなりMetaverseについての解説から始まります。

MetaverseってFacebookの詐欺のやつだろ。何でUEのように真面目に3Dをやっている会社がそんな怪しげな名前を使用するの?

とかなりびっくりしました。

後で知ったんですが、Tim Sweeney氏の方がFacebookより先にMetaverseと言っていたそうです。

こっちが本当のMetaverseなんだそうです。

一番目は分かりますね。

今の所、SNSの主流は2次元です。これを3次元に拡張したのがMetaverseだと言う事です。

2番目のDecentralized ControlされたEconomyって具体的に何を指しているんでしょうか?

貨幣というか通貨の価値って国が保証するから成り立つ訳で、それって結局はCentralizedされている訳です。

仮想通貨を指しているんでしょうか?

もしかしたら有名なSF作品があってその世界では有名な考え方なのかもしれないです。

この辺は前提条件が分からないので何を言いたいのか分かりません。

最後のみんなが参加出来るPlatformというのは分かります。

MMDが流行った時みたくProgrammer、Animator、Musician、そして見るだけの人、みんなが参加できる仮想空間を作成するという事です。

総括として以下のようにまとめられていました。

私が超訳すると、

  • いろいろな商品(Software)が並べられている店の正面は、Metaverseじゃない。
  • 動いている環境内で常にUpdateするのが可能である。かつみんなのCodeやみんなの作品が動的かつ同時に動くのがMetaverseである。

うーん。

結構混乱してきました。

Interoperate dynamicallyが動的にInteroperateするって意味かもしれません。

でも静的にInteroperateする事ってあるんでしょうか?

Software Aが動いたらApp Bも同時に動く事を、Software AとApp BがInteroperateする。って言います。

これって動的ですよね。静的につながる事もあるんでしょうか?

この辺は一寸曖昧です。

でも大体Epic Games社の目指すMetaverseが何なのかが分かってきました。

具体的に解釈してみます。

「動いている環境内で常にUpdateするのが可能である。」って言うのは、

「明日はServerをUpdateするのでGameは出来ません。」という事はないって意味でしょう。

Serverを修復している間も、みんなはGameをPlayし続けられる状態が保てる。って意味です。

みんなのCodeや作品がInteroperateする。

これは誰かが作成したCharacterをMetaverse空間に上げると、上げた瞬間からみんながそのCharacterと会話したり出来るって事でしょう。

何となくですが、Epic Games社が描くMetaverseが見えてきました。

動画の先を見ます。

はい。

Interoperateの具体例が説明されていました。

ある人がCharacterを作成してMetaverseにUpdateします。また別のある人が車を作成してMetaverseにUpdateします。

Metaverse内でそのCharacterを操作する人はその車に乗れないと困る訳です。

今のGameでは、テストにテストを重ねてそれを可能にしている訳です。

しかしMetaverse内ではそれをテスト無し、かつ一発で成功させる必要があります。

これを可能にする技術をInteroperate Dynamicallyと言っている訳です。

うーん。

凄い!

これを可能にするためには、Metaverseを構成するためのProgramming 言語は、以下の要求を満たす必要があります。

Programmingを全く知らない人でも学ぶ事が出来る習得が容易な言語である事。

コレコレ。

これが聞きたかった。

しかしこれを目指しているだけでこれが可能になるかどうかはまた別問題です。

Epic Games社は前にもUEのC++の講座を落ちこぼれ社員に作成させて、とんでもない質の低い動画を連発していました。

もうその当時の公式のUEのC++のTutorialの支離滅裂さは、

C++知らなくても良い。―>Templateを最初から使用。―>変数を1時間かけて説明

みたいな感じで「あんたらは学習者に何を期待しているの?」と画面に突っ込み入れたくなるくらいでした。

当然、その講座を履修しても何も身につかない結果を生み出し、UnityがC#初心者でもそれなりにGameを作成出来るようになっていくのを後目に、とんでもない数の落ちこぼれを量産していました。

しょうがないので私は公式のTutorialで勉強するのは諦め「Unreal Engine 4 Scripting with C++ Cookbook」で勝手にUEのC++を勉強していました。

この本も色々問題のある本でしたが、少なくとも及第点はパスしています。

Verseは基本的にはFunctional Logic型の言語であり、身に付けるのは相当難しいはずです。それを小学生にでも分かるように説明出来る能力を持った人は極一部にしかいないでしょう。

そういう人が積極的にVerseを教える講座を作成するかどうかは、Epicがその講座を作成する人に対してどれだけ経済的に支援するかに掛かっています。

非常に分かり易いUE4のBlueprintのTutorialを作成していたMathew Wadstein氏も2年前から活動を停止してしまいました。

Epic Games社から全く評価されなかったら、まあそうなりますね。

今までのように落ちこぼれ社員に講座を作成させていたり、非常に分かり易い優れた講座を作成する人をガン無視していたら、Verseを使用するContents Creatorは誕生しないでしょうね。

Epicがこのあたり言行一致するか、それとも口先だけで終わるのかは要注目です。

残りは技術的な内容でこの辺は完璧にこなせる自信があるんでしょう。

Tim Sweeney氏の説明を聞いているとJavaScriptと同じ立ち位置を狙っているみたいですね。

100万人が同時にTransactionしたとしても普通に動くProgramming言語が、どれくらい革命的なのか、その辺の事情に疎い私はピンと来ません。

Haskellとかだと既にそういう事は可能なのか、それともVerse以外にはそういう事は理論上も出来ないのかとかよくわかりません。

この辺の情報はVerseの勉強をしている内に自然と集まって来るでしょう。

<Verseについて>(7:00~)

VerseにはClassがあるそうです。

うーん。

これ全く知らないんですがFunctional LanguageってClassがあるですか?

Bingで質問してみました。

うん。

ないです。

という事はやっぱりVerseは別にObject Oriented言語として使用しても良いみたいですね。

Mutabilityもあります。

FailureをBooleanの代わりに使用すると言っていますが

これがFunctional languageなんでしょうか?

要は、変数を使用しない事で予測できない状態を無くすための処置ですよね。

Object OrientでProgrammingを書けるようにしてるんだから、ここだけこだわる意味あるんでしょうか?

Coroutinesの以下の機能は興味深いですね。

JavaScriptにおけるAsync Functionの機能を発展させたものだそうです。

グダグダ書いてもしかたないのでここでまとめます。

ここではVerseの基本的な使用方法を説明しています。

Functional Languageの利点を取り入れていますが、Object Orient的なProgrammingも出来るみたいです。

Object Orient的なProgrammingでも書けるとなると、みんなが使用出来る簡単に学習できるProgrammingは現実性がグっと上がります。

しかし厳密にFunctional Languageとして使用出来ないとなると今まで言っている記述的な革新を起こせるんでしょうか?

その辺の具体的な解決策が見えなかったですが、どうやらEpic Games社の開発者はJavaScript的な立ち位置をこの言語に求めていて、Functional Languageでガチガチに書きたい人や書かなければならない場所は、ガチガチに書いて、そうでない箇所はそれなりに緩く書いても普通に動くような形に持っていこうとしているみたいです。

何となくVerseの全体像が分かって来ました。

<Verse APIなど>(28:00)

ほら、MetaverseとWorld Wide Webを比較しています。

この時点で、VerseとJavaScriptを対比させて考えているのが分かります。

無理やろ。これ

World Wide Webは世界中の研究機関が協力して最初の基礎的なContentsを作成した訳ですが、世界中の科学者が動的でInteractiveな3Dを使用する必要ってないでしょう。

うーん。

タンパク質とかの構造を表示するのとかは逆に3Dじゃないと駄目なのか。

そういうところに需要はありそうですね。

Cadの図面とかも3Dで表現した方が楽な場合は多そうです。

そのあたりの層が入って来るかどうかですね。

まずはGameでしっかりバグなしで動く事を示して、その後で企業や研究機関の参入を促す訳です。

それなら行けそうです。

おー。

思ったより未来はありそうです。

Gameに関してのRoadmapを公開していました。

これは、多分可能でしょうね。

2年後に、AAA Gameの質でMetaverseが出来る様になったらEpic Games社への評価はうなぎのぼりでしょうね。

なんせ今のMeta(旧Facebook)が出来なかった事をEpic Games社なら出来る事を示す訳で、少なくとも今のMeta(旧Facebook)以上の評価になる訳です。

そうなったら今のMetaverseへのNegativeな評価も吹っ飛ぶでしょう。

その後で、企業や研究機関がClosedで参加出来るMetaverseの価値が出て来る訳です。

よく考えたら、世の中にはタンパク質の構造のように3Dで表現しないと絶対に分からないものだけじゃなくて、平面で表現しても理解出来るけど3Dで表現した方が全然分かり易い分野は幾らでもある訳です。

あー。

これはMetaverseの時代、来ますわ。

今のChat GPTどころの騒ぎではないTrendが来ますわ。

そういえば、Gadget系のYouTuberの人が一億円の家を買ったら車庫に車が入らない事が判明して大騒ぎしていました。

こんなのもMetaverseであらかじめ家を建てて、3カ月位Avatarで生活したらそういう問題にも家を建てる前に気が付く訳です。

現実で失敗したら終わりだから、Metaverseで一応試しておきたいことは幾らでもあります。

もう時間が無くなってしまいました。

今週はここまでとし、続きは来週まとめます。

9. YouTube動画の作成

もう時間がなくなってしまったので、今週のYouTubeの動画の作成は無しにします。

<先週書いた任天堂英語圏のInfluencerからボコボコに叩かれている件の続きについて>

でも、先週書いた任天堂英語圏のInfluencerからフルボッコにされている件に凄い進展が有ったのでそれについてだけはまとめます。

以下の件です。

なんと和解したみたいです。

このYouTuber、Emulatorを使用した動画や任天堂に脅迫されていると暗にほのめかしている動画を削除した代わりに新しいZeldaのGameを先行してPlayする権利を貰ったらしくて、もう完全な任天堂の信者になっています。

凄い。

こんな解決方法があるのか。

長年、アメリカで暮らした私にとって勝負は勝つか負けるかしかないです。

負けたら終わりなんで勝つために全力以上の力を出して戦うしか選択肢は無い訳です。

それがこんなWin-Winな解決方法を実行するなんて。

脱帽です。

日本文化の優秀さを再確認しました。

しかし、先週本当はこのYouTuberや他のInfluencerのYouTubeの動画をReferenceに示して実名で書こうと思っていたんですが、止めて良かったです。

YouTubeに作成する動画は曖昧な表現にとどめて書くStyleで行く事にします。

共和党が無くなるかもしれない気がしています>

これも小さな話題なんで、ここにまとめておく事にしました。

最近、思っているのがアメリカの共和党が、消滅するんじゃないか?という事です。

昔、Obama氏が大統領選に出た時、私はObama氏が大統領になると断言していましたが、私の周りにいた日本人は誰一人私の意見を信じませんでした。

後からその理由を聞いたら、「黒人が大統領になるなんて、絶対にあり得ないと思っていた。」と言っていました。

聞いた人全員が同じ意見でした。

これと同じと言うか、共和党が消滅するなんて絶対にあり得ないと思っている日本人(アメリカ人も)って結構多いと思います。

でも私が見た感じ、良い事か悪い事は別にして、これ結構な確率で起こりそうです。

Fox Newsに代表される宗教右派は嘘つきまくって、アメリカの世論を動かしてきました。

ところが、とうとう嘘の代償を払うTurnになってしまったんです。

今回、Fox Newsが$787.5 millionのお金を払わなければならなくなったのはその最初の一歩なんです。

この後もFox Newsは別な会社から同じ件で訴えられていますので同様の賠償金を払う可能性があります。

更にトランプ氏の後継者として共和党が選んだFlorida(フロリダ)州知事のDeSantis氏もDisneyから訴訟を起こされました。

それで突然、思い出した話があります。

これはアメリカに行ったばっかしの時なんですが、大学にConspiracy Theory(陰謀論)ばかり話すアメリカ人がいたんです。

この人、学生でもないのに大学に一日中いて、誰にでも自身の独自の陰謀論を話すんです。

誰も相手にしなかったんですが、私は英語の勉強に持ってこいと思い、ひまさえあればその人の話を聞いていました。

その人がある日、DisneyはFlorida州より権力があってFlorida州に許可をもらわなくても原子爆弾を作る事が出来る。と言っていました。

その時の私は英語がそんな得意じゃなかったので、ほー。とか相槌打つので精一杯でしたが、後から考えて流石にDisneyに原子爆弾を作る権利はないだろう。と思いました。

ところが、最近、Florida(フロリダ)州知事のDeSantis氏とDisneyの争いのNewsを聞いていたら、そのNewsのAnchorが

「DisneyはFlorida州に許可をもらわなくても原発を作る事が出来る。」

って言っていました。

それで思い出したんです。この話を。

そして気が付きました。

私がその時、Nuclear Plant(原発)とNuclear Bomb(原爆)を聞き間違えていた事を。

うーん。

今になってなんかすごい恥ずかしくなりました。

まあ、それはともかくとして、Conspiracy Theory(陰謀論)がオカシイのは、そういう事を述べる人達のほとんどが前提としている事実が間違っているからで、Conspiracy Theory(陰謀論)自体は一つの推論ではあるんです。

そして、Conspiracy Theory(陰謀論)ばかり話すアメリカ人の話を今思い出してみると、それなりに整合性がある事、実は言っていたと思いました。

そしてその人が言っていた事を今、思い出したらそれなりに当たっている事もありました。

そしてある推測をその人が言っていたのを思い出したんです。

それはアメリカの真の支配者が誰か?と言う話で、その人によると

One Pieceのイム様みたいな存在がいて、その人がアメリカの真の支配者だ。と言っていたんです。

ところが、共和党がその人に逆らっているので、その人も本当の力を発揮する事が出来ないで膠着状態でいる。って言っていました。

で、ネタバレをするとそのアメリカの真の支配者はイギリスの国王の事で、それに逆らってアメリカの利益を守っているのが共和党なんだそうです。

そして民主党は、実際はアメリカ人の利益を守る事には興味がなくて、アメリカにおけるイギリス国王の利益を守るために働いているだけだと、その人は言っていました。

今、この意見を思い出すと、勿論、滑稽に聞こえますが、それなりに真実な面もある気がします。

Biden大統領も学生ローンの免除についてなにも対策を取らなくなりました。

民主党が本当に個々のアメリカ人の利益を考えているなら、学生ローンの免除は最も早く解決しないといけない問題でしょう。環境問題とかよりもっと大切な問題です。

この辺を見ると民主党が本当に個々のアメリカ人の利益の事を考えているのか疑問が残るのも事実です。

ここで最初に戻りますが、共和党が消滅した後のアメリカはどうなるんでしょう。

イギリス連邦の一員に戻って、かつての植民地のような存在に成り下がる気がしますね。

そうなったら、かつての日英同盟のようにイギリスは中国やロシアとの対決で勝利するために、アメリカより日本を重視するようになる気がします。

うーん。

正直、共和党が消滅しても日本が不利益を被る事は無い気がします。

10. DirectXの勉強

10.1 Olympus Engine Projectの勉強

10.1.1 先週の復習

先週何を勉強したのかを忘れてしまったので、復習からやります。

先週のBlogを読みました。

先週、何を勉強したのかを思い出しました。

Blank ProjectにあるApplication ClassがOlympus Engine ProjectにあるIApplication Classを継承出来るようにする実装をしたんでした。

その時、以下に示した様にBlank ProjectにあるReferenceを使用しました。

これの機能がよく分かっていません。

先週もまとめで

と書いていました。

10.1.2 Referenceの復習

まず機能についてですが、2023-04-17のBlogで既に解明していました。

だそうです。

これ先週の実装でも

ReferencesにOlympusを追加したら

IApplicationのErrorが消えた事からもDllをIncludeする機能があるのは間違いないです。

10.1.3  C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [3]のFinishing Touchesを勉強する

これだけだと短いのでTutorialの次の節も勉強する事にします。

まず軽く全体をみます。

Blank ProjectにあるWinMain()関数を消して、Olympus Engine ProjectにあるWinEntry.hからProjectを起動出来るようにCodeを改造しています。

思っていたより3倍くらい難しい話をしています。更にこの節、10分以上あって一回見ただけでは全体の流れを追う事が出来ません。

今週は半分だけまとめる事にします。

Blank Project内にあるWinMain.cppにある以下のWinMain()関数をComment Outします。

次にOlympus Engine ProjectにあるWinEntry.hを開きOlympus.hをIncludeします。

そして先程のComment OutしたCodeをここに追加します。

Curly Brackets内の実装を全部消します。

ここからWinMain()関数を呼び出すようにするんですね。

まだ全体像がよく分かりません。

今度は、Blank ProjectのReferenceをOlympus Engine内で使用する必要があります。

うーん。

これってよく意味が分かりません。

Olympus EngineはGame Engineですので色々なProjectで使用する訳です。

ここでBlank Projectだけ呼び出せるようにしても、他のProjectを作成した時はどうするのでしょうか?

今、ここで考えても分かる訳ないので先を見ていきます。

次ですが、以下の実装を追加しました。

うーん。

IApplication ClassにEntryApplication()関数を作成するんでしょうね。

でも何でExternを使用しているんでしょう。IApplication ClassとWinEntry Classは同じProject内にあります。

同じProject内にあるClassを呼ぶのにExternって必要でしたっけ?

調べます。

分かりました。

うーん。

完全にExternの使用方法を忘れていました。

Extern – C and C++ Extern Keyword Function Tutorial [16]に分かり易い説明がありました。

まず基本のおさらいからですが、ExternはFileを跨いで使用する時に必要になります。

しかしC++ではExternをわざわざ書かなくてもExternがあると仮定してCompilerは解釈してくれるので他のFileで作成したClassやFunctionがExternを使用しないで宣言していたとしても使用する事が出来ます。

ここで、Externのもう一つの使用方法として、変数を宣言する時に使用するのがあります。

今はDeclareだけしかないけど、後でDefineするのでDefineされたものとしてこの変数を扱ってください。

と言う意味で使用します。

はい。

これでこの実装の意味が分かりました。

Extern で関数を宣言だけしています。

このEntryApplication()関数はIApplicationを返す関数です。実装はまだしていません。

でもWinEntry()関数内で使用したいので、Externを付けておきます。

こういう意味でした。

うーん。

Externの説明を読んだらすぐにこの機能を思い出しましたが、すっかり忘れていました。

Tutorialの説明を聞き直したら、しっかり言っていました。

このEntryApplication()関数の実装はBlank Project側でするのでExternをつけておく。

IApplication.hをIncludeしてErrorを消します。

IApplication*のErrorが消えました。

今度はIApplication.hを開き以下のMacroを追加します。

これはENTRYAPP(x)と打ったら、その後のFunctionと同じと解釈しなさいと言っているはずです。

このNewの意味が分かりません。

調べます。

うーん。

分からん。Newの後にくるのはClass名なら分かります。でもXって変数名ですよね。New 変数名って使い方があるんでしょうか?

いやそれ以前にこの関数の意味が分かりません。Return ValueのTypeはIApplication*である必要があります。

調べたんですが、よく分からなかったです。

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

この後Application.cppを開き

WinEntry.hをIncludeします。

そして先程作成したMacroのENTRYAPP(x)を使用します。

お、ここでxにApplicationをPassしていました。

これなら分かります。

ここでTYPOが発覚しました。

IApplication.hの以下のMacroのEntryPoint()はEntryApplication()の間違いでした。

するとWinEntry.hの以下の宣言の実装になりますね。

あ。

成程。

これでBlank ProjectのApplicationをOlympus Engineに呼べるんだ。

更に言うと、Olympus Engineの実装を変更しなくても、それぞれのProjectで別のApplicationを呼ぶことが出来るようにもなります。

うーん。

でも完全には理解出来ていません。

次にWinEntry Classの以下のErrorを消す実装を追加します。

IApplication.hを開き以下のCodeをClassの外に追加します。

これでErrorが消えたはずです。

消えていません。

Objectの名前がFunctionと同じだったのでそれがErrorになっていました。

Objectの名前を変更したらErrorが消えました。

頭がこんがらがってしまったので今週の勉強はここまでとします。

兎に角これでOlympus EngineのWinEntry ClassのEntryAppにBlank ProjectのApplicationを呼び出す事が出来るようになりました。

まだ、これで何故出来るのかがよく分かっていません。

でもこの部分を理解出来たら今までGame Engineの構造で謎だった別のProjectを呼び出して実行する。という部分が理解出来るようになるので、来週、この部分を検証する事にします。

10.2「DirectX 12の魔導書」の勉強

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

今週も先週の復習からやっていきます。

あー。一寸だけ思い出してきました。

ViewとDescriptorがあるやつです。

先週のBlogを読み切りました。

Descriptorがどんな存在であるのかやっと理解した訳ですが、その理解の過程を過去のBlogにさかのぼってまとめています。

特に日本人はその傾向が強いですが、正解しか書かないで、何でその答えに辿り着いたのかの道筋を全く教えない人が多くいます。

また日本社会もそれのみを良しとし、正解に辿り着くまでの道程を非常に軽視する傾向にあります。

こういう説明も大切ですが、やっぱりその正解に辿り着く過程も同じ位大切なんです。

そういう中で、Descriptorの正しい理解にどうやって到達したのかを時系列上に正確に記載した今回の記録は非常に貴重な存在だと自負しています。

これらは、これからDirectX12を勉強する人やDirectX12を教える人達にとっての本当に役立つ資料になるはずです。

10.2.2 「3.3.5 Render Target View (RTV)」の続きを読む

で今週何をしようかと考えたんですが、先週は「3.3.5 Render Target View (RTV)」の前半しか読んでいませんので、今週は後半部分を読む事にします。

<Descriptor Heap>

これは文字通りDescriptorを保持するためのMemory領域を確保するための物です。

ただ教科書を読んでいると、DescriptorそのものをDescriptor Heapに割り振っているのか、DescriptorのViewを割り振っているのか、その辺がよく分かりません。

あれ、教科書のDescriptorのところを読み直してみたら、ViewはDescriptorでもある。って書いてありました。

先週の私の理解ではDescriptorって色々なViewやSamplerが集まって一個のDescriptorを形成していると思ったんですが、そうじゃなくてViewはViewでありかつDescriptorでもある。って意味にとれます。

そしてSamplerはViewではないけどDescriptorではある。と言う意味で書いてあるのかもしれません。

そう解釈すると、今週のDescriptor Heapの説明でDescriptor Heapの中に直接Viewが入っているのも納得です。

うーん。

どっちが正しいんでしょうか?

その辺の謎は、実装する時に解明されるでしょう。

でも今週の説明の方が正しい気がします。

その理由は「HLSLシェーダーの魔導書」でDescriptor Heapの説明をした時に以下の説明をしているからです。

ここで言う定数Bufferは「HLSLシェーダーの魔導書」で独自に作成されたConstant Buffer Classの事を指している可能性もありますが、ここでは単なる定数Bufferを指していると仮定して話を進めます。

定数Bufferの機能を指定、もしくは説明するのがViewなので、沢山のViewが載っているというImageの方が上記の説明にあう気がするからです。

このDescriptor Heapの説明は、先週も書きましたが「DirectX 12の魔導書」と「HLSLシェーダーの魔導書」で凄い違っている気がしています。

これが今の解釈だと、かなり同じになって来たって感じがしますので、こっちの解釈の方がより正解に近づいていると思っています。

<Descriptor Heapを作成する>

DirectX12におけるDescriptor Heapの作成方法について解説しています。

簡単にまとめるとID3D12Device interfaceにあるCreateDescriptorHeap()関数がDescriptor Heapを作成します。

公式SiteのID3D12Device::CreateDescriptorHeap method (d3d12.h)[17]によると

この関数は以下のParameterを取ります。

これらのParameterについての簡単な解説をしていました。

<Swap ChainのMemoryと紐づける>

ここでは先程作成したDescriptor HeapとSwap ChainのBufferを関連づけています。

手順がかなり複雑で、理解するのに何回か読み直す必要がありました。

以下に手順をまとめます。

Double Bufferingには2つのBufferを使用します。のでDescriptorも2つ必要になります。

それぞれのDescriptorをDescriptor Heapに紐づける必要があります。

のでFor Loopを使用するそうです。

まずFor Loopの回数ですが、今回は2回である事は自明です。

TutorialではそうでないときのためにLoopの回数を知る方法を2種類紹介しています。

この辺の具体的な実装はskipします。

For Loop内の実装ですが、基本的には以下に示した2つを行っているだけです。

教科書の説明だけ読んでいると、これらのMethodで使用されているParameterの非常に複雑な設定に振り回されて全体の流れが分かりにくくなりますが、基本的にはこれだけをやっています。

まず以下に示したDXGISwapChain interfaceのGetBuffer()関数を使用して

Swap Chain内に保持されているBufferを取り出します。

次に、このBufferを使用してRender Target ViewをID3D12Device interfaceのCreateRenderTargetView()関数を使用して作成します。

の2つを実行しているだけです。

ただし、CreateRenderTargetView()関数の三番目のParameterの値を計算するのは一寸複雑で、その計算をその後、行っています。

Sample Codeでは以下の実装で計算していました。

教科書では別な方法で計算していました。

このようにここからどんどん派生して複雑にはなっています。しかしこの基本を理解しておけば、途中で迷子になる事は無くなるでしょう。

今週の「DirectX 12の魔導書」の勉強はここまでとします。来週はこの部分の実装を行います。

10.3 「HLSLシェーダーの魔導書」を勉強する

10.3.1 先週の復習

これも何を勉強したのか忘れてしまったので復習からやります。

「3. 1. 7 ワールド行列を作成して三角形を動かしてみよう」を実装したんでした。

その感想として

以下のすこし辛めの感想を書いています。

でも途中で結論を出すより取りあえず最後までやるべきと言う結論になりました。

10.3.2「3.2 Texture Mapping」を読む

ので、今週は次の節である「3.2 Texture Mapping」を読む事にします。

まあ、軽く読んで全体の流れを掴みます。

読みました。

色々な点で興味深い話がありました。

以下にまとめます。

まずTextureのUV座標の説明で左上が原点になっていました。DirectX12でもTextureの原点は左上で、下と右に向かって数字が増えるようになっていました。

VertexにUV座標を追加するところで、

TextureのDataはGPUとCPUのどちらのMemoryに保存されるのか?とかの話がありました。

この辺の話は面白かったです。

ただUEの設定でPool Size VRAM Percentageの値を0に指定した場合はどうなるんでしょう。

TextureのDataの保持にVRAMは使用しないけど、GPUがVRAM以外のMemoryに読み込んだTextureのDataを保持させる訳で、

そうなった場合、普通にCPU側のMemoryをGPUが拝借して使用すると思います。

この場合は、TextureのDataはCPU側に保存されていると言うべきか、それでもやっぱりGPU側に保存されていると言うべきなんでしょうか?

残りの気になった点は以下に箇条書きでまとめます。

  • 定数Bufferはb Registerを使用するが、TextureはT Registerを使用する
  • 三角形のPolygonのそれぞれのVertexにUV座標を追加したところ
  • TextureのRegisterはTになっているところ
  • LoadしたTextureをDescriptor Heapに登録したところ
  • HLSLでSamplerを使用しているんですが、これって「DirectX 12の魔導書」のDescription Heapの説明で出てきたSamplerと関係あるんでしょうか?

以上です。

実際に実装するのは来週試します。

今週の「HLSLシェーダーの魔導書」の勉強はここまでとします。

10.4「Direct3D 12 ゲームグラフィック実践ガイド」の勉強

10.4.1 先週の復習

先週は、もうほとんど勉強する時間がなくてBuffer Desc構造体の最後のMemberであるScalingについて調べただけでした。

以下に示した3つの選択があり

指定しない。Stretchしない、Strechする。の3つの機能のどれかを指定しています。

10.4.2 DXGI_SWAP_CHAIN_DESCの残りのMemberについて調査する

先週、Buffer Desc構造体の全部のMemberの調査が終わったので、残っている以下のMemberについて調べます。

<SampleDesc構造体>

公式サイトのDXGI_SAMPLE_DESC structure (dxgicommon.h)[18]から見ていきます。

まずCountからです。

Pixel毎にどれだれのSampleを取るかと指定します。

これは奥行の事を言っているんでしょうか?

Pixelより小さい単位でRasterizationしているとは思えません。どこまで奥行きの色を計算するのかをここで指定してるのかもしれません。

Qualityです。

数字が高い程、質が良くなる代わりに時間が掛かります。

教科書の説明も読みました。

大体同じ事を言っていました。

Countは1、Qualityは0を使用するそうです。

<Buffer Usage>

これはDXGI_SWAP_CHAIN_DESC structure [19]の説明が分かり易かったです。

Back BufferのSurface UsageとCPUからのAccess方法について指定する所だそうです。

CPUからのAccess方法は分かりますが、Surface Usageとはどういう事でしょうか?

Sample CodeではBuffer UsageにはDXGI_USAGE_RENDER_TARGET_OUTPUTが使用されていて

この機能について調べると、DXGI_USAGE[20]に以下の様な説明がありました。

これから推測するとSurface Usage の意味は、

Back BufferにはSurfaceと言う箇所があってそれの使用方法を指定する。

事のようです。

ここではRender Targetとして使用すると指定しています。

CPUのAccess方法については指定していないんでしょうか?

DXGI_USAGE[20]にはCPUらしきFlagもあります。

この5つのFlagを選択しなかった時のCPUからのAccessはどうなるんでしょう。

教科書もこの辺については全く触れていません。

これ以上は深堀出来ないので次に行きます。

<Buffer Count>

これです。

DXGI_SWAP_CHAIN_DESC structure [19]の説明から見ていきます。

Swap Chain内に保持するBack Bufferの数を指定するそうです。

じゃこの値は2。

と思ったらFrameCountとかになっています。

2になっていました。

教科書の説明も読んでおきます。

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

<Output Window>

DXGI_SWAP_CHAIN_DESC structure [19]の説明です。

ここにはHWNDを指定する所のようです。

教科書の説明を読むと、出力するWindowのHandleをパスすれば良いそうです。

<Windowed>

DXGI_SWAP_CHAIN_DESC structure [19]の説明です。

要はWindowを指定すればいいんだからTrueにしておけば問題ないでしょう。

DXGI_SWAP_CHAIN_DESC structure [19]ではその後で注釈を述べています。

その辺は後で必要になった時勉強します。

教科書はこのMemberの説明は無かったです。

<Swap Effect>

DXGI_SWAP_CHAIN_DESC structure [19]の説明から見ます。

あ、SurfaceってDouble Bufferingの画面に表示されている方の事じゃないでしょうか。

そう考えると全部辻褄が合います。

ここは教科書の説明が分かり易かったです。

Back Bufferを入れ替える時の効果をここで指定するんだそうです。

DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL かDXGI_SWAP_EFFECT_FLIP_DISCARDのどちらかを指定すれば良いそうです。

<Flags>

Swap Effectの説明は教科書が一番、分かり易かったから、教科書の説明から読んでいきます。

Swap Chainの動作Optionを指定するそうです。

ここで使用されているDXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCHだけ調べます。

教科書の説明は表示Modeが切り替えられるとだけ書かれていました。

うーん。

良く分かりません。

DXGI_SWAP_CHAIN_FLAG enumeration (dxgi.h)[21]の説明です。

WindowのサイズがFull-Screen Modeに代わった時にResolutionがそのMonitorのSizeにあうように変化するそうです。

はい。

理解出来ました。

これでDXGI_SWAP_CHAIN_DESCの全部のMemberの機能の調査が終わりました。

11. まとめと感想

今週も時間がないのでなしです。

12. 参照(Reference)

[1] CGHOW. (2023, March 31). Ribbon Fire in Unreal Engine 5.2 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=rVrZltluAuQ

[2] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[3] OlympusMonsTutorials. (2021, March 17). C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [Video]. YouTube. https://www.youtube.com/watch?v=YgZSSE3qZqA

[4] NumenBrothers. (2023, February 18). Let’s Build the RPG! - 56 – Landscape Cave Sculpting and Lighting – Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=EYwfDQK645Y

[5] Landscape Visibility Tool. (n.d.). https://docs.unrealengine.com/5.1/en-US/landscape-visibility-tool-in-unreal-engine/

[6] Unreal Engine. (2023, April 24). The Verse Programming Language | GDC 2023 [Video]. YouTube. https://www.youtube.com/watch?v=5prkKOIilJg

[7] renderBucket. (2023, April 23). Unreal Engine 5.2 - Crystal, Ice, Gemstone Materials Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=G31OTd69rYw

[8] renderBucket. (2023, April 23). Unreal Engine 5.2 - Crystal, Ice, Gemstone Materials Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=G31OTd69rYw

[9] Strata Materials | Course. (n.d.). Epic Developer Community. https://dev.epicgames.com/community/learning/courses/92D/unreal-engine-strata-materials/VXV6/unreal-engine-strata-intro-submitting-feedback

[10] CGHOW. (2023, April 24). Disintegration into Sand Unreal Engine 5.2 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=MdCY1VWtYKs

[11] Klaus. (2022, May 21). How To BUILD AN ISLAND In 20 mins | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Obfq-Zh3iXs

[12] Sea - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Water/Sea.html

[13] Texture - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Data/Texture.html

[14] Spevick, M. (n.d.). Model a Procedural House | SideFX. https://www.sidefx.com/tutorials/procedural-house/

[15] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[16] Chowdhury, F. H. (2022). Extern – C and C++ Extern Keyword Function Tutorial. freeCodeCamp.org. https://www.freecodecamp.org/news/extern-keyword-function-tutorial/

[17] Stevewhims. (2021, October 13). ID3D12Device::CreateDescriptorHeap (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createdescriptorheap

[18] Stevewhims. (2021, April 2). DXGI_SAMPLE_DESC (dxgicommon.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgicommon/ns-dxgicommon-dxgi_sample_desc

[19] Stevewhims. (2022, July 27). DXGI_SWAP_CHAIN_DESC (dxgi.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgi/ns-dxgi-dxgi_swap_chain_desc

[20] Stevewhims. (2021, March 15). DXGI_USAGE (DXGI.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/dxgi-usage

[21] Stevewhims. (2022, January 31). DXGI_SWAP_CHAIN_FLAG (dxgi.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgi/ne-dxgi-dxgi_swap_chain_flag