UE4の勉強記録

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

UE5の勉強 -映像作品としてのLandscapeを作成する-

1. 今週の予定

1.1 今週の予定

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

<Landscapeの作成>

建築用のLevelの作成の勉強の続きをやる

Niagaraの勉強>

NS_Mage_Fireballをアニメ調に改造する続きをやります。

<Materialの勉強>

Advanced Material Seriesの勉強の続きを勉強します。

<Gaeaの勉強>

Earth and Space Sciences XのTutorialを勉強します。

更にGaeaのTutorialを作成します。

<Houdiniの勉強>

Free Time Coder氏のUnreal PCG Tutorial [1]の続きを勉強します。

<UEFNの勉強>

インベーダーゲームを作成するためにUEFNのTutorialを勉強します

<DirectX12の勉強>

DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強をやります。

2. Landscapeの作成

今週もUnreal Engine 5 for Architecture - 2023 Full Beginner Course [2]を勉強します。

2.1 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]を勉強する

<Foliage Assets: Quixel/Marketplace>

Time Lapseの録画が壊れてしまったのでその部分はSkipするそうです。

動画が無くなっているのでかなりMaterialの貼り付けが進んでいます。

Treeの3D ModelはQuixel Bridgeにはあまり良いのが無いので以下のAssetを使用しろと言っていました。

以下の様に木を追加しました。

特に知らない技術は使用しませんでした。

<Camera Setup>

ここはあんまり知らないのでしっかり勉強する事にします。

まずCameraの設定をTweakする前にGlareの設定を調節します。

Cameraの事はよく知りませんがこれFlareの事の気がします。

Glareって怒った人の顔の事ですよね。

調べたらGlareであってました。

以下に示した様に暗い場所から明るい場所を見ると

かなりobnoxiousな映像だと言っていました。

Obnoxiousってどんな意味と調べたら「非常に不快」と出て来ました。

流石にそこまで酷くは感じませんが、GlareとBloomが強すぎとは感じました。

Post Process Volumeを選択して

Lens FlaresのIntensityを1から0.05に変更します。

こっちはGlareじゃなくてFlareなのね。

What is the difference between flare and glare [3]に以下のような解説がありました。

どっちも光がまぶしい様を表していますがFlareはLenseを通した変化のみを指すようです。

結果です。

正直、これでも明るすぎると思います。

空の青さが全く見えません。

今度はBloomのMethodをStandardから

Convolutionに変更します。

結果です。

Standardの時です。

Convolutionの時です。

Convolutionの時の方がBloomがボヤっとしています。

この後、更にIntensityを0.1にしています。

これで事前準備は終わりです。

Cameraの調整をやります。

まずCameraを追加しました。

Camera Folderを作成してその中にCameraを配置しています。

これは後から沢山のCameraを配置するための準備なんでしょうか?

Cameraの操作方法でPilotについて解説しています。

まずOutlinerからCameraを選択してPilot ‘CineCmaeraActor2’を選択します。

すると画面がCameraの映像に切り替わって

画面の操作と同じ方法でCameraを操作出来るようになります。

Best Positionを選択します。

ここからCameraの設定を変更していきます。

まずFilmbackです。

Cinemaに使用されているFilmのAspect比は以下の通りだそうです。

更に詳しく以下のSlideで解説していました。

Cinema用のFilmはかなり横長なんですね。

Cinema用のAspectに変更しました。

結果です。

うーん。

横長!

Focal Lengthについて解説しています。

Focal Lengthは簡単に言うとZoomと同じです。

上記の写真は全部同じ位置で撮影しています。Focal Lengthの厚みを増やす事によってもっとZoomしています。

しかしよく見ると単にZoomしているだけではありません。I

ImageがOrthogonalなProjectionをした状態に近づいています。

以下のImageはもっとProspectiveなProjectionからOrthogonalなProjectionに変化しているのが分かると思います。

ふーん。

これは全然違う。

Focal Lengthの値が大きい方が男前に見えますね。

こっちの例も面白いです。

こっちもFocal Lengthの値が大きい方が美人に見えます。

ただ奥の風景、特に道は35が一番きれいに映っていますね。

85だと後ろの風景はぼやけてしまっています。

ふーん。

Focal Lengthにはこんな効果があるのか。

Current Focal Lengthの値を35から90に変更しました。

結果です。

凄いFlatになりました。

でも本当の映画のワンシーンのようです。

画面が白過ぎますがこれを直したら本物と区別付かなくなりますね。

CameraをZoom outしました。

何とTreeが邪魔して建物が見えなくなってしまいました。

これを直します。

画面を4分割してTop ViewをUnlitに変更します。

ModeをFoliageに変更します。

Eraseを選択して邪魔な木を消していきます。

結局画面は元に戻してしまいました。

以下のIconを押すとCamera Viewから普段のViewに戻るそうです。

以下の様になりました。

うーん。

凄い。

Current Aperureの値を1.2に変更しました。

値が低い方がBlurringが増えるそうです。

Screenshotからは見えないですがFlickeringが起きています。

これは後で直すそうです。

今度はFocus Settingsの値を調整します。

Manual Focus Distanceの値をDropperで指定します。

ここでは建物を選択しています。

建物のFlickeringが直りました。

しかし建物の奥に配置されている木が絵みたいです。

Draw Debug Focus PlaneにCheckを入れます。

画面が紫色になりました。

この機能はとてつもなく面白いです。

Manual Focus Distanceの値をいじると以下の様に紫がCoverする箇所を変化する事が出来ます。

手前の葉っぱ以外全てを紫でConverしました。

すると

手前の葉っぱにFocusがあっている映像になりました。

次はCustom Near Clipping Planeについてです。

これは画面にどこまで含めるのかを指定しているParameterです。

これはOpenGLを勉強した時にやりました。

https://www3.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html

赤線で囲った面より手間の部分はCamaraの映像に含まれなくなります。

この面の位置を操作するためのParameterです。

Constrain Aspect Ratioです。

Cameraで指定したAspect RatioをView画面でも示します。

今度はCameraにあるPost Processの設定です。

BloomのMethodです。

Standardになったままです。

Post Process Volumeで既に直しているのでここで更に値を変更する必要はないそうです。

しかし次のExposureは違うそうです。

まず画面が白過ぎ問題を解決するそうです。

Metering ModeをManualに変更しました。

何と真っ黒になってしまいました。

でもこれで合っているそうです。

Exposure Compensationです。

値を上げます。

おお、前よりは良くなりましたが今度はクレヨンで描いたみたいになっています。

Exposure Compensationの値を9にしました。

後ろの木が絵にしか見えない。

と言うか全体的に油絵っぽいです。

でも前の白っぽいのは完全に直りました。

今度は4つのSphereを追加しました。

以下のMaterialを適応させます。

こんな感じです。

Cine Cameraの位置に戻りました。

この4つの球の色を見てExposureの強さを調整すると良いそうです。

Image EffectsのVignette Intensityです。

Cameraの縁を黒くする効果があります。

これは昔勉強した記憶があります。

調べたら既に3回も勉強していました。

0.5位の値を入れていました。

結果です。

僅かに縁が黒っぽくなっています。

ここから二個目のCameraを設定しますが、それについては来週やる事にします。

3.Niagaraの勉強

3.1 先週の復習

先週はここで終わっています。

今週はこれを検証します。

3.2 何故Unlitなのに光るのか?

色々検証したら以下の事が判明しました。

Particle Spawn SectionにあるInitialize Particle Moduleの

ColorのAlphaが50にセットされていました。

これが玉を光らせている原因のようです。

しかしRender SectionのMesh Renderer Moduleの

Meshに使用している

Static Meshを開くと

以下のMaterialを使用していて

そのMaterial内では

以下の実装がされていて

Initialize Particle ModuleのAlphaの値はSaturateされているはずなんです。

うーん。

分からん。

あ、

Render SectionのMesh Render Moduleを見たら

Override Materialsに以下のMaterialがセットされていました。

うーん。

今まで全く気が付かなかった。

こっちのMaterialが効いていたのか!

このMaterialを外してしまいます。

以下の様になりました。

元のMaterialの色は黄色に変更しています。

以下にGifも示しておきます。

火の玉の方の動きが速すぎて画像がブレています。

それはともかくとして先週、全く効かす事の出来なかったMaterialからのUnlitは出来るようになりました。

3.3 何故、Mesh Render ModuleのOverride Materialsに気が付かなかったのか?

今調べたらNiagaraの勉強は2021-04-26のBlogから始めています。

もう2年以上勉強しています。

にもかかわらず使用しているMaterialにParticle Colorノードがないのにもかかわらず

Niagara側から色をControl出来ている事実のおかしさに気が付きませんでした。

ここに気が付いたらすぐに別のMaterialを使用しているのではと気が付いたはずです。

いや、Niagara側から色をControl出来ている事実のおかしさには気がついてはいたんですが、

私のMaterialとNiagaraの関係の解釈の方が間違っていると勝手に思ってMaterialの実装やNiagaraのModuleの設定を一生懸命弄っていました。

もっと自分の知識の正しさに自信を持つべきでした。

そうしたらすぐにNiagaraでは別なMaterialが使用されている可能性に気が付いたはずです。

4. Materialの勉強

今週はIridescent Bubble Shader - Advanced Materials - Episode 19[4]を勉強します。

4.1 Iridescent Bubble Shader - Advanced Materials - Episode 19[4]を勉強する

以下に示したBubbleのShadderの作成方法について勉強します。

最初Bubbleの表面が何故こんなImageになるのかの物理的な解説をしています。

この部分はSkipします。

物理的な数式をHLSLに落とすなら理解出来ますが、UE5のMaterial内で直接計算するのは効率が悪すぎます。

こういうのはUE5の守備範囲外だと最近悟りました。

以下の2つのTextureを作成しました。

Textureの設定は以上だそうです。

Materialの実装をやっていきます。

まずBlend ModeをTranslucentに変更します。

更にLighting ModeをSurface Translucency Volumeに変更します。

こっちはあんまりいじった事のないParameterですね。

過去のBlogを“Surface Translucency Volume”で検索したら以下の3つが引っかかって来ました。

以外に結構勉強していました。

確認したらGlass上のMaterialを作成する時にLighting ModeをSurface Translucency Volumeに変更しているみたいです。

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

Lightの当たる部分を1~0に設定するための実装ですね。

結果です。

更に以下の計算を足して

-1が0になるように値を調整しました。

次は以下のTextureを使用しますが、

まずこのTextureの設定を確認します。

Compression SettingはUser Interface 2Dになります。

これはTutorialの解説によるとこのTextureのような非常に細い形状のための設定だそうです。

このTextureを使用して以下の実装を追加しました。

結果です。

球の極にある丸を直します。

Sampler SourceにShared Clampをセットします。

結果です。

TutorialではここでRainbowの向きが逆だと言って以下の箇所にOne Minusノードを追加しました。

うーん。

これはどっちでも良い気がしますが、どうなんでしょうか?

更に0.6で掛けています。

これでRainbowの領域に制限を加えていると言っています。

この場所で掛けるという事はUの値に制限を加えたという事ですね。

今度はBubbleの厚さを管理するためのTextureを追加します。

前の物理の説明のところで、Bubble表面の模様はBubbleの厚さに関係していると勉強したんですが、それをここで再現するそうです。

そう言う意味でさっき物理の説明をしていたのか。

先程Importしたもう一方のTextureを使用します。

以下の様にそのままTexture Sampleノードを使用すると

Sphereの極の部分が潰れて表示されます。

代わりにWorld Aligned Textureノードを使用します。

結果です。

Sphereの極の部分を見ても普通です。

ただ何でBen Cloward先生、前に自作したTriplanar Projectionを使用しなかったんでしょうか?

World Aligned Textureノードより精度が良かったはずですが。

この計算結果を足します。

これを忘れていました。

追加します。

結果です。

おお、大分本物のBubbleになって来ました。

この結果は厚みの計算に重きをおきすぎています。

調整します。

結果です。

なんかSFに出て来る惑星のようです。

Patternが時間によって動くようにします。

動いていますが、あまり興味深い結果ではないのでGifは撮りません。

Metallicに1を指定します。

結果です。

うーん。

あんまり変化は感じないです。

Roughnessは0にします。

結果です。

おお、Reflectionが。

最後にOpacityを指定します。

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

うーん。

結果です。

これはどっから見てもBubbleです。

以上でした。

5.Gaeaの勉強

5.1 Geology 11 (Metamorphic Rocks)[4]の続きを勉強する

先週は途中まで勉強しました。今週は残りをやっていきます。

<Non-foliated Metamorphic Rocks>

最初のSlideです。

Marbleって大理石の事ですよね。

Non-foliatedって事は岩が平に伸ばされている訳ではないはずです。

確かに見た目は左右上下から均等に潰された感じです。

次はQuartzについてです。

この辺はこんな岩がある位の理解で充分だと思います。

そんなに深くは立ち入らないで、写真を見てこんな岩がMetamorphic Rockにはあるのか。位の理解に留めておきます。

次はHornfelsです。

最後のSは複数形のSではないみたいです。

次のSlideです。

これって次の節の内容なんじゃ?

うーん。

<Types of Metamorphic Environments Temperature>

次のSlideです。

Contact Metamorphismが地上で起きるMetamorphic Rockなんでしょうか?

BurialとContact Metamorphismの違いは温度だけなんでしょうか?

よく分からないです。

<Contact Metamorphism>

このSlideの説明で分かりました。

要はMagmaと接している部分が熱くなってMetamorphismが起きるんです。

だからContact Metamorphismって言う訳です。

<Contact Metamorphism Aureole

さっきの図は上から見た状態ですが、今度の図は横から見た状態です。

この中で重要なのはSkarnです。Goldがここに含まれるそうです。

<Roof Pendants>

解説でPlutonが飛び出している。と言っていましたがPluton自体の意味が分かりません。

Googleで検索したら一番最初にOne Pieceに出て来る古代兵器って解説が出て来ました。

One Pieceも既に世界Levelの漫画になった感がありますね。

それはともかくWhat is a Plutonic Igneous Rock? [5]に以下の解説がありました。

となるとこの山の周りにはContact Metamorphism Aureoleがあるって事なんでしょうか?

解説を聞いているとこの山の山頂の部分だけ色が違っているんですが、その部分をRoof Pendantsと呼んでいます。

うーん。

この部分もPlutonの一部だとするとこの部分はContact Metamorphism Aureoleではないと思われるですがどうなんでしょう?

<Metasomatism・Hydrothermal>

今度はMetasomatismについてです。

MetasomatismはHydrothermalなMetamorphismと説明されています。

要は海底で起きるMetamorphismって事です。

岩の隙間に冷たい水が入り込みMagmaにふれて沸騰して上から抜けていきます。

この過程で水に溶けやすいMineralとかを岩から抽出して岩の構成を変化させます。

<Black Smokers>

実際のBlack Smokerの写真です。

これが温まった水が抜ける所なんでしょうか?

その辺の解説がこの動画にはありません。

ネットで検索したら以下の解説がありました。

Black smokers and electroecosystems [6]に有ったイラストです。

この説明を見ると私の解釈で合ってそうです。

しかしこのSite、完全に小学生向けのSiteです。

アメリカの小学校ではこんな高度な内容を勉強しているんでしょうか?

<Geysers and Hot Springs

このMetasomatismは海底だけでなくGeyserや温泉でも起きているそうです。

Geyserって何だっけ?

調べたらこのSlideに載っている写真の事でした。

温泉地でお湯が吹きさしているこのさまをGeyserと呼ぶそうです。

次のSlideです。

こっちはMagma自身が含む水によってMetasomatismが起きているそうです。

確かに底に水が溜まっています。

<Rock Veins>

何ですかこれは!

金が詰まっています。

水が流れていた岩の隙間に溶けた金が流れ込んだんでしょうか?

<Burial Metamorphism Associated with very>

前節でContact Metamorphismの解説は終わり、ここからBurial Metamorphismの解説になります。

Lectureの説明を聞くと地面に埋まっているけどRecrystallizationが起きる程の圧力が無い場合に生成されるみたいです。

元の岩の生成をそのまま保っていながら別な岩になっているそうです。

<Subduction Zone Metamorphism>

更に細かくMetamorphismを分類しています。

Subductionでは岩の温度が十分に上昇するまえに圧力だけ上昇するそうです。

Slideの左図だと水色のLineがそれに当たります。

Blueschistを生成するそうです。

<Pressure-Temperature(P-T)Time Paths>

Subductionの岩の時間経過をまとめたものです。

<Regional Metamorphism>

今度はRegional Metamorphismです。

Regional Metamorphismは「Types of Metamorphic Environments Temperature」のところで以下の図で勉強しました。

でもこのSlideを見るとPlateがぶつかって山になっている所で生成されていますね。

Subduction Zone Metamorphismとどう違うんでしょうか?

向きが逆なのか?

Plateの動きについてはもうすっかり忘れてしまっています。

復習します。

2023-05-28のBlogにまとめてありました。

これを読むとPlateについてはGeology 2 (Plate Tectonics) [7]で説明しています。

SubductionもRegional MetamorphismもPlateが地球に戻る箇所であるConvergentです。

ただし場所が違います。

SubductionはOceanic-Continentalで起きています。

それに対してRegional MetamorphismはContinental-Continentalで起きています。

次のSlideです。

Faults zoneに沿ったMetamorphismです。

Faultsがとうとう出て来ました。

GaeaにはFaultというNodeがありますが

Gaeaで使用した時に意味がよく割らなかったんです。

Geology的なFaultの意味をここで勉強してしまいましょう。

これしか言っていません。

WikiFault (geology)[8]の説明です。

要は崖の事です。

このSlideは崖から観察されるMetamorphismについて解説していました。

<Impact Metamorphism>

隕石が地表に落ちる時に形成されるMetamorphism Rockについてです。

Quartz Polymorphs Help Identify Impacts>

QuartzはImpactの圧力と温度で形成させる分子の構造が変化するそうです。

その形状から逆に隕石のImpactを推測出来る訳です。

自然界で存在するStishoviteを生成するための圧力は隕石の落下だけだそうです。

<Shocked Quartz

この場所からStishoviteが見つかった事から昔、ここに巨大な隕石が落ちた事が確認出来たそうです。

別な場所でもStishoviteが発見された事で、昔ここに隕石が落ちた事が確認されました。

こっちは全く隕石の後が無いですね。

何とここに落ちた隕石が恐竜の絶滅の引き金になったそうです。

<Chelyabinsk Meteor>

そんなに隕石って地球に落ちているのかと疑問に思うかもしれませんが、落ちてるそうです。

以下のSlideは2013に地球に落ちた隕石の写真だそうです。

<Index Minerals changes in>

次のSlideです。

MineralのGradeについて解説しています。

これはこのLectureで勉強した内容のまとめですね。

最後のSlideです。

Migmatitesについてです。

MigmatitesはもっともGradeの高いMetamorphismから生成され更に部分的に溶けているそうです。

Lectureの最後に「質問があったらE-mailを送って。」って言っていますがこれは勿論Hawaii大学の生徒に向かって言っているでしょうね。

5.2 GaeaのTutorialの作成

5.2.1 次に何をするかの検討

前にMind Mapで作成したGaea作成の手順は以下の様になります。

これに対して2023-08-28のBlogでは以下のように新しい順序を作成しました。

うーん。

どうするか?

Tutorialを作成するに当たってTime Performanceが大切なんです。

今回はTemplateをそのまま使用してUE5にImportする方を重要視するか。

最近、まだGaeaと言うかLandscapeをImportして作成するかどうかの決定をする段階がGaeaでLandscapeを作成する前に有ると考えています。

となると

  1. UE5で制作してる人にGaeaを進める
  2. とりあえずGaeaのTerrainをUE5にImportして試してみる
  3. じっくりGaeaを使用してTerrainを作成する

の3つのStepがあって初めてGaeaの勉強を始める事になると思います。

うーん。

とりあえずUE5でImportしたLandscapeの状態を確認するか。

何とUE5.3のUpdateが来てました。

UE5.3.0でMaskを使用したらどうなるかをまず確認します。

新しくImportしてみました。

直っていますね。

確認したかったのはですね。

以下のような凸凹感が

LandscapeのScaleを変更する事で

滑らかになるかどうかです。

以下の設定に変更してみました。

結果です。

Landscapeの原点は-50400、-50400なので位置が変更してしまいました。

ので同じ位置での比較は出来ませんが、この位置では凸凹感はほとんどないです。

でも細かく見ると影が凸凹していました。

うーん。

そうだLandscapeをNaniteにしてみます。

結果です。

凄い滑らかになっています。

もしかしてNaniteにするのが正解なのか?

試しにScaleが100倍でNaniteにしてみました。

これは凸凹したままです。

うーん。

成程。

大体理解しました。

よし、決めました。

まずは凹凸は無視したTutorialを作成します。

しかしここでImportから教えてしまうと視聴者にこの凹凸問題にすぐに気づかれてしまいます。

のでImportは最後に教える事にします。

まずTerrainの作成方法から教える事にしました。

となると以下の順番で作成するのが良い気がします。

これに基いてTerrainを作成してみます。

と言ってももうGaeaを勉強する時間が無いのでこれは来週やります。

(追記)5.2.2 LandscapeにTessellationが使えるようになったみたいです!

Unreal Sensei氏のWhy Unreal Engine 5.3 is a BIG Deal [9]を見てたら

LandscapeにDisplacementを使用している例が出てました。

2023-05-22のBlogで簡単に説明していますが、

UE5.2で一応Displacementが使用出来るようになったんですが、非常に限定的でLandscapeには使用出来ないと結論づけています。

これがUE5.3ではLandscapeに対してDisplacementが使用出来るようになっているみたいなんです。

Foliageを使用してDisplacementの有り無しを表示しています。

これは間違いなくLandscapeにDisplacementを使用しています。

注意深くこの動画を見直したらMaterialのResult Nodeに

Displacementが追加されています。

うーん。

こうなると以下の凸凹も

Displacementで修正する事が可能かもしれません。

この凸凹の修正方法についてはもう少し検証する必要がありますね。

6.Houdiniの勉強

今週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial [1]を勉強します。

6.1 Unreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdown [10]を勉強する

何とこのTutorial、40分もあります。

今まで勉強した事の集大成だそうです。

なんかすごいの作成しています。

これはゆっくり勉強した方が良い気がしますね。

うん。決めました。

3分割します。一回13分前後の勉強にします。

慌てて大量の勉強をすると中身が薄くなります。

一回軽く、内容を見る事にします。

最初の10分は今回作成するPCGの内容についての解説でした。

一応これも以下にまとめておきます。

<BP_JunglePCG>

まず以下のParameterを作成したそうです。

全部を一気に使用するとPCが落ちるそうです。

これ。

こういう話が聞きたかった。

公式のUE5のPCGの解説で(Unreal Engine 5.2 Feature Highlights [11])では

以下のような非常に広大なLandscapeをPCGで作成しています。

これって普通にFoliageとNaniteを使用してもPCがCrashする位の負荷が掛かっている気がします。

でもその事に関しては何も説明されていません。

私もLandscapeを作成している過程でTreeの数を数万本に増やしたらUEがCrashした経験があります。

2023-03-27のBlogでその時の事は解説しています。

ここでは草を3万個に増やしたらCrashしています。

公式の映像で数万本の木がRenderingされている映像を見たので、私のLandscapeの作成方法に何か間違いがあるのかと思っていました。

しかし今回Freetime Coder氏もClashすると述べていたという事は、本当は誰がやってもCrashするんじゃないでしょうか?

貴重なCommentを頂きました。

PCがCrashするのを防ぐため以下のParameterはOffになっているそうです。

Enable Shrubsは木の周りにShrubを生やす機能だそうです。

Enable GrassはShrubの代わりにGrassを生やします。Enable BushesはBushを代わりに生やすそうです。

Enable Shore Foliageは川岸にFoliageをSpawnします。

最後のEnable Detail Plantは生成した岩の上に草を生やすそうです。

ここで3つのBPを紹介しています。

最初のBPです。

以下に示したようにTreeを生成します。

次のBPです。

道を生成するためのBPです。

大分荒れた道で大きな枯れた木の枝が道を塞いでいます。

最後はWater SystemのRiverです。

これは元からある機能です。

今度はPCG_Jungleを開きます。

以下に示した様に先程見た3つBPのDataがInputされる実装になっています。

ここで一応どんな実装をしているのか説明しています。

一応実装内容だけ以下に記録しておきます。

今度はそれぞれのParameterの機能を実際に見せてくれるそうです。

まずはEnable Treeです。

結果です。

当然ですが木が生成されています。

次はEnable Rockです。

岩が生成されています。

川の周りにも岩が生成されています。

今度はEnable Pathです。

以下の様に道が生成されています。

次はDetailの機能についてです。

最初はShrubsです。

以下のようなりました。

以下の部分がShrubsとして追加されたようです。

更にEnable Grassを追加しました。

結果です。

草が追加されました。

うーん。

Shrubsの有った場所に草が追加されるのかと思っていたんですが違いました。

草とShrubsは全く違う箇所に生えています。

更にBushも追加しました。

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

Shrubsは森の端に生成すれば良いです。草は木の周りに生成します。

このBushはどんな基準でPointを生成しているんでしょうか?

なんか適当に発生している感じがします。

今度はEnable Shore Foliageを使用します。

結果です。

うーん。

もっと草生やしても良い気がしますが、PCが重くなってしまうんでしょうか?

最後のParameterです。

結果です。

岩の上に草が生えるようになりました。

Enable PathにCheckを入れると

以下に示した様に

倒木の上にも植物が生えるようになります。

以上で機能の説明は終わりでした。

キリが良いので今週はここで終わりにします。

7.UEFNの勉強

7.1 先週の復習

先週は兎に角VS CodeからVerseを動かしてみました。

その中でいくつか解決しないといけない問題がありました。

それをここに列挙しておきます。

まずVS Codeに表示されるCodeの色が全部同じになってしまっている問題です。

次に以下の書き方がよく分からないです。

先週勉強した範囲ではClassの宣言方法は以下のように

Object名:= Class名{}となっています。

なんでbutton_deviceは

Object名:Class名=Class名{}

で宣言しているんでしょうか?

後以下のSiteを勉強すると書いてもいました。

7.2 先週の問題についての検証

VS Codeに表示されるCodeの色>

これは色が表示されてないのではなくて

以下に示した様に表示されている色が

Tutorialと違うんです。

普通にVerseのExtensionはInstallされていますし、

言語もVerseにセットされています。

先週のBlogのScreenshotを確認すると最初はTutorialと同じ色で表示されています。

何故、色が変わってしまったのか分かりません。

<button_deviceの宣言方法について>

公式のUEFNのSiteであるCreate Device References[12]を読んだら理由が分かりました。

この宣言方法は

つまりDevice Referenceを作成するための宣言方法なんです。

[UEFN][Verse] デリゲートの実装(カスタムイベントハンドラクラス)[13]を勉強する>

ぱっと読んだんですが、作成したWidgetのButtonにEventを追加した後の話のようです。

 Make a custom UI with a clickable Button - UEFN/Creative2.0 [14]の実装を終わらしてから勉強する事にします。

7.3  Make a custom UI with a clickable Button - UEFN/Creative2.0 [14]の実装の続きを行う

<Enable Cursor For Button / Input>

まず今の状態ではButtonを押せない事を確認します。

押せる押せない以前にCursorが表示されません。

あ、そういう事か。

この実装でCursorを使用出来るようにするのか。

以下の実装を追加しろと言っています。

追加しました。

テストします。

Click出来るようになりました。

うーん。

Click出来るようになったけど、このCodeが読めません。

後、Verseを更新したProjectを読み込むために一々Fortniteを閉じる必要がありました。

編集状態のまま更新したら、更新出来ませんでした。

Tutorialを見るとChange Buttonを押す必要があると言っています。

どれがChange Buttonなのか分かりません。

<Button UI Callback>

以下のCodeを追加しました。

更にHandle UI Button Click()関数も作成します。

このCodeの意味は分かります。

ただPlayer CanvasはNewUIの間違いだと思います。

<Remove Current Canvas on UIButton Click>

と思ったらNewUIの代わりにPlayer Canvasを使用するCodeを追加していました。

まずcanvas型の変数Player Canvasを作成しました。

Player CanvasにNewUIをセットします。

これで完成ですが、TutorialではCodeを整理してNewUIを消しているので同じようにします。

これで完成です。

テストします。

Buttonを押したらButtonが消えました。

出来ました。

7.4 [UEFN][Verse] デリゲートの実装(カスタムイベントハンドラクラス)[13]を読む

それではこのBlogを勉強する事にします。

読んだら大体意味は理解出来たんですが、なんでこんなめんどくさいFunctionを作成しようとしたのかが分かりません。

Make a custom UI with a clickable Button - UEFN/Creative2.0 [14]では

以下に示した様に

2つのCodeで対応しています。

一行目のCodeでButtonを生成して二行目のCodeでButtonに機能を追加しています。

これで何の不便も無いです。

Blogを読み直したら以下の説明がありました。

うーん。

成程。

具現化系のProgrammerなんだ。

純粋強化系のProgrammerである私とはProgrammingに対する哲学がかなり違う訳だ。

Programmerに限って言えば、特質系>放出系>操作系>変化形>強化系>具現化系の順で成功しやすいので一番外れのTypeです。

このタイプの人は、具現化したProgrammingが大ヒットするなどして特質系に変化出来るかどうかが成功の鍵です。

話が逸れました。

結論としてはこのBlogで述べられている内容はかなり役に立つと思いました。

これからVerseでProgrammingするに当たって自作の関数のParameterにDelegateを使用したい時は結構あるはずです。

しかしParameter としてあるDelegateをパスした場合、その関数内で別の関数のArgumentとしてそのDelegateを使用するとErrorになってしまう(この場合はButton.OnClick().Subscribe()だか他にも沢山ありそう。)。

その時にここで紹介されているようにClassを一回挟めばDelegateをそのまま使用出来るようになる。

と言うのはかなり役に立ちます。

まあこれはかなり上級者向けの情報で、初心者はあまり気にしないほうが楽かもしれません。

8. DirectX12の勉強

8.1 「DirectX 12の魔導書」の勉強

8.1.1 先週までの作業の確認

先週は「3.3 画面色のClear」の内容を全部復習して簡単に内容をまとめました。

この節が大切なのかという事ですが、

先週のまとめの内容を簡単に繰り返すと、画面色のClearを行う事でDirectX12の基本的な概念である以下の用語を

  • Command List
  • Command Queue
  • Swap Chain
  • Buffer
  • View
  • Descriptor
  • Descriptor Heap
  • Render Target View

実際の実装という形で理解する事が出来るからです。

先週は「3.3.6 Swap Chainを動作させる」の復習は出来ませんでした。今週はそこをやります。

8.1.2 「3.3.6 Swap Chainを動作させる」の復習をする

2023-06-04のBlog

「3.3.6 Swap Chainを動作させる」を軽く読んで終わりです。

教科書では以下の手順で行うと書かれているが

実際のCodeでは順番が微妙に違っている。と言っていました。

Sample Codeでは以下の手順で処理していると書いてありました。

後、While Loop内でSwap Chainを使用している事に対してですが、

Swap ChainってのはDouble Bufferingを行うためのものです。

Double Bufferingを行うにはBufferを入れ替える(つまり繰り返す)必要があるのでWhile Loopを使用する訳です。

2023-06-11のBlog

「3.3.6 Swap Chainを動作させる」の「Render Targetの設定」の実装を行っています。

いや実装行う前に内容を理解する必要があるじゃん。と思ったんですがBlogでは教科書とSample Codeの違いにばっかり注目しています。

その後でSample CodeをCopyして実装しています。

その後でここで使用された関数などについて公式のSiteでParameterの設定などを調べています。

調査したのは

  • OMSetRenderTargets()関数
  • D3D12_CPU_DESCRIPTOR_HANDLE structure

などでした。

内容の確認をするために教科書を読み直したら、以下の2つを行っていました

  1. Render Target Viewが2つ生成されているので現在のBuck BufferがどちらかなのかをSwap ChainのGetCurrentBackBufferIndex()関数で確認する
  2. Buck BufferであるRender Target ViewをCommand ListにあるOMSetRenderTargets()関数を利用して次に使用するRender Target Viewとしてセットする

ここでOMSetRenderTargets()関数の2番目のParameterであるpRenderTargetDescriptorsの値を計算するのが面倒なんですが、それは細かすぎる内容になるのでここでは深入りしません。

2023-06-19のBlog

なんと全体像が分からなくなったと急遽復習する事にしています。

  • Command list,
  • Command Queue,
  • Swap Chain,
  • Render Target,
  • Descriptor Heap

について復習しています。

軽く読み直しましたが、今の理解とだいたい同じです。

この辺でやっと「3.3 画面色のClear」が何をしているのかが理解出来て来たみたいです。

ここからずっと忙しくてDirectXの勉強はしばらくしていません。

2023-07-23のBlog

この週は久しぶりに勉強したので今までの勉強の復習をしています。

その後で「3.3.6 Swap Chainを動作させる」の「Render TargetのClear」を実装しています。

まず教科書の内容として

と述べています。

実装では以下に示した様にClearRenderTargetView()関数を使用して行っていました。

ここでこのRGBの値の指定方法の意味が分からないと丁寧にBit Operationの復習をしています。

なんと最後に以下のように述べていました。

こんなのすっかり忘れていました。

これは次の節である「3.4 Error対応」が終わった後で確認出来るはずです。

2023-08-06のBlog

「3.3.6 Swap Chainを動作させる」の「ためておいた命令を実行する」を勉強しています。

まず教科書の内容ですがこの週はきれいにまとめてありました。

ID3D12CommandQueue::ExecuteCommandLists()関数でCommand List内にある命令を実行するんですが、

この時に

Command Listをあえて配列として書き直しているんです。

これが絶対必要なのか結構疑問視していて

と言っていました。

これもすっかり忘れていました。

これは後で確認します。

2023-08-14のBlog

Command ListをClearする所を勉強しています。この部分は前の勉強でやってなかったみたいです。

ここでPipeline Stateという言葉が出て来ます。

これは実は第一章でDirectX12を理解するために必要な概念の一つとして紹介されていたんですが、それ以降全く登場しなかった言葉です。

その時は以下のようにまとめられていました。

これは今読み直してもよく分からないですね。

この後は「ためておいた命令を実行する」の実装を行っています。

2023-08-21のBlog

この週は「3.3.6 Swap Chainを動作させる」の「画面のSwap」を勉強しています。

垂直同期について調査しています。

ここでの垂直同期の理解を簡単に説明すると、テレビ(昔のテレビ)は電子銃で横一線に画像を作成していたので、電子銃を下から上に移動させる必要があった訳です。

電子銃は画面の一番上を指した後で、一番下を指すために移動します。

この時に僅かな時間のLossが生まれます。

これがMonitorのFrame Rateになる訳です。

そしてこれと実際の画像のFrame Rateを同期させる必要があります。

これが垂直同期です。

実際の実装です。

Swap ChainのPresent()関数を使用するだけです。

これで全部終わりました。

しかしもう「DirectX 12の魔導書」に費やせる時間は無くなってしまいました。「3.3 画面色のClear」のまとめは来週やる事にします。

8.2「Direct3D 12 ゲームグラフィック実践ガイド」の勉強

8.2.1 ExecuteCommandLists()関数の実装方法の確認

先程、「DirectX 12の魔導書」の復習で、ExecuteCommandLists()関数のParameterの実装方法について

と書いています。

これが「Direct3D 12 ゲームグラフィック実践ガイド」でも同じだったのか確認します。

まだ作成してなかったです。

でもSample Codeの2-3を見ると

と書かれていました。

今、2章の3の6を勉強しているので来週にでもこれを実装する事にはなりそうです。

これ見るとやっぱり配列化してからParameterとしてPassしています。

DirectX 12の魔導書」のExecuteCommandLists()関数のParameterの実装方法と同じです。

8.2.2 「2.3.6 Fenceの作成」を実装する

そんなに長いCodeでも無いのでまず実装をしてしまいます。

その後でCodeの意味について考察する事にします。

Fenceの生成を追加しました。

CreateFence()関数については後で調べます。

Eventの生成を追加しました。

何故、この実装がFenceの値がIncrementされたかどうかを表すのかが分かりません。

これは先週も書いていました。

CreateEvent()関数にそのような機能があるんでしょうか?

後、Sample Codeには以下の赤線で囲った実装があるんですが

教科書ではこれについては何も述べていませんでした。

8.2.3 「2.3.6 Fenceの作成」で使用した関数について調べる

公式のSiteによるID3D12Device::CreateFence method (d3d12.h)[14]の解説です。

まあそらそうです。

次はCreateEvent()関数について調べます。

こっちの使用方法はよく分かっていません。

公式SiteのUsing Event Objects (Synchronization)[15]に

このEvent Objectの詳しい使用方法が載っていました。

簡単に読みましたが、これはしっかり勉強した方が良いので来週、ここを勉強する事にします。

9. まとめと感想

今週も時間が無くなってしまったのでまとめと感想は無しです。

10. 参照(Reference)

[1] FreetimeCoder [FreetimeCoder]. (n.d.). Unreal PCG Tutorial. YouTube. https://www.youtube.com/playlist?list=PLA03OHAaHgYpo0enf8p-2oEpja3grLOKZ

[2] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - 2023 Full Beginner Course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY

[3] TourRevolutionary. (n.d.). Reddit - Dive into anything. https://www.reddit.com/r/EnglishLearning/comments/ws9d71/what_is_the_difference_between_flare_and_glare/#:~:text=%22Glare%22%20is%20when%20diffuse%20or,reflecting%20inside%20the%20camera%20lens.

[4] Earth and Space Sciences X. (2015, October 30). Geology 11 (Metamorphic Rocks) [Video]. YouTube. https://www.youtube.com/watch?v=MeAz8An80ro

[5] Page, G. (2018). What is a Plutonic Igneous Rock? Geology Page. https://www.geologypage.com/2018/10/what-is-a-plutonic-igneous-rock.html

[6] Phillips, A. (2017). Black smokers and electroecosystems. It Ain’t Magic. https://itaintmagic.riken.jp/research-in-depth/black-smokers-and-electroecosystems/

[7] Earth and Space Sciences X. (2015, October 30). Geology 2 (Plate Tectonics) [Video]. YouTube. https://www.youtube.com/watch?v=z58vSr_VTvk

[8] Wikipedia contributors. (2023). Fault (geology). Wikipedia. https://en.wikipedia.org/wiki/Fault_(geology)

[9] Unreal Sensei. (2023, September 7). Why Unreal Engine 5.3 is a BIG Deal [Video]. YouTube. https://www.youtube.com/watch?v=POwTaVZ_CA0

[10] FreetimeCoder. (2023, March 29). Unreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdown [Video]. YouTube. https://www.youtube.com/watch?v=SCDZ8kobv1M

[11] Unreal Engine. (2023, May 11). Unreal Engine 5.2 feature highlights [Video]. YouTube. https://www.youtube.com/watch?v=I7zyNDazmGQ

[12] Coding device interactions. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/coding-device-interactions-in-verse

[13] [UEFN][Verse] デリゲートの実装(カスタムイベントハンドラクラス). (n.d.). Zenn. https://zenn.dev/t_tutiya/articles/26e2da5a010b39

[14] Stevewhims. (2022, July 27). ID3D12Device::CreateFence (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createfence

[15] Stevewhims. (2021, September 16). Using Event Objects (Synchronization) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/sync/using-event-objects