UE4の勉強記録

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

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

1.今週の予定

<映像作品としてのLandscapeの作成>

建築用のLevelの作成の勉強の続きをやります。

更に映像用のTutorialを何個かCheckします。

Niagara の勉強>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の実装の続きをやります。

<Materialの勉強>

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

<Gaeaの勉強>

GaeaのTutorialを作成します。

<Houdiniの勉強>

Castle Wall Tool [1]の勉強をやります。

<UEFNの勉強>

Pi Equals Three氏のTutorialをやります。

<DirectX12の勉強>

DirectX 12の魔導書」の勉強をやります。

更にLötwig Fusel氏のDirectX12のTutorialをやります。

2.Landscapeの作成

今週は先週の続きを行います。

以下の内容をやる予定です。

目の周りの簡単な手術をしたんですが、眼帯をつけられてしまいました。

モノの見え方が今までと全然違います。

ので今回は実装するのは止めておきます。

2.1 道路を追加する

今週は片目が見えないので調査だけします。

道路を追加するのにどんな方法が一般的なのかを調べます。

私が知っているのはSplineを使用する方法ですが質はどうなんでしょう。

単にasphaltのMaterialを追加するだけでもそれなりに良い質の道路が作成出来る気もしています。

まずYouTubeで以下の検索をしました。

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

最初のやつはSplineと表示されていませんね。

以下のTutorialはThumbnailを見る限りでは断トツの質です。

この2つのTutorialを軽く見る事にします。

2.2 EASY Road and Junction Tutorial for Unreal Engine 5 [+ FREE ROAD MESH!] [4]を勉強する

最初のTutorialはJzTz氏のTutorialです。

JzTz氏は初めて知りました。

Uploadしている動画を見たらこれしかありません。

これでYouTubeのお勧めの一番最初に表示されるのは非常に評価の高い動画という事何でしょう。

期待してみる事にします。

最初の一分だけ見ましたがもう結論出ました。

凄いです。

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

<Intro>

以下のSiteから

以下のAssetをDownloadします。

<Road Material>

Materialを開きました。

画面が小さくて文字が読めません。

最初は以下のようになっているそうです。

文字が読めない理由が分かりました。

画質が最高で720pしかありません。

これでは文字を読むのがかなり厳しくなってしまいます。

しかも今、片目で見ていますし。

出来るだけ頑張ってまとめますが無理かもしれません。

Materialを組みました。

単に全部つなげただけです。

Roughnessだけ2倍にしていました。

Materialを2回Duplicateして以下の名称に変更しました。

Textureを以下のものに変更します。

2番目のMaterialは以下のTextureに変更していました。

<Creating a Road>

Landscape Modeに移動してSplinesを選択します。

Ctrl+左Clickで以下に示したControl Pointsを作成します。

Clickして以下のRoadを生成していました。

MeshにNewRoadを追加しました。

結果です。

Meshの向きがオカシイですね。

Forward Axisの値をxからyに変更しました。

結果です。

おお。

この時点でもかなり良い感じです。

Scaleの値を0.6に変更しました。

今度は道路の上に生えている草や土を消します。

以下のOnly Selectedを押します。

更にSplineのDetailのControl Pointsを選択し

Mesh Vertical Offsetに10をセットします。

結果です。

土が無くなって道路が見えるようになりました。

しかし道路の上に生えている草はそのままですね。

何と草は以下の方法で消していました。

Foliage無しのLayerを作成して、それをSplineの上からPaintしていました。

うーん。

これって正しい方法なのか疑問ですが、道路の草を消す事は確かに出来ますね。

結果です。

確かに道路の上の草は無くなりましたが、見た目は最悪です。

ここから交差点の作成方法の説明になります。

まず新しいControl Pointを追加します。

Mesh Vertical Offsetの値は0になっているので新たに設定し直す必要があるそうです。(ただしTutorialではそれは後でやると言っています。)

更に2つのPointを追加しました。

以下の赤丸のControl Pointを選択しCtrlを押したまま矢印のPointまで移動します。

そこに新しいControl Pointを追加します。

後、これをやる前に以下のUse Auto Rotate Control PointをDisableしておくと良いと言っていました。

次に以下の赤丸のControl Pointから矢印のControl Pointを選択します。

この部分、Mouseをどうしたのかが分かりません。

Ctrlを押したまま、次のControl Pointを選択したんでしょうか?

これは実装する時に自分で試して確認します。

結果です。

既に交差点のような形状にはなっています。

全てのControl Pointの高さを同じにすると言って

以下のLocationのZの値を10に変更しました。

全てと言ってもここで使用している3つのControl Pointだけを指していると思われますが、どうなんでしょうか?

更にRotationのYの値も0にしていました。

結果です。

成程、こうなったら正解なのか。

次に以下の全てのControl Pointsを選択します。

Mesh Vertical Offsetを10に直しました。

更にOnly Selectedも押しました。

これはLandscapeの形状をSplineに沿って調整しているそうです。

<Material Overrides>

また全部のControl Pointを選択して

Material OverridesにNewroadJuncを追加します。

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

こっちの方が見やすいですね。

<Just Line Texture>

今度はNewroadJunc1を使用してもっと見栄えを良くします。

一個だけ入れ替えました。

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

Lineを逆向きにします。

ScaleのXの値をNegateしました。

結果です。

逆向きのLineが生成されました。

全部のControl Pointsに同様の処置をしました。

以上でした。

これだけだと一寸、映像作品としては完成とは呼べない気もします。

ただ基礎はこれで良いと思います。

<Outro>

完成の映像です。

うーん。

凄いアメリカ感があります。

アメリカだったら本当にこんな場所ありそうです。

日本の風景にするには更に改良が必要ですがこれでもかなり良い感じではありました。

片目で勉強するのはつらい。

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

3.Niagara の勉強

3.1 先週の復習

先週は「Chapter 15: Fluid Simulation(Logic)」を読みました。

どんな内容なのかあんまり覚えていません。

先週のBlogを読み直します。

大体以下のような内容でした。

まずSimulationの最も重要な基礎は最新の加速度を決定する事です。

流体の加速度は以下の4つの要素から構成されます。

そして最終的には以下の式が導出されました。

途中で、カーネル関数とか出て来ましたがこの辺はあんまり理解していません。

3.2 「Chapter 16: Fluid Simulationによる水面(実装編)」を読む

あんまり理論だけ勉強しても意味がないので実装を先にする事にします。

今週は「Chapter 16: Fluid Simulationによる水面(実装編)」を読みます。

<16.1 Fluid Simulationの概要>

教科書にはSimulationの結果が表示されています。

Sample Codeを動かして同じ結果になるか確認します。

こんなSimulationでした。

この流体Simulationの実装は実際には以下の2つのPhaseに分かれるそうです。

  1. Simulationを行う
  2. Renderingを行う

Simulationを行うための2つのPhaseの一つがSimulationという、一見すると訳分からない解説になっていますね。

<16.2 数式をCodeに落とし込む>

数式を見ながら疑似Codeに落とし込むそうです。

<16.2.1 カーネルの計算>

Poly6カーネル、SpikyカーネルのGradient、そしてViscosityカーネルのLaplacianの式を疑似Codeを作成しています。

Poly6カーネルの場合、以下の順序で疑似Codeを書いていました。

  1. DirectionのLength(仮にrとしている)を計算
  2. rがある値(仮にhとしている)より大きい場合は、0を返す、それ以下の場合はPoly6カーネルの計算結果を返す

これはまあ納得です。

SpikyカーネルのGradientです。

これはそのまま式の計算を疑似Codeで書き直しただけでした。

ViscosityカーネルのLaplacianの式の場合です。

これも式の計算をそのまま疑似Codeで書き直しただけでした。

<16.2.2 密度の計算>

今度は密度の計算方法の疑似Codeを作成しています。

Pressureによる加速度を求めるためは密度が必要だったはずです。

それは分かったんですが、その後がよく理解出来ません。

密度を計算するのに「近傍粒子との距離を密度の基準」としている点です。

流体でも非圧縮の流体の密度って変化するんでしょうか?

これって固有値だと思っていましたが、ここでは「近傍粒子との距離を密度の基準」として一々計算しています。

そうだ。

Poly6カーネルを検索したらこの辺の計算の理論について解説しているSiteが見つかるかもしれません。

検索してみます。

Poly6カーネルで引っかかったSiteに以下がありました。

Science.Tools 科学技術計算ツール[5]と言うSiteです。

このSiteの科学技術計算講座の中に

以下の講座があり

更にその下には

もありました。

凄い。

これで勉強したら流体の計算方法の理解が出来るようになりそうですね。

全部、読みたいですが今回は、今一番気になっている密度の計算についての解説だけ読む事にします。

内容が混乱してしまうので節を分けます。

3.3 Science.Tools 科学技術計算ツール[5]の科学技術計算講座の「科学技術計算講座5-粒子法(SPH法)で流体シミュレーション」を読む

今回は本当に急遽なので簡単に読んで、雰囲気だけ掴む事にします。

<「【科学技術計算講座5-7】SPH法の密度、圧力」を読む>

まずParticle Classを作成していました。

その中の変数にPressureもDensityもありました。

と言う事はやっぱり一個一個のParticleに対しての独立した密度やPressureの値があるという事になります。

うーん。

その下の密度の定式化に以下のように書かれていました。

ウルァァアー!

やっぱり私の疑問はそんなにおかしな事ではなかった。

このSiteの作者も非圧縮性のModelなんだけど圧縮性を考慮したModelを作成しているとその事についてしっかり注釈していました。

<「科学技術計算講座5-8】近傍粒子の探索」を読む>

ここは近接するParticleを見つけるための計算を全てのParticleに足して行うと計算Costがあまりにも大きくなってしまうのでその計算Costをどうやって減らすかについての解説がされていました。

興味深い内容ですが今勉強している教科書では使用しない技法なので読むのは中止します。

3.4 「Chapter 16: Fluid Simulationによる水面(実装編)」を読む(続き)

密度の計算については大体納得したので教科書の続きを読みます。

以下方法で計算しています。

  1. ある任意のPointを選ぶ
  2. そのPointからのそのPoint以外のPointの距離を計算する
  3. それぞれの距離がPoly6カーネルの範囲の場合は無視
  4. それぞれの距離がPoly6カーネルの範囲内の場合はPoly6カーネルの計算に沿って値を加算

うーん。

この辺はもう疑問に思う点はないですね。

<16.2.3 Pressureの計算>

これは以下の式で計算しているんですが、

Rhoの値が対象物全体の密度となっています。

これって定数なんでしょうか?

疑似Codeではこの式の計算をしているだけです。

16.2.4 Pressure Vectorの計算

これも式の計算を単に疑似Codeに落としているだけなんですが、

なんせ式が以下のように複雑です。

For Loop内でSigma内の計算をして最後に-m/Rhoを計算していました。

16.2.5 粘性Vectorの計算

これも以下に示した複雑な式を疑似Codeに落としていました。

<16.3 Emitterの生成>

Niagaraの作成についてです。

これは実装方法の説明だけなのでSkipします。

うん。

今週はここまでにして来週はここにある実装を行います。

4.Materialの勉強

4.1 Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [6]のBugを直します

先週、Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [6]を実装したんですが、動きませんでした。

今週はそのBugを直します。

一回本当に動かないのかを確認するためにLevel上にPlaneを配置してそこに先週作成したMaterialを貼り付けてみます。

結果です。

普通に動いていました。

うーん。

出来ていましたね。

4.2 Animated Flag - Advanced Materials - Episode 26 [7]の勉強をする

これだけだと短いのでBen Cloward先生の次のTutorialを勉強する事にします。

以下に示した旗が風でなびいているMaterialの作成をするそうです。

この週もUnityで説明してUEは最後に実装しているだけです。

実装方法だけまとめます。

まずLocalPositionノードを追加しました。

そして以下のように実装して

Local PositionのXの値が時間で変化するようにします。

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

Sineノードで時間による変化を-1~1の値のRangeにします。

そしてWorld Position Offsetの値に繋ぐためにVector3を掛けます。

ただしY軸方向以外の値は変化しては困るので、Yにだけ値を入れてそれ以外の方向には0の値を掛けています。

結果です。

この時点で既に旗がはためいています。

ただし旗が棒に繋がれていて全く動く必要のない旗の起点の部分も動いてしまっています。

この解決策ですが以下のようにしていました。

Mask(R)の値をMultiplyノードのBに繋ぎます。

勿論、Multiplyノードの結果はWorld Position Offsetに繋ぎます。

結果です。

今度は旗の起点は動かなくなりました。

後は色を追加したり

Two SideをEnableしたりしていました。

結果です。

これだけでした。

うーん。

まあいいや。

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

実装は来週します。

5.Gaeaの勉強

今週もTutorialの作成の続きをやります。

今週から2つ目の工程であるColoringに入ります。

5.1 Coloringの内容についての検証

最初なので簡単にします。

以下の実装までは終わっている前提で始めます。

一番最初にする事はFXノードの追加です。

このNodeの存在がここで3つの工程の第一の工程が終わった事を示します。

Fxノードは左のGraph内には存在していないNodeなので別な方法で追加します。

と思ったらAdjustment Groupにありました。

Adjustment Groupか。

このGroupは調整するためのNodeがまとめられています。

AutoLevelノードとCombineノードというわりかし重要なNodeもこのGroupに属しています。

名前をFinal Terrainと変更しました。

そして色を追加します。

通常、色を追加するとなると以下のColor Groupを使用すると思われますが、

実は最も単純な色を表すNodeは以下のPrimitives GroupにあるConstantノードを使用します。

ここからConstantノードを追加します。

まずConstantノードの設定をDefaultのHeightからColorに変更します。

Colorの色も次いでに変更しました。

結果です。

赤くなりました。

ここで以下のGraphの追加について解説します。

Gaeaでは複数のGraphを使用する事が出来ます。

以下に示したGraphにある右上のPlusのButtonを押します。

すると以下のBoxが表示されます。

ColorとTypeしてCreate Graphを押します。

すると以下のようにColorと言う名前の新しいGraphが生成されます。

それではこのColorと言うGraph内で色を追加します。

まずGraphに戻ってFinal Terrainノードの後についているConstantを消します。

色はColor Graph内で指定するのでこのGraph内では要らないです。

そしたらFinal TerrainノードのOutputを左ClickしたままDragします。

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

Make Portalを選択します。

するとFinal TerrainノードのOutput PinにPortalが形成されます。

こんどは新しく作成したGraph、Colorに移動します。

ここにConstantノードを配置します。

今度はこのConstantノードのInputを左ClickしてDrag & Dropします。

以下のBoxが表示されるのでPortalsを選択します。

すると先程作成したPortalのNodeであるFinal Terrainの名前が表示されています。

これを選択します。

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

これでFinal Terrainノードの結果とつながりました。

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

今週は、Coloringの最初なので、この位で終わりにします。

5.2 PowerPointの作成

それではこのLecture用のPowerPointを作成します。

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

Color Groupについて簡単に説明します。

Constantノードについて解説します。

Constantノードの説明の続きを解説しています。

新しいGraphとその使用方法について解説しています。

新しいGraphの作成方法について解説しています。

別なGraphにあるNodeにNodeの結果をPassする方法について解説しています。

ここでPortについて説明しています。

まとめです。

今回はLectureの内容が少なかったです。

しかしこれを勉強しておかないと次のMaskingの勉強が出来ませんのでまあ仕方ないです。

6.Houdiniの勉強

6.1 Houdini - Wall Tool 06 [8]を実装する

先週、Houdini - Wall Tool 06 [8]を勉強したので今週はこれを実装します。

<Intro>

特にやる事はないです。

<Attribute Noise>

Attribnoiseを追加します。

先週までの結果を繋げて可視化すると

可視化しました。

AttribnoiseのAttribute Name Vectorの値をPに変更します。

結果です。

凄い無茶苦茶です。

Amplitudeの値を小さくしました。

結果です。

上下のNoiseだけ残しました。

Attribute NamesのXYZの設定を以下のようにします。

結果です。

おお、上下のばらつきだけが追加されていますね。

今度はNoise PatternのElement Sizeの値を大きくしました。

結果です。

Element Sizeの値を大きくする事でNoizeのCurveが緩やかになるそうです。

うーん。

これは確認しますか。

Element Sizeが1の時です。

 

Element Sizeが10の時です。

成程。

これがNoiseのCurveがSmoothになるという事か。

Wallの底の歪みを直します。

Attribnoiseノードの上にAttribwrangleノードを追加します。

<Mask Noise>

Attribwrangleノードの名前をAttribwrangle_MaskNoiseに変更しました。

WallのParameterを追加するので色を黄色にしました。

<Color Mask>

Color Maskとは「色でどの場所には変更を追加しない。」と指定する方法です。

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

結果です。

Chanel Ramp>

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

そして定価のIconを押してParameter、Rampを作成します。

以下のParameterが出来ました。

Scene Viewの結果は以下のようになりました。

<Ramp Parameter>

RampのParameterを以下のようにしました。

結果です。

更にRampのParameterの設定を以下のように変形します。

これは新しいPointの追加方法が分らなかったんですが、Clickしたらその位置にPointが追加されました。

結果です。

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

F1を押してSetpointgroupの関数のReferenceを表示します。

GeohandlwはこのNodeなので0を指定しているのか。

次のParameterであるnameはこのPoint Groupの名称ですね。

その次のPoint Numberは何を指しているんでしょうか?

これはそれぞれのPointで変わってくるという事になりますね。

Valueは全部1に指定していますね。

Modeのsetは以下の解説がありました。

最後に@Cdの値を1に戻します。

更にAttribnoise1のGroupに作成したGroupであるnoiseMaskをセットします。

これでWallの一番上と下以外だけがNoiseの影響を受ける事になります。

結果です。

うーん。

確かにWallの上と下は真っすぐなっています。

一番下のBrickだけ大きさが変ですね。

Parameterをいじって見た目を良くしました。

今度はひびを追加します。

Foreach Connected Pieceを追加しました。

以下のNodesが追加されました。

Attribnoise1の結果をConnectivity1ノードに繋ぎます。

Foreach_begin2ノードを可視化します。

結果です。

ここまででした。

7.UEFNの勉強

7.1 MAKE JUMPSCARES IN FORTNITE With Cinematic Sequence Device - UEFN / Creative 2.0 Tutorial [9]を勉強します

面倒なので先週のTutorialの結果の検証は止めて次のTutorialの勉強をする事にします。

Jumpscaresとは画面に突然現れる怖い画像や映像の事です。

映像をLevel上に追加する方法はMake a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]で勉強しました。

今回のTutorialとはどう違うんでしょうか?

<Intro>

以下の映像を突然表示しています。

今回はこの作り方を勉強するそうです。

まずFeddyのSkeletal MeshをImportします。

Sketchfabの以下のAddressにあるそうです。

以下のようなAssetが表示されていました。

Level上に配置します。

<Creating a Hollow, Black Cube for Scene>

ここはやらなくても良いそうです。

Feddyの後ろの背景を黒くするために黒いCubeを配置するそうです。

Modeling ModeにセットしてBoxを選択します。

BoxをLevel上に配置します。

次にPoly Editを選択してPolyGroup Editを選択します。

以下に示した様にCubeのTopを選択します。

以下のようになります。

そしてFace EditsからExtrudeを選択します。

逆向きにExtrudeして以下に示した様にCubeに穴を作成します。

画面の下方に表示されているAccept Buttonを押して

この形状に決定します。

Sizeを大きくして更に回転します。

更にこのCubeのMaterialに以下のMaterialをセットします。

このMaterialはDefaultで存在してるんでしょうか?

まあ、適当に作成しても問題ないでしょう。

結果です。

このBoxの中にFaddyを配置しました。

この部分のTutorialは要らんわ。

こういう感じのを作成して下さい。と言えば自分で作れます。

とは言ってもUE初心者の人達もいるのでTutorialとしてはSkipする訳にはいかないですね。

<Creating Cinematic Sequence>

新しいLevel Sequenceを作成します。

名前はJumpScaredとしていました。

中を開いて先程のFraddyをSequencerに追加しました。

<The Basics of Editing Skeleton with FK Control Rig>

Phantom Freddy FBXを右ClickしてBoxを表示させ

その中から以下のEdit With FK Control Rigを選択します。

以下のReduce KeysをEnableします。

Create Buttonを押します。

結果です。

Boneが少なくなったんでしょうか?

画面の右側にはBoneの名前が階層に沿って表示されています。

ここでKey Frameを使用してAnimationを作成するみたいです。

<Keyframes in Sequence Editor>

何とこのModel、IKがついていません。大Boneから順次動かす必要があるみたいです。

以下のIconを押しました。

これがEnableしているとModelの位置を動かした時点でKey Frameが生成されるそうです。

一個知らないTipを紹介していました。

Key Frameを選択した状態でAltと左Clickを押したまま、Dragすると

Key FrameのCopyを別な場所に生成出来るそうです。

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

<Modeling The Pose / Animation>

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

<Adding the Sequence Camera / Camera Controls>

以下のIconをClickして新しいCameraを追加します。

ここでCameraの位置を指定したりしていますが、あまりにも画面の下の方でやっていてよく見えません。

まあ、この辺は自分で勝手にやっても出来るでしょう。

<Making Model Move Closer to Camera>

画面を見るとPilot Activeとなっています。

この機能はUEFNにもあるようです。

この辺の設定方法だけは実装する時にしっかり確認する事にします。

CameraのAnimationの作成が終わったら

以下のIconを押してSaveして

Sequencerを閉じます。

Sequencerを閉じても

以下に示した様にまだSequencerで指定したCameraからの映像が表示されている場合は

左上のIconをClickします。

以下のように普段の画面に戻ります。

<Setting up Cinematic Sequence Device>

Cinematic Sequence DeviceをLevel上に配置します。

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

この辺からMake a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]で勉強した内容と同じになりそうです。

Make a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]は2023-11-05のBlogで勉強して2023-11-12のBlogで実装しています。

同じ内容を勉強させられたら時間の無駄です。

内容が被ってないか先に確認しておきます。

<<2023-11-05のBlogの内容>>

軽く復習しました。

Cinematic Sequence Deviceに関する内容を以下に示します。

まずVerseにおけるCinematic Sequenceの生成方法です。

生成されたCinematic SequenceにLevel上に配置したCinematic Sequence Deviceをセットします。

次にVerse上であるButtonが押されたら、このCinematic SequenceにセットされたAnimationをPlayするように実装しています。

まず以下の赤線のCodeでPlaySequence()関数を実行するようにします。

Play Sequence()関数は以下のようになっていました。

はい。

これでCinematic Sequenceにある映像がPlayされるようになりました。

<<2023-11-12のBlogの内容>>

特に付け足す内容は無かったです。

Make a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2 [10]ではButtonを押すとAnimationが開始しましたが、今回はButtonは使用出来ません。

多分、Trigger Boxでも使用して同様の実装を行うと思われます。

はい。

Tutorialに戻ります。

Cinematic Sequence DeviceのVisibilityをEveryoneに変更していました。

あれ。

これTutorialの残りの時間から推測するとVerseを使用しないで終わりそうです。

以下のTriggerをLevel上に配置しました。

何これ?

UEとは全然違う形状しています。

でもTrigger Boxの一種である事は間違いなさそうです。

以下のように配置しました。

そして以下のようにTriggerをCinematic Sequence Deviceにセットします。

うーん。

成程。

こうしたらNo Codeで実装出来るのか。

これはこれで勉強になりますね。

ただ、こういうやり方はFortniteを散々遊んで更にCreationの1.0でMapを作成している人達の方が絶対詳しいので、私が今更この辺を勉強しても付加価値を生む事はあまりなさそうです。

やっぱりVerseの専門家になる方が私の長所が光ります。

のでUEFNの勉強はVerse方面を重視する事にします。

<Jump scare Test Result>

実際にGameをPlayしてTestしていました。

Triggerを踏んだらAnimationが始まりました。

Pi Equals Three氏、滅茶苦茶ビビっていました。

<Adding Audio / Sound to Sequence>

Soundを追加するそうです。

Level Sequenceに戻ってAudio Trackを追加します。

以下のAudioを押すとCueを追加出来るそうです。

よく考えたらUEでもLevel Sequenceに音を追加した事はなかったです。

<Final Result>

最後に音ありの状態でTestしていましたが、Tutorialの映像では音は消されていました。

以上でした。

実装は来週やります。

8.DirectX12の勉強

8.1 Lötwig Fusel氏のD3D12 Beginners Tutorialを勉強する

先週は実装したDebug Layerの内容について勉強し直しました。ので今週はDebug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]の復習をします。

もし全部、終わっているならば次のTutorialの勉強をします。

8.1.1 2023-12-10のBlogを復習する

2023-12-10のBlogDebug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]の勉強をしています。

まずはこれを復習します。

まずDebug Folderを作成してその中にDXDebugLayer.hとDXDebugLayer.cppを作成しています。

以下のように作成しています。

DebugLayer.hを以下のように実装しました。

これは先週実装したHeaderの以下の部分、Singltonの実装と同じですね。

次に以下の実装を追加していました。

これは以下の部分と大体一緒です。

この後にPublicとPrivate以下の部分を実装すると思われます。

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

はい。

Private以下の実装は同じになりました。

ここで2023-12-10のBlogでは以下の内容が書かれていました。

これも復習しないといけないのか。

まあ、これは出来たらやります。

ここでPublicの下に以下の実装をしていました。

これで私のProjectのDebugLayer.hの実装とTutorialのDXDebugLayer.hの実装が同じになりました。

今度はcpp fileの実装について勉強しています。

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

私のDebugLayer.cppの実装は以下のようになっています。

Init()関数とShutdown()関数の実装が無い点を除けば同じ実装ですね。

Debugの時だけ動くような実装を追加しています。

これも私のDebugLayer.cppに実装されています。

Init()関数内の#ifdef _Debug以下に以下の実装を追加しています。

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

これは以下の部分の実装と同じですね。

次はShutdown()関数の実装です。

#ifdef _DEBUG以下に実装を追加しています。

以下の部分の実装ですね。

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

以下の部分の実装と同じですね。

OutputDebugStringW()関数が追加されていますね。

Blogには以下のような記録がありました。

うーん。

やっぱりTutorialをもう一回勉強し直す必要はありそうですね。

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

これで私のProjectのDebugLayer.cppとTutorialのDebugLayer.cppの実装は全く同じになりました。

お、完璧に終わっているじゃないかと思ったら、2023-12-10のBlogでは更に続きがありました。

この後にMain.cppに戻りDebugLayerが使用出来るかどうかTestしていました。

これはやっていません。

8.1.2 2023-12-10のBlogでやってない部分を実装する

2023-12-10のBlogでMain.cppの部分を実装します。

Main.cppからDebugLayer.hを使用出来るようにします。

Main.cppに以下の実装を追加しました。

うーん。

この実装方法知らないです。

Class名::Get().関数名

ですか?

先にこの実装で本当にDebugLayerが動いているのかを確認します。

実行しました。

2023-12-10のBlogの結果と同じMessageが現れました。

更に以下の場所にBreakpointを追加してDebugLayerのObjectが存在しているのを確認しました。

DebugLayerが動いているのは間違いないですね。

8.1.3 Debug Layer | D3D12 Beginners Tutorial [D3D12Ez] [11]をもう一回勉強する

以下の実装についての情報もTutorialで解説しているかもしれません。

Class名::Get().関数名

のでまずTutorialをもう一回勉強する事にします。

まず以下のSingltonの実装について解説していました。

ここにGet()関数があったんでした。

Class名::Get().関数名

の意味が判明しました。

Get()関数内の実装を見ると

となっています。

StaticなのでDXDebugLayer型のInstanceであるinstanceは一個しか作成されません。

最初にこの関数が呼ばれた時だけinstanceが生成されると言う訳です。

理解しました。

次にCom Pointerで以下の2つの変数を宣言したところです。

ここではID3D12と言うPrefixがDirectX12のDirect 3DのInterfaceである事を示す事や、DebugのVersionは常に更新されているので、Versionが新しくなる毎にDebug1、Debug2と後ろの番号がどんどん増えていく事についても解説していました。

IDXGIというPrefixについての意味は解説してなかったです。

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

ここでは何故 Init()関数だけBoolを返すようにしたのかについての説明がありました。

後でAssertなどで使用する可能性があるからだそうです。

Debug Layerを使用するための実装です。

ここでもかなり専門的な解説をしていました。

Com Pointerを使用するのではなくD3D12の関数を読んで実装するのは何故かとかの解説です。

正直、説明聞いてもあんまり理解出来ません。

この実装は「DirectX 12の魔導書」の実装と同じだったので定型的にこうやるものだ。位の理解で先に行きます。

こっちは絶対にやる必要はないそうです。

ただこのDebugはCom PointerのLeakingを追跡するのに有用だそうです。

ので実装したそうです。

更にEnableLeakTrackingForThread()関数についての解説もしていました。

ComPointerのLeakingを監視するのが目的なのでこの関数を使用するそうです。

成程。

先週のBlogには以下のようにまとめていますが、

こっちはFactoryを使用していますので、これは全然違いますね。

DXGIGetDebugInterface1()関数とCreateDXGIFactory2()関数の違いですね。

公式SiteのDXGI functions [12]にはそれぞれの関数について以下の解説がありました。

CreateDXGIFactory2()関数についての解説です。

DXGIGetDebugInterface1()関数についての解説です。

これ読んだだけじゃ違いはよく分かりません。

両方使って違いを比較するしかなさそうですね。

これらの違いを理解するのは数年後になりそうです。

次です。

Shutdown()関数に以下の実装を追加していました。

Release()関数はPointerではなくDotで呼び出す必要があるそうです。

理由までは理解出来ませんでした。

次にShutdownする前にCom PointerのLeakについて調べるための実装を追加しました。

ここではm_dixgiDebugがTrueならばCom PointerのLeakがある事になります。

そしてどのObjectが生きているのかをReportLiveObjects()関数で調べるそうです。

ここの内容はかなり複雑なので来週、しっかり勉強する事にします。

今週のLötwig Fusel氏のD3D12 Beginners Tutorialの勉強はここまでとします。

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

8.2.1 先週の復習

先週何を勉強したのかを全く覚えていません。

先週のBlogを読んで復習します。

思い出しました。

以下に示したD3DCompileFromFileのそれぞれのArgumentの意味を調べたんでした。

以上でした。

となると今週は「4.6.3 D3DCompileFromFile()関数」の「Errorが起きた場合」を勉強する事になります。

8.2.2 「4.6.3 D3DCompileFromFile()関数」の「Errorが起きた場合」の勉強と実装

まずErrorの情報ですが以下のErrorBlobに入っています。

当然ですね。

ErrorのMessageは以下の方法で受け取るそうです。

まずGetBufferSize()関数はErrorBlobのSizeを返します。

これでString errstrのSizeをErrorBlobのMessageを全部受け取れる大きさに変更します。

その後はCopy_n()関数を使用してErrorBlobのMessageを受け取ります。

最後にOutputDebugStringA()関数を使用してErrstrの内容を表示します。

おまけでFile名が間違ってないのかのCheck方法も書かれていました。

こんなの自分で確認しろと思いましたが一応、記録しておきます。

File名が間違っている場合は、D3DCompileFromFileの結果が、

HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)

になるそうです。

Sample Codeには以下の様実装されていました。

最後にこの部分を自分のProjectで実装します。

しました。

Vertex Shaderの方の実装です。

Pixel Shaderの方です。

どちらもSample CodeをそのままCopyしただけです。

最後のExit(1)にCommentで行儀が悪いかもと書かれていましたが、理由が分かりません。

これもそのままCopyしておきます。

最後に実行して普通に動く事を確認しました。

あれ?

このMessageってDebugLayerからのMessageでこんなにObjectが生きていますよ。という警告ですよね。

うーん。

まあ、このMessageの意味が理解出来るようになったと言う事で今回は良しとします。

今週の「DirectX 12の魔導書」の勉強はここまでとします。

9.まとめと感想

今週は月曜日に目の周りの切開をしたので、Landscapeの勉強は全く進みませんでした。

Landscapeの勉強は来週、頑張る事にします。

10.参照(Reference)

[1] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB

[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] Urban Decoders. (2023, November 18). How to 3D Gaussian splat from Aerials to Unreal 5 (Free plugin) [Video]. YouTube. https://www.youtube.com/watch?v=SDO1XdFXl8M

[4] JzTz. (2023, July 1). EASY Road and junction tutorial for Unreal Engine 5 [+ FREE ROAD MESH!] [Video]. YouTube. https://www.youtube.com/watch?v=RCv3dFUjOf0

[5] CATTech.LAB Co., Ltd. (2019, September 9). 科学技術計算ツール. 科学技術計算ツール. https://cattech-lab.com/science-tools/

[6] Ben Cloward. (2023, October 12). Worn-Out LCD Screen Shader - Advanced Materials - Episode 25 [Video]. YouTube. https://www.youtube.com/watch?v=i4EXZdpVdT0

[7] Ben Cloward. (2023, October 19). Animated Flag - Advanced Materials - Episode 26 [Video]. YouTube. https://www.youtube.com/watch?v=ZV2YrrKzs9c

[8] Rick Banks. (2022, June 20). Houdini - Wall Tool 06 [Video]. YouTube. https://www.youtube.com/watch?v=o6Jfgv_FXWs

[9] Pi Equals Three. (2023, April 25). MAKE JUMPSCARES IN FORTNITE with Cinematic sequence device - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=Axxmn6wuwow

[10] Pi Equals Three. (2023, March 30). Make a custom UI with a clickable Button - UEFN/Creative2.0 [Video]. YouTube. https://www.youtube.com/watch?v=vB6vXZNgzkM

[11] Lötwig Fusel. (2023, May 8). Debug Layer | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=FKTfuKB6LTc

[12] Stevewhims. (2022, May 24). DXGI functions - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-reference-dxgi-functions