UE4の勉強記録

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

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

1. 今週の予定

去年と同じ内容をやっていきます。

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

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

建物の作成の続きをやります。

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 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強の続きをやる

先週は二個目のカメラを適切な位置にセットした後で、間違って移動させてしまい、直す前に3D酔いになってしまい、途中で終了したんでした。

まずCameraの位置を直しました。

Cameraから見た風景です。

地面の色が黒過ぎます。

直します。

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

もっと草が生えてたりとか岩が埋まってたりとかしないとオカシイですね。

草とか岩を追加しますか。

まずAssetを確認します。

この辺のAssetには使えそうな草や岩が結構ありそうです。

今週はこれらのAssetの中身を確認する事にします。

と思ったんですがDownloadの速度規制が掛かっているみたいで、全然Download出来ません。

これは来週までにDownloadしておいて来週やる事にします。

<Procedural Biomes>

<Procedural Nature Pack Vol.1>

<Realistic Forest Pack>

<Nature Package>

<Scanned Poplar and Aspen Forest>

<Spring Landscape>

<Stone Pine Forest>

<Tropical Jungle Pack>

せっかく久しぶりにBridgeを開いたので以下のAssetをDownloadしました。

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

2023-10-22のBlogには以下のようにまとめられていました。

のでCamera Setupの3つ目のCameraの部分から以下にまとめます。

<<Camera Setup>>

配置されているCameraをDuplicateして家の中に配置しました。

ここまでは今までのCameraの配置と同じです。

Cameraからの映像です。

Current Focal Lengthの値を50に変更しました。

うーん。

こっちの方が人間の視覚に近いみたいですね。

更に

Current Focal Lengthの値を35.0に変更しました。

うーん。

これは行き過ぎな気がします。

画面が暗すぎるのでPost ProcessのLensにあるExposureのExposure Compensationの値を変更します。

結果です。

おお、明るくなるだけじゃなくて、画面に芸術性が追加されましたね。

まだ画面が狭いと言って、

Current Focal Lengthの値を更に下げました。

結果です。

うーん。

画面中央にある椅子やSofaが細く見える気がします。

このCurrent Focal Lengthの値の設定をこの値にする理由はよく分からないです。

Sphereを部屋の中に配置しました。

Sphereを配置すると画面がまだ暗いのが分かります。

Exposure Compensationの値を11.5に上げました。

結果です。

更にCameraをDuplicateして以下の画面を撮影しています。

画面が暗いのでExposure Compensationの値を16.0に変更しました。

結果です。

芸術的な画面かもしれませんが、Photo-Realistic感はなくなりましたね。

Current Focal Lengthを18.0にセットしました。

結果です。

Focus Distanceを

以下のLamp?に合わせました。

これでCamera Setupは終わりでした。

この画面のPhoto-Realistic感が無いのは次の節であるLight Sourcesで直すそうです。

 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]のCamera Settingを実装する

室内のCameraの設定方法は大体理解したので実装します。

以下にCameraの設定方法をまとめます。

  1. 画面が狭かったらCurrent Focal Lengthの値を下げる
  2. 画面が暗かったらExposure Compensationの値を上げる
  3. Spheresを画面内に配置して画面の暗さなどを確認
  4. もう一回、Current Focal Lengthの値を調整
  5. もう一回、Exposure Compensationの値を上げる
  6. Focus Distanceを調整

こんな感じです。

それではやってみます。

一個目の室内Cameraからの画面です。

Current Focal Lengthの値を15.0にしました。

結果です。

おお、ぐっと情報量が増えました。

Exposure Compensationの値も変更してみます。

8.21だったのを10.0に変更しました。

結果です。

おお、少し明るすぎるかもしれませんね。

後、これだけ日光で明るいなら窓枠の影が床に写ってないと変です。

これはどうやって直せば良いのか分かりません。

これからの課題とします。

最後にFocus Distanceを以下の位置に変更しました。

結果です。

うーん。

良い感じです。

Spheresをここに移動させて更に細かい調整をします。

Sphereを配置しました。

うーん。

今のままでも良い気がします。

そもそもこのSpheresをどうやって活用すべきなのか知りませんでした。

黒い球は十分に黒く見えますし白い球はそれなりに白く見えます。

それそれの球のShaderもはっきり確認出来て球の凹凸ははっきり認識出来ます。

今週は3D Gaussian Splattingも試すのでUnreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強はここまでとします。

2.2 Step-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [3]を実装する

まず先週のBlogをしっかり読み直します。

読み直しました。

うーん。

やってみますか。

XV3DGS-v1.10-ue5.3をDownloadします。

しました。

解凍しました。

UE_5.3のPluginsの中に配置しました。

そしてUE5.3を起動させます。

起動させたらXV3dGSをEnableし

UE5Editorを再起動します。

再起動したらTool BarのPlatformsの脇に新しくXのIconが表示されるようになりました。

先週見た

とはIconの形状は違っていますが機能は多分同じでしょう。

Cursorを乗せると以下のような説明が現れました。

Clickしたら

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

ここに3D Gaussian SplattingのDataを入れるのか。

うーん。

PolycamのHomepageに来ました。

Splats->と書かれている箇所がありました。

これをClickしてみます。

ここにあるDataをDownloadする事が出来そうですね。

Tutorialを見ると

でDownload出来るDataを表示しています。

うーん。

これは分からない。

とりあえずDownloadしてみます。

Accountを作成しろと出て来ました。

はい。

名前なんかを登録したら以下の画面が出て来ました。

Albumを作成しろ。とありますがこれは必須なんでしょうか?

なんか課金されそうで嫌なんですが。

Albumを作成してDownload Model after SavingにCheckを入れて保存を押しました。

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

Export toにUnrealを選択してDownloadを押しました。

ずっとグルグルまわっているので一端中止します。

もっとSizeの小さいのをDownloadする事にします。

これをDownloadしましょう。

DataをExportするにはProのlicenseを得る必要があるみたいですね。

うーん。

GAUSSIAN SPLATを選択したらDOWNLOAD Buttonが押せるようになりました。

押したらまたグルグルが始まって何も起きません。

PolycamのDataのDownload方法を調べます。

Exportはお金を払わないと出来ないとありました。

うーん。

今週はここまで。

流石に課金してまで試す気にはなりません。

2.3 現実の映像とUEを組み合わせる方法を勉強する(追記)

3D Gaussian Splattingは実際に撮影した映像を元に3D Graphicsを作成します。

これとは別に実際に撮影した映像をそのまま3Dに組み込んでCGを作成する方法があります。

これについて少し調査します。

以下の二種類があります。

  • 背景を3Dで作成してGreen Screenで撮影した人物をその3Dに組み込む
  • 背景+人物も2Dで撮影したものにVFXとして3Dを追加する

それぞれについて調査します。

<背景を3Dで作成してGreen Screenで撮影した人物をその3Dに組み込む>

以下のTutorialが見つかりました。

これ見るとCinecom.net氏が沢山それ関連の動画を作成しているようです。

それに対して

<背景+人物も2Dで撮影したものにVFXとして3Dを追加する>

これはUEで出来るのかどうか分かりません。

しかしBlenderでは出来るのは以下のBlenderのTutorialで分かっています。

これと同じ事、もしくはこれと近い事をUEで出来るのかを調査します。

このTutorial内で動画を撮影したCameraの位置を計算している場面があるのですが、UE単独ではそれをやる機能はないみたいです。

なのでAfter Effectを活用してその効果を得る方法を取るみたいです。

多分ですが以下のTutorialでその方法について説明しているかもしれません。

一寸確認します。

After Effects to Unreal Engine 5 (THE EASY WAY) [8]を軽く見る>

やっぱりAfter Effectで3D CameraのMotion Trackerを使用していました。

最終的にUE内で以下の映像を作成していました。

これはBlenderで見たのと同じです。

After Effectを使用すれば2Dの映像とUEの3Dを組み合わせる事が可能で有る事が分かりました。

Blenderで作成したMotion TrackのDataをUE5にExportしたらAfter Effectでやっている事と同じ事が出来るじゃね。と

それについて調べました。

TRACK THIS! - Camera Tracking From Blender To Unreal Engine [9]で近い事をやっていました。

この動画もJoshua M Kerr氏が作成していました。

この人の動画は要Checkする必要がありそうです。

こんな感じでした。

3. Niagara の勉強

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

3.1 先週の復習をする

四章の「木の生成Simulations」の最初の3つの節を勉強していました。

「14.1 木の生成Simulationsの理論」では

まず木の生成のAlgorithmをまとめています。

ただしこれを実際に実装するためには、枝(幹)の始点と終点を管理してその間に線を引く必要があります。

それについてその後で具体的なやり方をまとめていました。

「14.2 Niagaraで線を書く」では

Niagaraを使用して2つのParticleの間の線を書く方法を解説していました。

「14.3 木の生成Simulationの実装」では実際の実装方法について解説していました。

3.2 「木の生成Simulations」の実装をやる

「14.3 木の生成Simulationの実装」で勉強した部分を実装します。

実装する前にEmitterのTemplateをどれにするのが良いのかを決定する必要があります。

Sample Codeを見て検証します。

以下のEmitterです。

うーん。

これだったらEmptyでも良い気がしますね。

とりあえずEmpty Emitterで実装する事にします。

Preview画面で完成した木の画像を見る事も出来ました。

こんな感じで枝が生えている木って確かに存在してますね。

まずNSを作成しました。

名前はNS_FractionalTreeとします。

Tutorialでの名前とは違いますがNiagara SystemはNSで統一したいのでこれで行きます。

Empty Emitterの名前を変更します。

こっちはTutorialと同じFractionalTreeにしました。

こっちはTutorialと同じ名前です。

EmitterのProperties Moduleを選択してSim TargetをGPUに変更しました。

更にいつもの設定の変更をしました。

更にEmitter Update SectionにSpawn Burst Instantaneous Moduleを追加し

Spawn Countに700をセットする事で

Particleを700生成します。

Tutorialの説明ではこれが枝の始点と終点になるとありました。

次にEmitter Update SectionにあるEmitter State System Moduleの設定を変更します。

以下に示した様に変更しました。

これも発生したParticleをずっと表示するための定型的な設定ですね。

CGHOW氏のTutorialで散々やりました。

次にParticle Spawn SectionにあるInitialize Particle ModuleとParticle Update SectionにあるParticle State Moduleを消します。

教科書ではこの2つのModuleを消す理由をParticleの消滅をしないからと書いていますが、これってどうなんでしょう?

確かにInitialize Particle Moduleでは以下のようにLifetimeを指定していますし、

Particle State Moduleでは以下のように

実際にParticleをKillしています。

でもInitialize Particle Moduleに限って言うと、このModuleの機能って作成したParticleのLifetimeを指定するだけじゃないです。

今回はLifetimeを指定する必要が無いうえにParticleを消滅しないだけでなくParticleそのものの色やTransformなどのAttributeを指定する必要がないからInitialize Particle Moduleを消しても問題ない。というのがより正確な気がします。

消しました。

次に変数を作成します。

教科書の説明では[Particle] Positionは最初から存在しているのでそれをParticleの始点として利用すると言っています。

しかし私のNSのParameterを見ると

Particle Attributeに一個のParameterも表示されていません。

一応、Render SectionにあるSprite Renderer Moduleの

Bindingsを見るとPosition Bindingで[Particle] Positionを使用しているので

ある事はあるみたいです。

この状態でParticle Attributesに[Particle] Positionを追加します。

なんと名前が変更出来ません。

これはParticle Spawn SectionにあるInitialize Particle Moduleを消したからじゃないでしょうか?

復活させてみます。

Particle Attributesに以下のParameterが表示されるようになりました。

よしこれから新しいParameterを追加出来ると思ったら

またErrorになりました。

なんと[Emitter]側に強制的に移動されて作成されました。

うーん。

何となく理由が分かって来ました。

私は新しいPosition型のParameterを作成している気になっていたんですが、ここに表示されたParameterは[Particle]PositionというもとからあるParameterの様です。

Make NewからPositionを選択しても既にある[Particle]Positionに飛んでしまいます。

何で?

何回か試していたら突然、新しいPosition型のParameterを作成出来ました。

名前をEndPositionに変更しました。

うーん。

ここは深堀すべきところなのか?

そのまま無視して進んでも問題ない気もします。

うーん。

先に進みます。

今度はInt32型のDepthという変数を作成します。

これはそのParticleが最初のParticleから数えてどの深さなのかを記録するためのVariableだそうです。

こっちは何の問題もなく普通に作成出来ました。

次にVector型の変数を作成します。

Forwardと言う名前だそうです。

これも普通に出来ました。

次にAttribute Reader型の変数をEmitterに作成します。

Particle Attribute Reader型しかありません。

これで作成しました。

これで正しいのかSample Codeで確認します。

Particle Attribute Readerと表示されています。

以下のように表示されています。

あってるでしょう。

名前だけAttribute Readerに変更しました。

今度はGPU Simulation Stageを追加します。

名前はSolveとしました。

Solve Sectionに新しいScratch Pad Moduleを追加します。

名前はこれもSolveとします。

Map Getノードに以下のParameterを追加しました。

Custom HLSLノードを追加しました。

Map Getノードにある全てのInputをCustom HLSLノードにPassしました。

Custom HLSLノードのOutputを作成します。

次はMap setノードにParameterを追加します。

しました。

Custom HLSLノードのOutputとMap SetノードのInputを繋ぎました。

ここでApplyを押して一端、Scratch Pad Moduleの作成を終了します。

Solve SectionにあるSolve Moduleを選択し

Attribute Readerに[EMITTER] Attribute Readerをセットしました。

ここからCustom HLSLノードの実装になります。

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

4. Materialの勉強

先週勉強した Using Custom HLSL Code - Advanced Materials - Episode 24 [4]を実装します。

4.1  Using Custom HLSL Code - Advanced Materials - Episode 24 [4]実装する

こっちもCustom HLSLノードの使い方です。

以下のようなCodeを書きました。

Float3の値を色々変更しました。

Descriptionの値を変更しました。

結果です。

Customノードの名前が変更しました。

次はInputsの使用方法についてです。

以下のような実装をしました。

Input Nameを追加して名前をColorにしました。

CustomノードのInputにColorが作成されました。

これだけだとInputした値が結果に全く反映されないので

Codeを以下のように書き換えました。

更にInput先にFloat3型の変数を繋げました。

Inputに関しては2つ問題があります。

それぞれ検証します。

まずCustomノードのInputに何も接続しないとErrorになる事です。

うーん。

Default値を設定出来ると思ったんですが、そんな設定はどこにもなかったです。

次の問題はInputに繋げられるNodeのTypeを指定する箇所が無い事です。

Float1のNodeを代わりに繋げてみます。

別にErrorにならないですね。

ただしCodeは以下のように変更しています。

<Lerp(A, B, T)>

今度はLerp()関数の使用方法についてです。

以下のように設定を変更しました。

更にInputも繋げました。

む、

Errorになっています。

Lerpじゃなくてlerpじゃない?

と書かれています。

直します。

以下のように直しました。

結果です。

今度は上手くいきました。

<Texture2DSample(Tex, TexSampler, UV)>

今度はTexture2DSample()関数の使用方法について実装して確認します。

以下のように設定を変更しました。

このTexSamplerが何を指定しているのかが不明です。

この件は先週散々調査したけど不明でした。

Inputに以下のNodeを接続しました。

結果です。

<For Loop>

今度はFor Loopを実際に使用してみます。

Material内ではLoop()関数を表すNodeは無かったはずです。

このCustomノードの使用方法はかなり利口です。ただしCostは凄い掛かるとは思いますが。

結果です。

うん出来てますね。

Materialを組むときにLoopが必要になったらこの方法でやる事にします。

<もう少し複雑なLoop>

今度は以下の実装をCustomノードに追加します。

まず実装部に以下のCodeを書き込みました。

うーん。

多分あってる。

流石にEditorの自動でTypoを指定してくれる機能なしで、しかもこんなに細かいSpaceにCodeを書くのは苦痛です。

更にInputに以下の値を追加しました。

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

Errorが出ています。

うーん。

Texture2DSample()関数のTextureの最初のTとSampleのSは大文字でした。

直します。

結果です。

うーん。

Textureを水玉模様に変更します。

結果です。

以下の値を変更してみます。

結果です。

おお、四角くなっています。

出来てますね。

<四角くならないための実装>

四角くならないための実装も試してみます。

そう言えば先週このCodeを読んで理解する事はやってなかったです。

まずCodeを読んで内容を理解します。

まずVariableがTex、UV、Directions、Quality、Size、そしてtexResがあります。

それぞれのTypeは

TexはTexture Object。UVはTexCoord[0]、Directions、Quality、SizeはFloat、そしてtexResはFloat2でした。

そしてPi2はFloatでPi×2=6.28です。

RadiusはFloat2でSize/texRes.xyです。

教科書ではSizeの値は8、TexRes.xyはそれぞれ512でした。のでRadiusは8/512 = 0.015625でした。

Radiusは半径と言う意味ですが何の半径なんでしょう?

あ、水玉の半径だ。

水玉の半径が8 PixelsだとするとTextureのSizeが512になるのでTextureに対する割合は8/512になります。

Directionsが何なのかが分からないですね。

Floatで値は16になっています。

方向を示すならVectorでFloat2である必要があります。

うーん。

分かりました。

16分割しているんです。

16の方向にずらして値を取っています。

次のQualityですが以下のFor Loopでiの値を出すために以下の実装で使用されています。

あ、分かりました。これは16方向にどれだけ伸ばすのかを決定しています。

それぞれのPixelから16方向に周りのSampleをとって更にQualityの数だけその方向を少しだけ拡張してSampleしている訳です。

もう理解しました。

後、Customノード内のSin(x)のxはRadian表示のようですね。2piで360度と同じになっていますから。

UEのSin(x)はDefaultでは1が360度と同じ値になるように調整されているので、一応確認のために書いておきます。

もう全部理解したので実装します。

以下のように打ちました。

合ってるはずです。

それぞれのParameterです。

結果です。

うーん。

ぼやけ過ぎて何だか全く分かりません。

Sizeの値を小さくしたら

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

うん。

できています。

5. Gaeaの勉強

5.1 先週作成したPower Pointで動画を作成する

音ズレが激しくて何回も直しました。

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

前回の動画を確認したら5回しか再生されていません。

Tutorialの最初の動画は80回位再生されていますが、回を重ねる毎に再生回数が落ちています。

まあ、再生回数は気にしないで兎に角、Tutorialを完成させる事を第一に考えてやっていきます。

5.2 ErosionノードとSedimentノード

Sedimentノードが以外と使える事が判明しました。

のでそれをまとめておきます。

以下のような地形があるとします。

Sedimentノードを追加します。

Depositが追加されました。

ただし全体に均一に追加されるのではなく傾斜が激しい場所や高度が周りに比べて高い場所にはDepositは追加されていません。

その結果、Terrainの特長、例えばこの場合ならStackの特長が、しっかり確認出来ます。

これがAlluviumノードやDepositノードだと以下のように全体に均一にDepositが追加されTerrainの特長が完全に消えてしまいます。

更にDepositsの場合だと線状の盛り上がりが形成されてしまいます。

Erosionノードを追加した場合は以下のようになります。

Depositsは適度に追加されています。

がSedimentノードを追加した時のようなそれまでの地形の特長は消えてしまっています。

Erosionノードの結果をよく見るとDepositsの追加だけでなく水が流れた後のような溝が形成されています。

この溝の形成がそれまでの地形の特長が消えてしまう原因のようです。

同様の現象はStratifyノードで形成された地形でも起きています。

Sedimentノードを追加した結果です。

Stratifyノードの特長がしっかり確認出来ます。それでいてDepositが追加されているのも確認出来ます。

Erosionノードを追加した結果です。

Depositと溝が形成されています。

ただし、この場合は前の地形の特長が少しだけ残っていました。

前の地形の場合もErosionノードのParameterを変更したら元の地形が確認出来るかどうかの確認をします。

結果です。

うーん。

これだとかなり前の地形の特長が確認出来ますね。

やっぱりErosionノードが一番使いやすいですね。

5.3 これからのTutorialの予定

一応今回で以下の3つのNodeを組み合わせる事で、

以下に示した3つの工程の

  1. 地形(Terrain)を作成
  2. 色を付ける
  3. Buildをする

の一番最初の工程である「地形(Terrain)を作成」が終わりました。

ので次の工程である色を付けるを始めようと思います。

5.4 色の追加の仕方を検討する

ここで別のGraphを利用する方法も教えてしまいましょう。

まず一色で塗る場合の実装を示します。

Erosionノードの終わりでTerrainの作成は終わりです。

その後で、Fxノードを追加しています。

Fxノードを追加したのは、これはここでTerrainの作成が終わっているという印になります。

そしてBuildする時にこのFXの結果をExportする事になります。

次に色を追加します。

まず単色の色を追加します。

これはPrimitives GroupにあるConstantノードを追加する事で実行されます。

ConstantのPropertiesにあるOutputの値をColorに変更します。

そして色を変更します。

Defaultでは黒に設定してあるので赤くしました。

結果です。

赤一色でTerrainが塗られました。

右上にあるTool Barの+を押します。

新しいGraphが形成されました。

以下のようにFXからLineを引っ張って

Mouseの左Clickを離すと以下のBoxが表示されます。

そのBoxにはMake Portalと言う選択肢があります。

これを選択します。

こんな感じになります。

次にColorのGraphに移動します。

そこに先程のConstantのノードを追加しました。

InputからLineを引っ張ってBoxを表示します。

Portalsを選択します。

するとFxと言う名前のPortalが表示されるので

それを選択します。

これで前のGraphのFxの結果がConstantノードに繋げられました。

当然このConstantノードのPropertiesの設定は前の解説と同じように変更しています。

結果です。

赤一色ですがTerrainに色を塗る事に成功しました。

6. Houdiniの勉強

6.1 Houdini - Wall Tool 05 [5]を勉強する

先週、Houdini 19 - Wall Tool 04 [6]の実装が終わったので今週はその次のTutorialを勉強します。

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

今回のTutorialは目次がありません。

どうして無いんでしょうか?

Descriptionを見たら以下のKey Momentsがありました。

これって目次じゃないの?

うーん。

これに基づいてまとめます。

<Intro> 0:00

今回のTutorialでは先週加えたそれぞれのBrickのSizeのばらつきに更に少しだけNoiseを追加するそうです。

そのためにFor Each Loopの特性を利用するそうです。

<Meta Import> 0:39

そのためにMeta Import Nodeを使用するそうです。

まずForeach Beginノードを選択します。

以下のBoxがParameter Paneに表示されました。

<Create Meta Import Node> 0:45

Create Meta Import NodeをClickします。

以下に示した様に

Foreach Begin1 Metadata1ノードが作成されました。

このNodeには

ParameterにDetail Attributesがあります。

これを使って何かするみたいです。

ここで今回何をするのかが分かりました。

それぞれのBrickの位置を少しだけ凹ましたり、飛び出したりするそうです。

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

そしてforeach_Beginノードの結果を第一のInput Pinに繋げました。

更にforeach_Begin_Metadataノードの結果を第二のInput Pinに繋げました。

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

ここからそれぞれのPointのNormal Vectorを表示して

これらを利用してBrickを凸凹にします。と説明しています。

そしてそのためには少しだけVectorの数学を利用します。とも言いました。

以下の図で説明しています。

赤で囲んだ点がPointで青の矢印がそのPointのNormalです。

このNormal Vectorに対してUp Vectorを追加すると以下のようになります。

Up Vectorってなんでしょうか?

聞いたことないですが。

まあNormal Vectorに対して垂直なVectorを加えただけでしょう。

この2つのCross Productsを計算します。

すると以下の図で示した茶色のVectorのようなこの2つのVectorに対して垂直なVectorが現れます。

うーん。

成程。

このVectorにRandomな値をかけてその値をPointの値に足したらそれぞれのBrickが少しだけ凹んだり飛び出したりするようになります。

うーん。

これは勉強になった。

これをCodeに落とし込みます。

<Construct an Up Vector> 4:54

Up VectorはY軸に沿ったVectorなので{0,1,0}で表しています。

HoudiniはY軸が上を指しています。ここは注意が必要です。

今度はこのv@sideを可視化します。

以下のIconをClickします。

<Visualizers> 5:44

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

Sceneの+をClickして以下のBoxを表示させます。

Markerを選択します。

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

Labelの値をSideに変更します。

更にAttributeの値もsideに変更します。

そしてStyleの値をVector Trailに変更しました。

最後にLength Scaleの値を少しだけ下げました。

結果です。

黄色い線が追加されました。

今度はRandom Valueを作成します。

この辺は想像通りでした。

Rand()関数を使用してRandom Valueを作成するCodeを追加します。

最初のParameterはSeedを指定しますが、ここで一寸注意する必要があるそうです。

Primitive Numberを使用するとFor each Loop内では常に0になってしまうからだそうです。

そうなのか?

この辺は初めて聞く話ばっかりでそう説明されても???となってしまいます。

もっと勉強続けたら成程。と思えるようになるんでしょうか?

で、ここで先程作成したForeach Begin1 Metadata1ノードが活躍します。

Foreach Begin1 Metadata1ノードのAttributeにあるIterationを使用するそうです。

え、そんなのあったの?と思って確認したら

以下に示した様に

Detail Attributesの後ろにIterationで書いてありました。

うーん。

これってそういう風に見るものだったのか。

以下の実装でForeach Begin1 Metadata1ノードのAttributeにあるIterationの値を取り出します。

まずDetail()関数を使用します。

そして最初のParameterである1は

以下に示した様に

Foreach Begin1 Metadata1ノードの結果が、Attribwrangle2のInputの2番目に接続している事を示しているそうです。

これは0から数えているから当然ですね。

次のParameterである”iteration”はどのAttributeの値を取り出すのかを指定しています。

そして最後の0はIndexを指定するためのもので0で問題ないそうです。

これは初めて勉強する関数ですね。

一応、公式Siteのdetail expression function [7]の情報も確認しておきます。

あんまり詳しい解説ではないですね。

それぞれのParameterに関しての説明もほとんどないです。

最初のParameterの名称がSurface_Nodeになっていて

ExampleではNode名を指定しています。

あれ?

これTutorialの解説と違くない?

もう一回Tutorialの解説を確認します。

やっぱりここでまとめた説明をしています。

どっちの指定方法でも良いんでしょうね。

適当な数をかけてRand()関数を閉じます。

最後に0.5を引きます。

これはRandomな値の範囲を-0.5~0.5に変更するためです。

最後括弧で全部の式を閉じます。

この時この括弧の事をBracketと呼んでいました。私は括弧の事をParenthesesとしか読んだこと無いです。

と言う呼び方が一般的だと思うんですが、Canadaでは違うんでしょうか?

イギリスは違う呼び方をするって話は前に聞いたことがあるので、もしかしたらCanadaでも違うのかもしれません。

最後にMultiと言うAttributeの値を掛けました。

ナニコレ?

と思ったんですが、これParameterで壁をどのくらい凸凹にするかを調整するためのものですね。

このParameterを生成するために以下のIconをClickします。

このIconの機能については先週勉強したので覚えています。

作成したAttributeの値を指定するためのBoxを生成するんです。

Tutorialの動画を注意深く見ると、

以下のBoxが生成されていました。

これでRandom Valueが生成されたので、次の工程は、この生成されたRandom Valueに基づいてPointの位置を移動する事です。

それはどうやるんだ。

と思ったら以下の実装で簡単に済ましていました。

本当に+=って便利な機能ですね。

Attribwrangleノードの名前を変更し、Attribwrangle _brickJitterとしています。

更にParameterがあるNodeなので色を黄色に変更しました。

そしてその結果をCopytoPoints2ノードの2番目のInputに繋げました。

これでそれぞれのBrickの位置を凸凹にするための値がForeach Loop内にPassされました。

Foreach_end1ノードを選択し可視化します。

結果です。

Vectorを全部消します。

あれ、何も変化してないですね。

Attribwrangle_brickJitterノードに戻り、Multiの値を0から変更します。

結果です。

おお、Brickの位置が前後するようになりました。

これは大げさすぎるので以下の値に変更しました。

結果です。

おお、古い城の壁の感じが出て来ました。

今度はBrick同士の間にすこしだけGapを追加するそうです。

<Carve Node> 10:17

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

更にAttribwranble_brickJitterノードの結果をCarveノードのInputに繋ぎました。

Carveノードの結果を可視化すると以下のようになりました。

CarveノードのFirstUの値を変化させると

そしてRelative Channel Referenceを選択します。

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

最初の値のRelative Channel ReferenceじゃなくてInverseな値が必要なので以下のように値を変更します。

結果です。

両方のPointが向きが反対ですが同じ量だけ移動するようになりました。

Carve_TweakBrickWidthノードと名前を変更しました。

更にParameterがあるNodeなので色を黄色に変更しました。

Carve_TweakBrickWidthノードの結果をCopytopoint2ノードの2番目のInput Pinに接続しました。

Foreach_end1ノードを選択し可視化します。

Brick同士の間に隙間が発生しました。

次にPoly Extrude 1ノードの設定を少しだけ変更するそうです。

Distanceの値に0.96を掛けました。

結果です。

上下のBrick同士の間にも少しだけ隙間が発生するようになりました。

ただこの隙間の幅は全部同じです。

これで終わりでした。

実装は来週やります。

7. UEFNの勉強

今週は先週勉強したPi Equals Three氏のMake a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [10]を実装します。

UEFNはなんか私の想像していたのとは全く違った未来を歩んでいて、このままいくと先細りして消滅してしまいそうです。

Game系Influencerは嘘つきなんです。

彼らの言う事を信じてその通りにやっても絶対に成功しません。

しかしEpic Games社はこのUEFNで作成したProjectに対して収益の40%を還元するという、一寸とRiskyな決断を下してしまいました。

ただしUnreal Engine 6 = UE5 + Verse [11]によるとUE6にはVerseが標準搭載されるそうです。

のでUEFNの勉強はしておいて損はありません。

またミニゲームなんかを公開しておくのにUEFNは適しているのも事実ですので、そういう意味でも勉強しておくのは損ではないです。

7.1 Make a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [10]を実装する

<Intro>

特に実装する内容は無いです。

次のStepに進みます。

<Setting up Pop-Up-Dialog Device>

Pop-Up-Dialog DeviceをLevel上に配置します。

これですね。

Pop-Up-Dialog Deviceだと検索にひっかからなくて

Pop-Up Dialog Deviceだと検索で出て来ます。

あ、Hyphenが余計にあった。

はい。

配置しました。

名前をPage1に変更しました。

Response Typeを3 Buttonsに変更します。

TutorialではDefault Back ButtonはButton2に変更していますが、

これは元からButton 2でした。

Button1 Text、Button2Text、Button3 Textの値も以下のように変更しました。

Duplicateして3つに増やします。

表示するTextを追加します。

Page 2とPage 3のTextの内容は指定されていないので以下のようにしました。

<Setting up Page Functionality>

ButtonをLevel上に追加します。

はい。

追加しました。

名前をOpen Book Btnに変更しました。

Page1のShowにこのButtonをBindさせます。

TutorialのImageと微妙に違いますね。

以下にTutorialのShowのScreenshotを示します。

うーん。

多分UIが変更されただけでしょう。

次をやります。

Page2を追加しました。

Page2にあるButton1が押されたらPage1が表示されると言う意味です。

次はPage2の設定を行います。

Page2にあるButton3を押すとPage1に戻ります。

Page2にあるButton1を押すとPage3に進みます。

Pop-Up-Dialog Deviceの設定は以下のようにしています。

Buttonが3つあって、二番目のButtonを押すとDefault画面に戻ります。

それぞれのButtonの名前はPrevious、Exit、そしてNextです。

この設定だとPrevious Buttonを押すと次のPageに移動してしまいます。

あれ?

うーん。

自分の考える正しい方法で実装してみます。

以下のように直しました。

こっちが正しいはずです。

テストして確認します。

<Final Result>

Buttonを押すと以下のUIが表示されました。

NEXT Buttonを押しました。

なんの変化もありません。

あれ?

Previous Buttonを押してみます。

Page2に戻って来ました。

あれ?

先程の設定が間違っていたの?

ああ。

分かりました。

勘違いしていました。

Page1の設定ですが、

OpenBookBtnのInteractを押すとPage1が開きます。

Page2のButton1を押すとPage1が開きます。という意味でした。

うーん。

勘違いしていました。

Testして確認するのは大切です。

Page2とPage3の設定も直します。

これで直ったはずです。

Push Changeを押して

間違いを直します。

もう一回Testします。

NEXTを押しました。

今度はPage2に移動しました。

他のButtonもTestしましたが全部、望んだ動きをしていました。

以上です。

7.2 Deviceの機能を勉強する

今週の勉強である重大な事に気が付きました。

UEFNのFortniteにあるDeviceが

色んな機能を持っていてそれぞれを組み合わせてProgrammingめいた事を実装する事が可能なんです。

というかProgrammingが書けない人達がGameを作成するにはそれしか方法が無いです。

という事はこれらのDeviceの機能を全部勉強してしまえば他のUEFNのCreatorに圧倒的な差をつける事が出来るようになります。

まず今まで勉強したDeviceを以下に整理します。

2023-04-10のBlog

Player Spawnerが登場しています。

Player SpawnerはしっかりDeviceの中にありました。

2023-05-15のBlog

Item Granterについて説明していました。

更に以下の方法で武器を実装出来る事も解説されていました。

Item GranterもDeviceにありました。

Buttonもここで出て来ました。

流石にこのDeviceの機能はもう理解しています。

更にEnd Game Deviceと言う名前のDeviceも出て来ました。

これもDeviceにありました。

Guard Spawnerも出て来ました。

敵をSpawnするDeviceです。

しかもここで以下の文章が書かれていました。

やっぱりCreative1.0ではProgrammingを知らない人達がDeviceを組み合わせてGameを作成していたんですね。

2023-07-16のBlog

ここでItem GranterやEnd Game Deviceの実装をしていました。

2023-07-23のBlog

Guard Spawnerの実装をしていました。

2023-08-14のBlog

Prop Moverを勉強していました。

こんなDeviceもありましたわ。

2023-08-21のBlog

Prop Moverを実際に使用しています。

2023-08-28のBlog

ここで初めてVerseを使用しています。

VerseのFileはLevel上では以下のDeviceで表示されます。

これも一応Deviceなのでここに記しておきます。

2023-10-22のBlog

UFO Spawnerを使用していました。

これですね。

2023-10-29のBlog

UFO Spawnerを実際に使用しています。

こんなのが展開されていました。

2023-11-05のBlog

Tutorialの勉強をしていますが、そこでCinematic Sequenceが使用されていました。

ここではAssetと書いていますが、Deviceですね。

これですね。

2023-11-12のBlog

Cinematic Sequenceの使用方法について簡単にまとめていました。

2023-12-03のBlog

Sports Car Spawnerの使用方法について勉強していました。

これですね。

更にExplosive Deviceの使用方法についても勉強していました。

2023-12-10のBlog

Sports Car Spawner とExplosive Deviceを実際に使用していました。

以上でした。

<今まで使用したDeviceのまとめ>

以下のDeviceを今まで使用していました。

  • Player Spawner
  • Item Granter
  • End Game Device
  • Guard Spawner
  • Prop Mover
  • UFO Spawner
  • Cinematic Sequence
  • Sports Car Spawner
  • Explosive Device

たった9個のDeviceしかまだ使用していませんでした。

うーん。

これもまたコツコツ勉強するしかありません。

17x11+7 = 194個のDeviceがありました。

更にEarly Accessの中には以下の3つのDeviceもありました。

となると197個のDeviceが存在している事になります。

これの使用方法もぼちぼち覚える必要があるという事ですね。

7.3 Deviceについて更に調査する

まず公式SiteのDevices [12]を見つけました。

軽く読みます。

はい。

Using Devices [13]をみます。

こういう画面があるんですね。

うーん。

どこからこの画面に移動出来るんでしょうか?

すぐ下にこの画面への行き方が説明されていました。

まず以下の編集Modeに行きます。

Tab Keyを押します。

おお、この画面ですね。

Deviceは仕掛けと訳されていますね。

これは普通に装置の方がしっくりくる気がしますね。

Player Spawnerを選択してみます。

右下にPlayer Spawnerの機能が説明されていました。

これだけしか説明されてないのか。

左端にある以下の分類が興味深いです。

開始時の仕掛けを選択したら以下のDeviceが表示されました。

武器の分類に近接が

がありました。

以下の武器がありました。

剣とかあります。

このUIは非常に見やすいですが、UEFNを使用出来るならこっちは触らなくても問題ない気もします。

今週はこれくらいにしておきます。

これらのSiteはこれから少しずつ勉強する事にします。

8. DirectX12の勉強

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

8.1.1 先週の復習

何をやったのか全く覚えていません。先週のBlogを読み直します。

思い出しました。

先週、Visual StudioのSettingで

というIconがある事が判明しました。

これを押すとTutorialと同じやり方をするだけでTutorialの表示と同じFolderの構成を作成出来そうだという事が判明したんです。

それで

となったんでした。

今週は量が多いですが、これを一気にやってしまいましょう。

8.1.2 Lötwig Fusel氏のD3D12 Beginners Tutorialをやり直す

 Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [14]を実装する>

Blogを見直すと2023-10-29から勉強をしています。この辺を参考にして作り直す事にします。

まずProjectを作成します。Empty Projectを選択します。

この辺は2023-11-05のBlogのやり方と全く同じです。

それで問題ないはずです。

次の設定です。

名前はMyD3D12Ez_2としました。

Solutionが作成されました。

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

げ。

ここまで作成したら2023-11-05のBlogではConsoleのTemplateで作り直していました。

うーん。

流石にここからProjectを作り直すのは面倒です。

Sample Codeを見ると以下のようなFileの設定になっています。

ので以下のようにMain.cppを追加して

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

これを実行すると

となりました。

このProjectで続きを作成しても大丈夫でしょう。

このまま続けます。

Project Settingを変更します。

PlatformをX64に変更します。

うーん。

最初からx64になっていました。

Output Directoryの設定を以下のように変更します。

これで合ってるはずです。

$(SolutionDir)build\$(PlatformShortName)-$(Configuration)\bin\

これをそのままPasteしました。

Editで確認すると

以下のAddressにOutputを作成します。

2023-11-05のBlogではhyphenの意味が分からないと調べていました。

はい。

結果が面白いので、ここにもう一回載せておきます。

Intermediate Directoryの設定を変更します。

以下のAddressをそのままCopyして

$(SolutionDir)build\$(PlatformShortName)-$(Configuration)\obj\$(ProjectName)\

Pasteしました。

Editorで実際のAddressを確認します。

あってそうです。

次にC++ Language Standardの設定を変更します。

しました。

ここで2023-11-05のBlogでは一端、TestしてFolderが指定した場所に作成されるのかどうかを確認しています。

同じようにTestします。

実装しました。

特に問題なく実行出来ました。それでは作成されたFolderを確認します。

まずOutputです。

以下のFolder内に作成されているはずです。

確認します。

がありました。

出来ていました。

Intermediateの方も確認します。

となっています。

に以下のFileが形成されていました。

はい。

出来ています。

この時点でSample CodeのFolderと比較してみます。

Sample CodeのFolderです。

私のProjectのFolderです。

Sample CodeにあるGithub関連のFolderやFileを消すと以下のようになります。

まず.vsは同じです。

Buildも同じです。

MyD3D12Ez_2とsrcはほぼ同じ内容でした。

私のProjectではx64というFolderがあります。

X64の中は以下のようになっていました。

これはOutput内のFileと同じです。

要らないので消します。

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

Sample Codeと比較すると

となります。

これを見るとMyD3D12Ez_2がsrcと同じという事になります。

中身を見てみます。

私のProjectです。

Sample Codeの中身です。

ここにあるFolderは後で追加するものなので今は消しておきます。

X64と言う名前のFolderは何を示しているんでしょうか?

中身を見てみます。

これは以下に示したIntermediateのFolderの中身と全く同じです。

Defaultの設定の時に実行したので、その時に作成されたFolderでしょう。

消します。

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

私のProjectです。

Sample Codeです。

違いはFilters fileの存在だけになりました。

Sample Codeの方にはFilters fileは作成されていませんでした。

これについて少しだけ調べます。

BingのCopilotで聞きました。

XML Fileだそうです。

と言うとTextで開けるの?

開けました。

ああ、これか。

分かりました。

こっちのFilter Viewの管理をしているようです。

成程、Sample CodeはFilter Viewは使用してないので.filterは生成されてないみたいです。

Sample CodeのFilter Viewを見たら以下のようになっていました。

全く整理されていません。

以下の方法でFilter fileを消せると言っています。

これはVisual Studio 2019: use folder structure as filter [15]の解説をまとめていたんですが全く違う話でした。

このFilter fileは後々必要になるかもしれませんので残しておきます。

最後にSample Codeでは

以下に示した

Vcxproj fileやvcxproj.user file、そしてmain.cppがsrc folderに保存されいます。

私のProjectではProject名 Folder内に保存されています。

これの直し方を調べます。

わかりませんでした。

これもこのままで良いです。

Linkingの設定に行きます。

Sample Codeの設定をそのままCopyしました。

2023-11-05のBlogでは以下のようなCommentがありました。

これってDebug Layerと関係あるなんかじゃなかったでしたっけ?

<追記>

これは私の勘違いでした。私が思っていたのはDXGIの事でした。

<>

こんな回答しか得られませんでした。

Debug Layerと関係ありますか?と質問したら以下の回答でした。

あんまり関係なさそうですね。

VC++ DirectoriesのInclude Directoriesの値を変更します。

ここで$(ProjectDir)の値が

私のProjectでは

になっていますが、

Sample Codeでは

になっていました。

こっちはsrcを指定しています。

ここは無視します。

うん。

これで環境設定は完成とします。

一寸まだ不明な点はありましたが、このTutorialをやる分には問題ないでしょう。

次をやります。

Windows.hを追加しました。

ここから2023-11-05のBlogは壮大に勘違いしてFilter ViewでTutorialと同じFilterを作成使用としています。

ここは一からやり直します。

Support Folderを追加します。

今回はしっかりShow All FilesがCheckされた状態で新しいFolderを作成しました。

そのSupport Folder内にWinInclude.h Fileを作成しました。

WinInclude.hの実装です。

更にDebug Layerを使用するために

D3d12sdklayers.hとdxgidebug.hを追加しました。

これでWinInclude.hの実装は終わりだそうです。

Main.cppに戻ってWinInclude.hをIncludeしました。

今度は何の問題もなく実装出来ました。

うーん。

これは全部の実装を一回で終わらせることは無理でした。

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

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

8.2.1 先週の復習

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

「4.5 はじめてのShader」を勉強しています。

Vertex ShaderとPixel Shaderの作成方法を勉強していますね。

正し具体的な方法はBlogにはまとめていませんでした。

ので教科書を見ながら実装していきます。

8.2.2 「4.5 はじめてのShader」を実装する

<「4.5.1 Vertex Shaderの記述」を実装する>

以下のようにしてVertex Shaderを追加しました。

以下のようなFileが作成されました。

関数名をBasicVSに変更しました。

<「Visual Studioの設定」を実装する>

BasicVSを右Clickして以下のBoxを表示します。

更にHLSL CompilerのGeneralを開いて

Entrypoint NameとShader Modelの値を変更しました。

最後にBuildしてErrorが無い事を確認しました。

<「4.5.2 Pixel Shaderの記述」も実装します>

今度はPixel Shaderを作成します。

Vertex Shaderを作成したのと同様にPixel Shaderを作成しました。

PixelShaderの実装もMain()関数をBasicPS()に変更しました。

更にPixel Shaderの設定も以下のように変更しました。

一応、Buildして確認しましたが問題なかったです。

これでShaderの実装は一応出来ました。

8.2.3 「4.6 Shaderの読み込みと生成」を読む

次の節を勉強します。

<「4.6.1 ID3DBlob型」を読む>

ID3DBlob型について解説しています。

ID3DBlob型はShader Objectを扱うための型だけでなく、他のObjectも扱うそうです。

以下のようにShaderのObjectを生成しています。

<「4.6.2 必要なIncludeとLink指定」を読む>

ShaderをCompileするのに必要なHeaderをIncludeします。

更にLibraryもLinkします。

<「4.6.3 D3DCompileFromFile()関数」を読む>

これが結構長い節です。

Shaderを読み込むための関数は、D3DCompileFromFile()関数だそうです。

この節がなんで長いのか分かりました。

このD3DCompileFromFile()関数のそれぞれのParameterについて解説しています。

この部分は今回はSkipします。

<<Errorが起きた場合>>

Vertex ShaderやPixel ShaderのReturn ValueがS_OK出なかった場合の対処方法について解説していました。

Shaderに書いたCodeにErrorがある場合は、ppErrorMsgを見ると良いそうです。

ppErrorMsgに詳細なErrorの情報が載っているそうです。

ただしppErrorMsgの情報を取り出すためには以下のID3DBlogの関数を使用する必要があるそうです。

  • GetBufferSize()関数
  • GetBufferPointer()関数

ただしこれらの関数はSample Codeでは使用されていませんでした。

うーん。

どうしよう。

一応、教科書には具体的に使用するためのCodeが書かれていました。

次にFile名が間違っている時の例が載っていました。

File名が間違っている場合はHRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)が返って来るそうです。

以上でした。

9. まとめと感想

なし。

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] pinkpocketTV. (2023, December 4). Step-by-Step Unreal Engine 5 tutorial: 3D Gaussian Splatting for Beginners [Video]. YouTube. https://www.youtube.com/watch?v=xdDzChfFY_A

[4] Ben Cloward. (2023, May 4). Using custom HLSL code - Advanced Materials - Episode 24 [Video]. YouTube. https://www.youtube.com/watch?v=qaNPY4alhQs

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

[6] Rick Banks. (2022b, June 20). Houdini 19 - Wall Tool 04 [Video]. YouTube. https://www.youtube.com/watch?v=AwRKrGL7DmQ

[7] sidefx.com. (n.d.). detail expression function. https://www.sidefx.com/docs/houdini/expressions/detail.html

[8] Joshua M Kerr. (2022, September 25). After effects to Unreal Engine 5 (THE EASY WAY) [Video]. YouTube. https://www.youtube.com/watch?v=r7IW5te_3ZI

[9] Joshua M Kerr. (2022, February 13). TRACK THIS! - Camera tracking from blender to Unreal engine [Video]. YouTube. https://www.youtube.com/watch?v=Ta0am2wC-SI

[10] Pi Equals Three. (2023, April 21). Make a book / UI text in Fortnite - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=9GPYbD6fnh8

[11] Gamefromscratch. (2024, January 9). Unreal Engine 6 = UE5 + Verse [Video]. YouTube. https://www.youtube.com/watch?v=y87M5ySVGJs

[12] Devices. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/devices-in-unreal-editor-for-fortnite

[13] Using devices. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/fortnite-creative/using-devices-in-fortnite-creative

[14] Lötwig Fusel. (2023, May 1). Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=rF30qoUFDq8

[15] Visual Studio 2019: use folder structure as filter - Microsoft Q&A. (n.d.). https://learn.microsoft.com/en-us/answers/questions/139429/visual-studio-2019-use-folder-structure-as-filter

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

今年の予定

2週間かけて去年の勉強内容をまとめました。その結果、今年は少なくとも今年の前半は去年の後半に決めた内容をそのまま継続する事にしました。

まだ半年しかやってないので結果を判断するにはまだ早いと結論づけました。

後、半年ほど同じ内容をやってから次のStepを考える事にします。

1.今週の予定

そう言う訳で去年と同じ内容をやっていきます。

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

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

建物の作成の続きをやります。

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 Lightの配置の続きをやる

こんな所に一個Square Lightが配置されていました。

消します。

他のWindowや天井にもLightを追加しておきます。

車庫の窓にLightを追加しました。

なんかLightに×がついています。

調べたら以下の警告が出ていました。

どうやらLightの光が重なっている箇所があるとこの警告が表示されるみたいです。

公式のForumであるFailed to allocate shadowmap channel for stationary light due to overlap [2]には以下のように解説していました。

別にStationaryである必要はありません。

Movableに変更しました。

直りました。

二階にもLightを配置していきます。

警告が表示されるのでLightのMobilityはMovableに変更します。

仕事部屋です。

寝室です。

別の寝室です。

子供部屋です。

2回のBathroomにもLightを追加しました。

これで全部の部屋にLightを配置しました。

一応、建物の作成は完成しました。

2.2 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [3]の勉強に戻ります

2023-10-22のBlogで2つ目のCameraの設定を勉強していますが、この実装はまだしていません。

TutorialのCamera Setupの2:38:00のあたりの内容になります。

一つ目のCameraをDuplicateして2つ目のCameraを作成しました。

以下の位置に配置しました。

Cameraから見た映像です。

ピントが建物に合ってないです。

直します。

Manual Focus Distanceを使用して

Focusする距離を建物に合わせました。

結果です。

建物が浮いていますね。

何と、建物の下に土台をおいていたら、Cameraを別な場所に移動させてしまいました。

しかも3D酔いまでして来てしまいました。

今週はここまでにして残りは来週やります。

2.3 UE5でも無料で3D Gaussianが使用出来るみたい

休みの間、いろんなYouTubeを見てたんですがStep-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [4]に、無料でUE5内で3D Gaussianを実装する方法が説明されていた気がします。

これ一寸、確認します。

動画の最初に以下のSiteが紹介されていました。

Freeって書いてありますね。

実際のSiteも確認してみます。

Radiance Fields [5]です。

Freeとしっかり書いてありました。

正しApache 2.0 Licenseと書かれていました。

このLicenseよく知りません。

調べます。

MIT Licenseと比較して以下の点だけが違うと、このSite [6]に書かれていました。

こんだけ分かれば今は十分です。

2.4 Step-by-Step Unreal Engine 5 Tutorial: 3D Gaussian Splatting for Beginners [4]を勉強する

11月30日に公開された出来立てほやほやのPluginみたいですね。

これはなるだけ早く勉強して試してみたいですね。

一寸時間はないですが無理くり勉強してしまいます。

まず先程のSiteからReleaseをClickしてGitHubのPageに飛びます。

そして以下のFileをDownloadします。

解凍したらそのFolderを以下の場所にPasteします。

そしてUE5を開きます。

EmptyのLevelを作成して空だけ生成していました。

これはいつものLevelの作成方法と同じでしょう。

そして先程作成したPluginが使用出来るようにします。

今度はPolycamと言うSiteに行っています。

これどこのSiteなの。と思ったら下のDescriptionにこのSiteのURLが載っていました。

Clickしたら以下のSiteに飛びました。

うーん。

TutorialとはImageが違う。

これってひょっとして3D Gaussian SplattingのDataを買わないといけないの?

とりあえずTutorialだけ先に見る事にします。

TutorialではFreeでDownload出来ると言っていますね。

ここから本番です。

Downloadした3D Gaussian SplattingのDataをUE5にImportします。

以下のButtonを押していました。

これは使用した事ないです。

先程のPluginをEnableすると表示されるんでしょうか?

確認のための自分のUEを開いて見ました。

やっぱりこのButtonはないですね。

Tutorialを見るとこのButtonの機能が表示されている場面が一瞬だけ写っていました。

Load GS ply Modelと書いてあります。

3D Gaussian Splatting専用のIconである事は間違いないです。

先程のPluginをEnableしたら使用出来るようになるんでしょう。

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

CarSplat.plyをImportしました。

以下のFileがImportされました。

TutorialではそれぞれのFileについて簡単に説明していました。

最初のCarSplat1はBlueprintだそうです。

次のPositionはSplatのPositionの値が保持されているそうです。

次のQuat4はSplatのRotationの値、

その次のScaleAはSplatのScaleの値が保持されているそうです。

最後のSH_0はSplatの色の値が保持されているそうです。

Blueprintを開いています。

何これ?

何もしなくても既に出来てるの?

このBPをLevel上に配置すれば良い気がして来ました。

TutorialでもこのBPをLevel上に配置しています。

このTutorialの撮影ではUEはCrashしませんでしたが、前にこのBPを開いたときはUEがCrashしたそうです。

もしUEがCrashした場合は何回かTryすれば開けるようになるみたいです。

近づいて見た結果です。

うーん。

凄い。

これは自分で試してみたい。

今度は以下のParameterをEnableしてLightingの設定をUEから変更しています。

次は別な3D Gaussian SplattingのModelを試していました。

凄すぎ!

最後に3D Gaussian SplattingのCropのやり方を説明するそうです。

Cropって画像を編集する時に端を切って短くする事だと思うですがどうなんでしょう。

Tutorialの続きを見ればCropが何を指すのかは直ぐに分かるので気にしないで先に進みます。

Location Volumeを追加します。

こんな感じです。

この中だけRenderingされるそうです。

だからCropなのか。納得です。

先程のBPを選択してUser ControlのCrop Volumeを選択し、今作成したLocation Volumeをセットします。

そしてCrop TypeにKill Outside Volumeをセットします。

これだけでした。

結果です。

なんかBoxの外側にもRenderingされているように見えます。

目の錯覚でしょうか?

Ultra Dynamic Skyを追加して景色を更にPhoto-Realisticにしています。

空にGrayな影が存在していますね。

Ultra Dynamic Skyは持ってないのでこの部分は試せませんね。

以上でした。

流石に実装する時間までは取れません。

実装は来週やる事にします。

3.Niagara の勉強

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

去年、三章の「Game of Life」まで実装が終わったんでした。

ので今週は次の「木の生成Simulations」を勉強します。

3.1 「14.1 木の生成Simulationsの理論」を読む

軽く読みました。

どのように木を生成するかの理論が説明されていました。

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

木の生成のAlgorithmを簡単にまとめると以下のようになります。

  1. 地面から枝が生え、幹になる
  2. その幹から枝が2つ生え、それぞれが幹になる
  3. 2を何回か繰り返す
  4. 最後に葉が生える

ただしこれを実際に実装するためには、枝(幹)の始点と終点を管理してその間に線を引く必要があります。

点はArrayで管理します。

するとそれぞれの点のIDは以下のようになります。

ここでそれぞれの点からその点の親の点に線が引ければ、枝(幹)の始点と終点の間に線を引いた事になります。

そのためには

それぞれの点の親の点のIDを知る必要があります。

Floor((ID-1)/2)

の計算でそれぞれの親のIDを求める事が出来ます。

<点の位置を決定する>

今度はそれぞれの点の位置の決定方法についてです。

親の進行方向のVectorを取得します。

その方向に前進します。

教科書ではこの点の始点についての解説は無かったですが、当然親の点の位置から開始しているはずです。と言う事は親の点の位置も取得しているはずです。

ある程度前進したらランダムな方向に移動するそうです。

また教科書には移動した後の位置を記録する話が書いてないです。これは絶対記録しているはずです。

これについては実装する時に確認します。

この移動した方向については、親の点から参照出来るようにする必要があるそうです。

以上でした。

3.2 「14.2 Niagaraで線を書く」を読む

前節だけ読んだんでは短すぎるので次の節も読む事にします。

Niagaraを使用して線を書く方法について解説していました。

Sprite Based Line Moduleを使用するそうです。

EmitterのどのSectionで使用するのかが分かりません。

よく読んだらParticle Update Sectionと書いてありました。

この後、Sprite Based Line Moduleの設定方法についての解説がありました。

これは実際に使用する時に詳しく読む事にします。

その後で、このSprite Based Line Moduleは追加しただけではLineは描画されず、更なる設定が必要と書かれていました。

まず前提条件としてParticleの回転を止めるそうです。

やり方については教科書に事細かくまとめられていたのでここで繰り返すのは止めます。

そしてRender SectionにあるSprite Renderer Moduleの設定を変更していました。

MaterialやAlignmentの設定を変更したりしていますが、その理由についての解説は無かったです。

こうやると線が表現出来るみたいなManualがあってそれに従って設定してるだけなのかもしれません。

この後で、やっとSprite Based Line Moduleの設定をSprite Renderer ModuleにPassする方法を解説していました。

以下のParameterにSprite Based Line ModuleにあるParameterをBindさせるそうです。

  • Position Binding ―>Position
  • Sprite Size Binding ―>Sprite Size
  • Sprite Alignment Binding ―> Sprite Alignment

これで原点からそのParticleの位置の線を描く事が出来るようなったそうです。

この後はSprite Based Line Moduleの実装内容についての解説が書かれています。

これは木の生成とは関係ないのでSkipします。

3.3 「14.3 木の生成Simulationの実装」を読む

来週から実装に入りたいので次の節も軽く読む事にします。

EmitterがどのTemplateを使用しているのかが書いてないですね。

この辺はSample Codeを参考にして推測するしかないですね。

GPUを使用しています。

木の生成に何万個のParticleは必要ない気もしますが、どうなんでしょう。500個くらいのParticleを生成するだけならCPUでやった方が楽な気もします。

図14.3.1は間違っていますね。全然別なImageが載っています。

文章の解説だけで何を行っているのかは理解出来るので問題ないです。

Spawn Burst Instantaneous Moduleの設定について解説しています。

やっぱり700個しかParticleを生成していません。

Emitter State Moduleの設定も変更しています。

CGHOW氏のTutorialでParticleは一回生成するのみで永遠に存在する場合と同じ設定にしていました。

CGHOW氏はもうYouTube上にNiagaraのTutorialを公開しなくなってしまったので残念です。

まああのLevelのTutorialを理解出来る人ってほとんどいないでしょうから、そんなに再生回数も稼げないでしょう。

仕方ないです。

で、このSimulationの勉強が終わったらNiagaraの勉強は一端終わりにします。

そしてDeep Learningの勉強をこの時間にする事にします。

Jeremy Howard氏の以下のTutorialを勉強する事にします。

なんかGame産業自体が今後10年の間に崩壊しそうなので、一応AIの勉強もしておこうと思っています。

Unityの時のような事件がUEに絶対起きないとは限りません。

保険をかけておくのは大切です。

話がそれました。

教科書の勉強に戻ります。

以下のVariableを作成しています。

  • Position型のEnd Position
  • Int32型のDepth
  • Vector型のForward

End Positionは終わりのPointの情報を保持するための変数だそうです。DepthはそのPointが幹から数えて何回枝分かれしたのかを示すための変数だそうです。これを使用して葉を生成するか更に枝分かれするかを決定するそうです。

ForwardはそのPointが伸びる方向を表しているそうです。

更にEmitterのName Spaceである変数も作成します。(今まで作成した変数のName Spaceは全部Particleでした。)

  • Attribute型のAttribute Reader

これ一個だけでした。

教科書にはこのAttribute ReaderをEmitter Spawn Sectionにセットして更にいろいろな設定も変更していました。

この辺は実装する時に勉強します。

次に新しいGPU Simulation Stage(Section)を作成しています。

この教科書では一貫してSectionの事をStageと呼んでいます。

Stageの方が時間の流れを認識出来るのでSectionよりも良い名称のような気もします。

もしかしたら私もこれからはSectionからStageに変更するかもしれません。

Sloveと名付けていました。

Slove Sectionが生成されたら、早速Scratch Pad Moduleを作成して新しいModuleを追加していました。

この新しく追加されたScratch Pad Moduleの名称もSolveになっていました。これはかなり紛らわしいです。

この後はこのSolveと言う名前のScratch Pad Moduleの実装方法の説明が延々と続いています。

一応、軽く全部読む事にします。

Custom HLSL内の実装はどうなっているのか不明ですがそれ以外は特に難しい部分はなさそうです。

教科書ではこの後、Custom HLSLの実装方法について解説していました。

かなり長くなるので今週はここまでとします。

来週はここまで実装して、再来週は残りを勉強し、その次の週に最後まで実装する事にします。

4.Materialの勉強

今年もBen Cloward先生のTutorialを勉強していきます。

こんなにたくさんのTutorialが追加されていました。

Ben Cloward先生は個人的な事情で今年は半分位、休んでいましたが復活したらこの勢いです。

英語圏の勉学に対する熱意はとんでもない部分があります。

4.1 Using Custom HLSL Code - Advanced Materials - Episode 24 [7]を勉強します

今回はCustom HLSLの使用方法の解説のようです。

以下の機能について解説するみたいです。

Customノードは以下のように実装されています。

Customノードの設定を以下のようにしました。

結果です。

流石にこの辺の理屈は知っています。

知ってますが、復習には丁度いいです。

DescriptionとInputsの使い方の説明をしています。

これも知っているのでSkipします。

<Lerp(A, B, T)>

今度はLerp()関数の使用方法についての解説です。

Customノードの設定です。

Inputする方のTypeの設定はしなくて良かったんでしたっけ。

あんまり覚えていません。

こんな風に実装していました。

結果です。

<Texture2DSample(Tex, TexSampler, UV)>

今度はTexture2DSample()関数です。

Inputです。

TexSamplerは?

なんかTexSamplerは要らないみたいです。

以下のように実装して

以下のような結果が出ています。

Texture2DSample()関数はHLSLの関数だと思うんですが検索しても出て来ません。

無いみたいです。

<For Loop>

今度はFor Loopを作成します。

以下のように実装しています。

ここでは初めてHLSLを書く人に対してかなり丁寧な解説をしていますが、私には必要ない内容なのでSkipします。

次に以下のCodeを実装しています。

ぱっと見は複雑ですが、中身の構造は先程のLoopと同じです。

これも軽く見て終わりにします。

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

結果です。

水玉を拡大します。

RとDistの値を変更します。

結果です。

うん。

何が変わったの?

水玉の端が少しだけBlurryになったと言っています。

うーん。

あんまり変わってない気がします。

どうなんでしょう?

今度は値を以下のように変化させました。

結果です。

はは、

なんか変な形になりました。

まあ変化する事は確認出来ました。

以下の部分のCodeを見たら何をしてるのか判明しました。

ようなTextureの値を採取する場所を少しだけ左右上下にずらしているんです。

だから水玉模様が四角くなったんです。

Tutorialではこの後にこの実装部分の内容を非常に詳しく解説していました。

もう理解してしまったのでここにはまとめません。

これで終わりかと思ったら次に丸くBlurryにするためのCodeを紹介していました。

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

結果です。

こっちは水玉の境界がかなり均一にBlurryしています。

TutorialではこのCodeについてもかなり詳しい解説をしていました。

これは実装する時にもう一回検証する事にします。

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

来週実装します。

5.Gaeaの勉強

7番目のTutorialを作成しました。

Erosion GroupにあるNodeの内、Geology的な関連があるAlluvium、Deposits、Sediment、そしてStratifyについてPower Pointでまとめました。

以下にまとめたPower PointのSlideについて簡単に説明します。

<Geology的な解説>

Alluvium、Deposits、Sediment、そしてStratifyのGeology的な解説をまとめています。

DepositsはErosionで削られた土が川底などに貯まる現象を指します。

それに対してSedimentはその川底などに貯まった土そのものを指すそうです。

こういう解説がしてありましたが、実際の単語の運用はほぼ同じ意味で使用されている場合がほとんどでした。

きっちり意味を分けて使用している場合はほとんどなかったです。

Depositsの中で水によって削られた場合を指す言葉だそうです。

ただし、Depositsが水の中にある場合はこの名称は使用出来ないそうです。

上記の図にあるような河口に土が溜まっている状態か、以下のSlideにある

川の周りに土砂が堆積して川が蛇行している場合の川の周りの土を指します。

因みに、この川の周りの土砂は肥沃で農業に非常に適していて、最古の文明は全部川の周りで発生してるのはそのせいだそうです。

Stratifyは地層の事です。

堆積した土砂が層を形成してこういう形状になるそうです。

<Gaeaによる機能>

今度はGaeaにおけるこれら4つのNodeの機能について調査した結果をまとめます。

Depositsノードについてです。

何とDepositsノードの機能はAlluviumノードのDepositsモードとほとんど同じだそうです。

違いは

  • 高速
  • 細かいディテールは犠牲
  • より大きな土壌を作成

な点だけだそうです。

Alluviumノードについてです。

  • 地形全体にDepositを作成
  • 割れ目を埋める
  • 大きな地形を覆うような大きなDepositを作成

Geology的はAlluviumな機能は全く無いですね。

AlluviumのDeposit ModeとDepositsノードはどんな風に違うんでしょうか?

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

Sedimentノードです。

なんと砂や雪を追加する時に使用するそうです。

Geologyの解説とは全然関係ない機能ですね。

これも実装してどんな感じが確認します。

地層を追加します。

公式のDocumentではいかのような解説がされていましたが、

  • 地形上に壊れた地層や岩層を作成
  • _は2つの壊れたプレートの間などの限られた局所的なゾーンに作成
  • 各層は他の層から独立して存在
  • 強固でリアルな地層を作成

Gaeaの結果を見ないとよく分からないですね。

これも実装して試すしかないです。

<Gaeaにおける実装の結果>

一応、Gaeaで試してみました。

正しこの部分は録画はしてないので、来週の撮影では変更するかもしれません。

まず以下のようにNodeを組みました。

この時点でも結果です。

ここに今回の4つのNodeを追加します。

<Alluvium>

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

GeologyにおけるAlluviumは川の周りしかDepositsが起きませんが、GaeaではTerrain全体にDepositsが起きています。

ModeをDepositsに変更してみます。

あんまり変化ない気がします。

もっと接近して確認します。

ModeをDefault値であるResidualの場合です。

Depositsの場合です。

うーん。

Depositの時の方が、Depositに厚みがありますね。

でもそんなに違いがあるとは思えませんね。

<Deposits>

Depositsノードを使用しました。

結果です。

何、これ?

出来損ないの3D Printのように

凸凹が追加されてしまっています。

Seedの値を変えてみましたがこの凸凹は無くなりませんでした。

Sedimentsの値を下げると

凸凹が消えました。

うーん。

計算はAlluviumノードと比較すると楽なのかもしれませんが、結果もその分雑です。

<Sediment>

Default値の結果です。

これもDepositsノード程ではないですが、四角四角しています。

Mountainノードのせいかもしれないですね。

MountainノードのSeedの値を変更してみます。

四角四角は無くなりましたね。

<Stratify>

これが

こうなりました。

近づいて見ると確かに地層っぽく見えます。

ただこれはErosionではないですね。

この後にErosion関連のNodeを追加する必要がありますね。

Stratifyノードの後にErosionノードを追加しました。

結果です。

近づいてみます。

うーん。

これはStratifyが残っている感じはありますね。

Stratifyノードが無い場合を見てみます。

Stratifyは無くなりましたね。

やっぱり微妙に効いていますね。

StratifyノードとLook Dev GroupのStackノードとの違いも確認します。

Stackノードの場合です。

うーん。

地層がTerrainで統一されていますね。

これにErosionノードを追加してみました。

StackノードをBypassした場合です。

あんまり変化ないですね。

ErosionノードのParameterを変更してErosionを弱くしてみました。

これならStackが確認出来ますね。

うーん。

まあ動画を作成するは来週なので、この辺は来週も検討する事にします。

6.Houdiniの勉強

去年の最後のHoudiniの勉強は2023-12-10のBlogHoudini 19 - Wall Tool 04 [8]の勉強をしていました。

ので今週はHoudini 19 - Wall Tool 04 [8]の実装をします。

6.1 Houdini 19 - Wall Tool 04 [8]の実装をする

久しぶりにHoudiniを開きましたが、普通に開けました。

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

<Intro>

このTutorialでは、リアル感を出すためにこのPointの位置を少しだけRandomにばらつかせるそうです。

特にやる事はないので次に行きます。

<Attribute Wrangle>

Attribwrangle_fixHalfBrickにAttribwrangle2を追加し名前をAttriwrangle_ShuffleBricksに変更しました。

<Random Shuffle>

Lineの上のPointsをShaffleするそうです。

まず以下の変数を作成し

値を計算しました。

これはどれくらいPointの位置を移動させるかをRandomに決定しているだけですね。

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

両端のPointは移動しないそうです。

ので上記の実装でそのPointが両端かどうかを査定しています。

ここでCh(“multi”)のParameterを作成します。

以下のButtonを押します。

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

あれ、新しいParameterは出来ていませんね。

VEXpressionの上に作成されていました。

Multiの値を変更してみます。

Multi=0の場合です。

Multi=1に変更しました。

おお、両端以外のPointの位置が移動しました。

結構バラバラになっていますね。

<Brick Geometry>

ここからBrickのGeometryを作成します。

まずLineをPoint間で切るそうです。

そのためにConvertlineノードを追加しました。

結果です。

Point間に新しくLineが誕生しています。

今度はFor-Each Primitiveを追加します。

これも始めて使用します。

Foreach_begin1ノードにDisplay Flagをつけます。

結果です。

Tutorialと同じ結果になっていますね。

<Brick Depth>

まずLineを追加します。

しました。

LineのParameterの値を以下のように変更しました。

Lengthの値を以下のように変更しました。

Lineノードの名前を変更しました。

更にNodeの色を黄色くしました。

Line_BrickDepthノードとForeach_Begin1ノードをCopytoPointノードに繋げました。

結果です。

うーん。

Copy to Pointノードは前に使用したのは覚えていましたが、すっかりその機能は忘れてしまっていました。

今度はSkinノードを追加しています。

結果です。

おお、Skinは追加されましたが、向きはこれで合っているんでしょうか?

うーん。

分からないので先をやります。

Polyextrudeノードを使用してこのSkinをExtrudeします。

Poly Extrudeノードを追加しました。

以下のように書いてありましたが、

Distanceを選択してAlt +Eを押してもBoxは現れません。

Tutorialで確認します。

選択しているのはDistanceの値が表示されているBoxの方でした。

このBoxを選択してAlt+Eを押しました。

今度は以下のBoxが表示されました。

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

ここで2023-12-10のBlogには以下の記載がありました。

これは単にNodeの中のAttributeから参照しているからだと思います。

このNodeから出るのに../を使用しているだと思います。

Applyを押しました。

結果です。

うーん。

下向きに伸びていますね。

これあってるの?

Tutorialで確認します。

全く同じでした。

Polyextrudeの値をForeach_Endに繋ぎました。

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

Wを押してWire Frameに変更しました。

Brickが地面を貫いています。

これを直します。

Poly ExtrudeノードのDistanceに-を追加しました。

結果です。

直りました。

2023-12-10のBlogに以下のように書かれていました。

うーん。

これは分からん。

一寸考えてみますか。

分かりました。

以下の方向にExtrudeしていたのが

逆の方向にExtrudeしたんです。

それだけでした。

底は穴が開いています。

Output BackをEnableします。

結果です。

直りました。

Brickの色がBlueなのはFaceが逆になっているからだそうです。

それを直すためにReverseノードを追加します。

結果です。

ここでそれぞれのParameterが正常に働いているかをCheckします。

Line_BrickDepthノードのLengthの値を変更しました。

結果です。

おお。

結構、感動しました。

更にResample_BrickSpacingノードの

Lengthの値を変化させました。

結果です。

Brickの横幅が変更しました。

ShuffleBricksノードのMultiの値を変更して

それぞれのBrickの大きさのばらつき具合を調整しました。

ばらつきを0にした場合です。

更にAttribwrangle_ShuffleBricksノードを黄色くしました。

ParameterがあるNodeは黄色くするそうです。

BrickRowノードのSegmentの値を変更してBrickの高さを調整します。

Segmentの数を増やすと以下のようになりました。

全体の高さは同じですが、Brick一個の高さが小さくなり、Brickの数が増えました。

うーん。

出来ていますね。

これでTutorialは終わりでした。

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

7.UEFNの勉強

今週はPi Equals Three氏のMake a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [9]を勉強します。

7.1 Make a Book / UI Text In Fortnite - UEFN / Creative 2.0 Tutorial [9]を勉強する

<Intro>

本を作るって何を作成するのかと思ったら

以下のようなUIを作成して

NEXT Buttonを押すと

次のPageの内容が表示され

Previous Buttonを押すと前のPageの内容が表示されるUIを作成するそうです。

これPageをめくるEffectを追加したいですよね。

<Setting up Pop-Up-Dialog Device>

Pop-Up-Dialog DeviceをLevel上に配置します。

こんな感じです。

名前をPage1に変更しました。

設定も変更します。

Response Typeを3 Buttonsに変更します。

Default Back ButtonはButton2に変更しました。

以下の設定も変更しました。

Duplicateして3つに増やしました。

表示するTextを追加します。

3つ全部にTextを追加してました。

<Setting up Page Functionality>

ButtonをLevel上に追加します。

Open Book Btnと名前を変更してました。

いや、これここまで勉強してあれなんだけど、Verse使わないの?

あれ?

これ勉強する価値ある?

別の予定とかは考えてないので、今週は仕方ないのでこれをやる事にします。

Page1を選択して以下の箇所に先程設置したButtonをセットします。

今度はPage2を追加しました。

次はPage2の設定です。

次はPage3の設定です。

これで完成みたいです。

<Final Result>

テストしています。

Gameを起動させてButtonを押すと以下のUIが表示されました。

あ、これはVerseを使用しなくてもUIを作成できるAssetなのか。

そう考えると便利なAssetではあります。

Nextを押したら以下のUIが表示されました。

Nextを押したら以下のPageが表示されました。

うーん。

成程。

こういうAssetの使用方法についての勉強もする必要はありますね。

まあのんびりやっていきます。

実装は来週やります。

8.DirectX12の勉強

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

8.1.1 2023-12-10のBlogで何を勉強したのかを復習する

もうどこまで勉強したのか全く覚えていません。

Blogを読み直してしっかり復習します。

二番目のTutorialであるDebug Layer | D3D12 Beginners Tutorial [D3D12Ez] [10]を初めて勉強していました。

まずFolderを作成していますが、これって

どっちのExplorer Viewで作成しているんでしょうか?

自分のProjectで確認してみます。

Solution Viewです。

こっちで作っていますね。

となるとFolderではなくFilterを作成しているとなりますね。

うーん。

この作り方だと参照で呼べなかった気がします。

Folder Viewで作成してその後でSolution Viewに戻りそこでDebugと言う名前のFilterを作成してそこに追加しないと出来なかった気がします。

これは実装する時に要確認します。

次にComPointerを使用して変数を作成しています。

で、この方法で変数を作成出来るのは前に追加したComPointer.hのお陰なのかどうかが分かりません。

その辺を勉強すると書いていました。

これも今週やりましょう。

次はDebug Layerを実装しています。

TutorialではここでDirectX12以前のDebug Layer2とDirectX12のDebug Layerの違いについて解説していました。

しかしその部分はBlogにはまとめていませんでした。

これはまとめることにします。

その後はずっと実装方法について解説していました。

ReportLiveObjects()関数についての説明です。

この関数についてもTutorialでは詳しい解説をしていたみたいです。

これもまとめておく事にします。

OutputDebugStringW()関数についてです。

この関数のTipについてもBlogに書き起こしておきましょう。

以上でした。

8.1.2 Debug Layer | D3D12 Beginners Tutorial [D3D12Ez] [10]を実装する

<Debugと言う名前のFilterを追加する>

まずはこれからやっていきます。

でSample Codeではどうなっているのかを確認します。

Sample CodeのSolution viewです。

これはTutorialの説明と同じです。

Folder Viewに変更します。

はい。

Src Folder内にDebug Folderがあり、その中にDebugLayer fileが保存されています。

Solution ViewからDebugと言う名前のFilterを作成してその中にDebugLayerと言う名前のFileを作成してもこうならないはずです。

ただしTutorialではこれしかやってないんです。

おそらくですがProjectの設定のどこかでこれを自動でやってくれるような設定が出来る箇所があってTutorialではそれを録画してないところでやっているんだと思われます。

これと同じ設定にするには、

  1. Folder ViewでDebugと言う名前のFolderを作成する
  2. このFolder内にDebugLayerと言う名前のFileを作成する
  3. Solution Viewに戻りDebugと言う名前のFilterを作成する
  4. このDebugと言う名前のFilterに先程作成したDebugLayerのFileを紐づけする

というStepを取る必要があります。

一応、Tutorialではどうやっているかを確認します。

Solution Viewを開いています。

Solutionを右Clickして以下のBoxを開きました。

Addを選択して、New Folderを選択していました。

あれ?

Solution ViewからBoxを開いてAddを選択した場合、以下のBoxが表示されるはずです。

この場合はNew Filterとなるはずです。

New Folderと表示されるのは以下に示した様にFolder Viewの場合です。

でもこの表示とも一寸違いますね。

何とSample CodeのSolution Viewから以下のBoxを開いてみたら

New Folderになっていました。

うーん。

何にこれ?

この環境の設定方法が分りませんね。

Tutorialで確認したら一番最初にFolderを作成した時点で

以下のようなBoxを表示するようになっていました。

うーん。

分かりました。

TutorialとSample Codeでは以下のIconをEnableしていました。

Show All Filesというやつです。

これをEnableすると

Solution Viewの表示が以下のようになって

Addを選択した時に表示されるBoxも以下のように

Tutorialと同じになります。

うーん。

これは最初から作り直します。

今週はここまでにしますが、来週もう一回最初のTutorialに戻って実装をやり直します。

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

8.2.1 先週の復習

前にやった内容は全然分かりません。

のでまず2023-12-10のBlogで何を勉強したのかを復習します。

「4.4 Vertex情報のCopy(Map)」を読んでいますね。

まずその中の「4.4.1 ID3D12Resource::Map()Method」を読んでいました。

ここでは前の節で作成したVertex BufferがCPU側にあるのかGPU側にあるのかを議論していました。

そうだ。

今度はMap()関数を作成するでした。

これは実装も済んでいるでしょうか?

Blogを読んだ感じでは実装も終わってそうな書き方になっています。

確認します。

していませんでした。

今週はMap()関数の実装をします。

2023-12-10のBlogでは更に次の節である「4.4.2 Vertex Buffer Viewの作成」も勉強していました。

この節ではVertex Buffer Viewを作成しているだけで、その作成したVertex Buffer Viewをどうこうはしていませんでした。

このVertex Buffer Viewも実装はしていませんでした。

最後まで読んだら

と書かれていました。

8.2.2 「4.4 Vertex情報のCopy(Map)」の実装をする

それでは2023-12-10のBlogで勉強した内容を実装していきます。

まず「4.4.1 ID3D12Resource::Map()Method」の実装からやっていきます。

Mapの実装を行いました。

更にこのAddressにCPU側にあるVertexの情報をPassするために

を追加しました。

最後にMapを解放するために

を追加しました。

次に「4.4.2 Vertex Buffer Viewの作成」の実装をやります。

出来ました。

8.2.3 「4.5 はじめてのShader」を勉強する

やっとShaderについて勉強します。

そもそもDirectX12の勉強を始めた理由の一つがHLSLをしっかり勉強したいと言うものでした。

UE5のCustomノードに書くHLSLはHLSLの一部でしかないです。

これだけ勉強したのではMaterialをHLSL化したCodeを普通に読めるようにはなりません。

ここに来るまでに一年掛かってしまいましたが、兎に角到達はしました。

<「4.5.1 Vertex Shaderの記述」を読む>

Visual StudioにおけるVertex Shader Fileの作成方法が説明されていました。

作成されたVertex Shaderには以下のようなCodeが書かれているそうです。

これの関数名をBasicVSに変更するそうです。

CPUのVertexのDataはFloat 3で管理していたのにGPUに来たら突然Float 4になっている事について解説していました。

そんなの全然気が付きませんでした。

更に俗にSemanticと呼ばれるPOSITIONやSV_POSITIONについての解説も書かれていました。

SV_POSITIONで記された値は座標を表して、Pixel Shaderにその値が送られるようになるそうです。

うーん。

この辺もっと詳しい解説が欲しいです。

<<「Visual Studioの設定」を読む>>

Vertex Shaderを右ClickしてProject Settingを開いています。

そしてEntry Point名やShader Modelの設定を変更しています。

<「4.5.2 Pixel Shaderの記述」>

基本的には「4.5.1 Vertex Shaderの記述」でVertex Shaderを作成したのと全く同じ事をしてPixel Shaderを作成しています。

関数の名前はBasicPS()でした。

以下のような実装が書かれていました。

ここのSemanticに書かれているSV_TARGETの意味が解説されていました。

これはこの関数のReturn ValueはTarget Reviewで使用します。と言う意味だそうです。

このFileもProject Settingの設定を変更する必要があるそうです。

変更方法はVertex Shaderの時と同じだそうです。

以上でした。

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

9.まとめと感想

無しです。

10.参照

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

[2] Failed to allocate shadowmap channel for stationary light due to overlap. (2014, March 23). Epic Developer Community Forums. https://forums.unrealengine.com/t/failed-to-allocate-shadowmap-channel-for-stationary-light-due-to-overlap/278041

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

[4] pinkpocketTV. (2023, December 4). Step-by-Step Unreal Engine 5 tutorial: 3D Gaussian Splatting for Beginners [Video]. YouTube. https://www.youtube.com/watch?v=xdDzChfFY_A

[5] Rubloff, M. (2023, November 30). Free Unreal Engine 5 Gaussian Splatting Plugin | Radiance Fields. Radiance Fields. https://radiancefields.com/free-unreal-engine-5-gaussian-splatting-plugin/

[6] FOSSA Editorial Team. (2022, October 26). Open Source Licenses 101: Apache License 2.0 - FOSSA. Dependency Heaven. https://fossa.com/blog/open-source-licenses-101-apache-license-2-0/#:~:text=License%202.0%20vs.-,the%20MIT%20License,but%20must%20include%20modification%20notifications.

[7] Ben Cloward. (2023, May 4). Using custom HLSL code - Advanced Materials - Episode 24 [Video]. YouTube. https://www.youtube.com/watch?v=qaNPY4alhQs

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

[9] Pi Equals Three. (2023, April 21). Make a book / UI text in Fortnite - UEFN / Creative 2.0 tutorial [Video]. YouTube. https://www.youtube.com/watch?v=9GPYbD6fnh8

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

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

1. 今週の予定

1.1 今週の予定

今週と来週は一年間の勉強のまとめを行います。

今週は今年前半部分のまとめを行います。

2.Landscapeの作成

2.1 今年後半の作業内容まとめ

<2023-07-09>

今年前半にやった内容をまとめていました。

読み直したら先週やった内容とほとんど同じでした。

2回同じ事をやってしまった。

<2023-07-16>

この週から動画撮影用のUE5の使用方法を勉強する事にすると宣言していました。

このIdeaは良かったんですが、今年最後になっても終わらなかったです。

Magnet VFXUnreal Engine 5.1Beginner Tutorial - UE5 Starter Course 2023を勉強しています。

以下の部分の作成方法まで勉強しました。

<2023-07-23>

先週、勉強した内容を実際に自分で作成しています。

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

<2023-07-30>

Magnet VFXUnreal Engine 5.1Beginner Tutorial - UE5 Starter Course 2023 の続きを勉強しています。

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

<2023-08-06>

続きを自作しました。

後から見直してみると結構凄いです。

<2023-08-14>

Sketchfabにある3D ModelをUE内で使用する方法を勉強しています。

ほぼ写真と同じですね。

<2023-08-21>

画面が白過ぎるのでそれを直す方法を探しています。

最終的にはPost Process VolumeのColor Gradingの温度を上げて以下のように黄色味を追加しました。

<2023-08-28>

動画撮影用のUEのEnvironmentの光の設定を確認しています。

Auto Exposureの値を変更しました。

後は、Postprocessにある以下の値を調整したりしていました。

うーん。

この時点でも結構勉強していますね。

<2023-09-04>

この週からUnreal Engine 5 for Architecture - 2023 Full Beginner Courseを勉強しています。

以下のような透明な窓ガラスが影を投影しないようにする設定を勉強していました。

<2023-09-11>

この週もUnreal Engine 5 for Architecture - 2023 Full Beginner Courseを勉強していました。

光の設定について色々勉強していました。

GlareとかFlareとかBloomとかです。

Bloom以外はどんな光の条件を指しているのかもう忘れています。

以下の説明がありました。

後、Focal Lengthについての説明がありました。

Focal LengthとZoomの違いについての解説もありました。

Focal Lengthの値を大きくすると人物はOrthogonalなImageに近づき、奥の風景はぼやけるそうです。

以下のような感じです。

Focus Settingsを使用してFlickingを直していました。

<2023-09-18>

先週勉強したAuto ExploreのParameterを自分で作成したProjectで試しています。

他にもTempを変化させたり、Directional LightのIntensityとLight Colorを試したりしています。

後、UE5.3でDisplacementを試しています。

<2023-09-25>

Unreal Engine 5 for Architecture - 2023 Full Beginner Course の続きを勉強するに当たってどうしても家が必要になりました。

しかし家を作成する技術はありませんので以下のAssetで代用する事にしました。

<2023-10-01>

なし

<2023-10-09>

家のAssetを開いたら以下の警告が表示されるようになってしまいました。

これを直すために色々弄っています。

自分のProjectに家を追加しました。

<2023-10-15>

色々やっていましたが最終的には以下のようになりました。

屋根が真っ白ですね。

<2023-10-22>

地面を直しました。

<2023-10-29>

この週から建物の内部もやっぱり作成する必要がある事から、内部の作成を始めます。

<2023-11-05>

建物の内部を作成しています。

<2023-11-12>

建物の内部を作成しています。

<2023-11-19>

建物の内部を作成しています。

<2023-11-26>

建物の内部を作成しています。

ここでやっと内部の配置が終わりました。

内部の配置に一か月かかっていますね。

<2023-12-03>

今度は建物内部のLightの配置を行っています。

<2023-12-10>

この週は何故、Gameを作ってはいけないのかについて解説して終わっていました。

以上でした。

2.2 今年後半部分の感想・まとめ

半年で、写実的な環境の作成方法をマスター出来るかと思いましたが、全然出来ませんでした。

来年、一年間かけて完成させます。

3.Niagara の勉強

3.1 今年後半の作業内容まとめ

<2023-07-09>

なし

<2023-07-16>

自分でアニメ調のEffectを作成する事にしていました。

そういえばこんなのやっていたんですね。

以下の炎のEffectをアニメ調のMaterialに変更するそうです。

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

<2023-07-23>

アニメ調の炎の作成の続きをしています。

結果です。

<2023-07-30>

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

暗闇だと以下のようになります。

これはもうどう見ても合格点でしょう。

<2023-08-06>

先週作成したアニメ調の炎の実装を最適化しています。

これは、Materialの実装を弄る事が出来ない人でも、Material Instanceの値をいじる事でそれぞれの炎の幅や色を変更出来るような実装にするのが目的でした。

しかし途中で、以下のような白黒の炎を作成出来る事に気が付いて

これをもっと改良したら筆で描いた炎のようなEffectが作成出来るかもしれないと考えるようになりました。

それで予定を変更してこのEffectをもっと発展させるそうです。

<2023-08-14>

結果です。

筆で書いたかすれた感じをだそうと思ったんですが、なんかクレヨンで描いたみたいな感じになってしまいました。

<2023-08-21>

色を追加しています。

これだと改良する前の方が良かったです。

<2023-08-28>

Material Instanceから全ての色を指定出来るように実装を改良しています。

今度は以下のEffectを改良するそうです。

更にUEFNでUEのNiagaraが動くかどうかを確認しています。

以下は氷のEffectですが、普通に動いています。

<2023-09-04>

以下のような改良まで作成しました。

<2023-09-11>

何故かBallの部分が光っています。

それをどうにか直そうとしています。

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

<2023-09-18>

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

<2023-09-25>

この週から「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強する事にしました。

<2023-10-01>

なし

<2023-10-09>

Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強しています。

草のEffectを作成しました。

私が作成したのはBillboardがあるのがはっきり分かります。

教科書のSample CodeのはBillboardがあるようには見えないんです。

<2023-11-12>

「Chapter 13 Game of Life」を実装していました。

結構Volumeが多くて途中でGive Upしています。

残りは来週やると書いてありました。

半分位終わった感じでした。

<2023-11-19>

続きをやっています。

がこの週は本当に一寸しか勉強していません。

なんか用事があったのかもしれません。

<2023-11-26>

CGHOW氏がTutorialの公開を止めてしまった事についてまとめていました。

結構最近の話です。

「Chapter 13 Game of Life」の実装が完成しましたが、Effectが発生しません。

<2023-12-03>

Effectが動かない原因を追究しています。

ここで初めて、NiagaraのBugを検証する方法を知らない事に気が付きました。

この週は結局Bugの原因を突き止める事は出来ませんでした。

Niagara内のBugを追求するにはAttribute Spreadsheetを使用する方法がある事だけは判明しました。

<2023-12-10>

Attribute Spreadsheetの使い方を調べています。

使用方法が大体分かったので、動かない「Chapter 13 Game of Life」の実装で試してみたら

Parameterが一個も作成されていない事が判明しました。

これは「Chapter 13 Game of Life」の実装をしたEmitter Stack自体に問題が発生していると考えられます。

ので新しいEmitter Stackを使用して最初から実装し直しました。

結果です。

普通に動くようになりました。

3.2 今年後半部分の感想・まとめ

こうやってまとめてみるとかなりしっかり勉強していた事が分かります。

しかも成果も着実に出ています。

アニメ調のEffectを作成するのは続けたいですね。

4.Materialの勉強

4.1 今年後半の作業内容まとめ

<2023-07-09>

無し

<2023-07-16>

Advanced Material SeriesのParallax Occlusion Optimization - Advanced Materials - Episode 15の実装をしていました。

Ben Cloward先生のTutorialですね。

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

<2023-07-23>

Glass Shader - Advanced Materials - Episode 16を勉強していました。

以下のような結果になるそうです。

実装は来週やるそうです。

<2023-07-30>

Glass Shader - Advanced Materials - Episode 16を実装しています。

結果です。

<2023-08-06>

Bricks and Stucco Shader - Advanced Materials - Episode 17を勉強しています。

こんなのでした。

実装は来週するそうです。

こんなの勉強したの全く覚えていません。

当然、どうやって実装するのかもまったく覚えていません。

<2023-08-14>

Bricks and Stucco Shader - Advanced Materials - Episode 17を実装しています。

結果です。

うーん。

一見すると変ですがまあこんなのも有るのかもしれません。

<2023-08-21>

Sharp Text Shader - Advanced Materials - Episode 18を勉強してました。

このTechniqueは何回かこの後も使用したはずです。

そういう意味でも結構重要な内容でした。

<2023-08-28>

先週勉強したSharp Text Shader - Advanced Materials - Episode 18を実装しています。

結果です。

なんとこの週では実装が終わらなかったので来週に持ち越すと書かれていました。

そんなに難しい実装ではないはずですが?

一体何をしてそんなに時間を費やしてしまったのかを確認したらBridge Quixelにある木材の分類が以下のようになっていて

それぞれの違いが分からないからと念入りにそれぞれの定義を調べていました。

Parquetは木の模様の入った床の事、Plankは板でBoardとはSizeが違う場合に分けて言う場合もあるが、同じ意味で使用する場合も多い事、更にVeneerはベニヤ板だと判明しました。

あんまり役に立つ知識ではないかもしれません。

<2023-09-04>

Sharp Text Shader - Advanced Materials - Episode 18の実装の続きをしていました。

結果です。

近づいて見ると

ここで作成したMaterialを使用してない上の文字はギザギザが確認出来ますが、ここで実装したMaterialを使用した下の文字は近づいて見てもギザギザは確認出来ません。

出来ています。

<2023-09-11>

Iridescent Bubble Shader - Advanced Materials - Episode 19を勉強しています。

以下のようなシャボン玉を作成していました。

<2023-09-18>

先週、勉強したIridescent Bubble Shader - Advanced Materials - Episode 19を実装しています。

結果です。

かなり綺麗なのでこのMaterialを使用して以下のEffectをNiagaraを使用して作成しました。

<2023-09-25>

なし

<2023-10-01>

この週もなしです。

この週は三カ月に一回のお休みの週ですので、これは仕方ないです。

<2023-10-09>

また勉強をお休みしていました。

Ben Cloward先生の動画の更新が止まってしまったので、あんまり急いて勉強しても仕方ないと思っていたのかもしれません。

<2023-10-15>

この週もMaterialの勉強はしていません。

<2023-10-22>

この週もMaterialの勉強はしていませんでした。

ただこの週でBen Cloward先生が新しいTutorialを上げていた事を報告していました。

<2023-10-29>

Tempered Steel Shader - Advanced Materials - Episode 20を勉強していました。

やっぱりBen Cloward先生が動画を上げなくなったのでMaterialの勉強は慌てる必要はないと考えて勉強を中断していたと書いていました。

以下のMaterialを作成するそうです。

<2023-11-05>

Tempered Steel Shader - Advanced Materials - Episode 20を実装しています。

結果です。

<2023-11-12>

Subgraphs and Material Functions - Advanced Materials - Episode 21を勉強しています。

これはMaterialの基礎の内容で、私が勉強すべきものではなかった。とまとめていました。

このTutorialの勉強はこの週でお終いだそうです。

<2023-11-19>

Retroreflective Road Sign - Advanced Materials - Episode 22 を勉強しています。

以下のような光が当たると光って見える掲示板のMaterialを作成するための勉強をしています。

<2023-11-26>

先週勉強したRetroreflective Road Sign - Advanced Materials - Episode 22 を実装しています。

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

<2023-12-03>

Local Volumetric Fog - Advanced Materials - Episode 23を勉強しています。

こんなMaterialを作成するそうです。

<2023-12-10>

Local Volumetric Fog - Advanced Materials - Episode 23を勉強しています。

結果です。

4.2 今年後半部分の感想・まとめ

Materialの勉強は結構サボっていました。

来年はもう少し頑張る必要があるかもしれません。

5.Gaeaの勉強

5.1 今年後半の作業内容まとめ

<2023-07-09>

なし。

<2023-07-16>

Geology 8 (Weathering and Erosion)[6]を勉強しています。

この辺はGeologyの勉強を主にしていますね。

これはこれで大事ですが、こればっかしの勉強になってGaeaの勉強を全くしないのも一寸問題な気がします。

ただ読み直したら結構、内容は濃かったです。

英語の専門用語で特にGeologyに関連する専門用語は対応する日本語が無いだけでなく、前提となる概念そのものが日本語に存在していません。

なので最初に概念をしっかり理解した上で、専門用語を解説している私のBlogは実際は非常に貴重な内容になっていました。

GaeaのTutorial作成についても少しだけまとめていました。

Coloringについての内容でした。

以下のように2色で色を塗る方法を解説していました。

<2023-07-23>

Geology 8 (Weathering and Erosion)の続きを勉強しています。

Hoodooを勉強していました。

GaeaのTutorialの作成もしていました。

Coloringの続きです。

先週作成した実装を改良して以下のようにしています。

更に以下の実装を繰り返す事でMaskingを永遠に繰り返して使用出来る事も解説しています。

こんなの秘伝級の内容でしょう。

更にTextureノードとSetMapノードを組み合わせる事で

以下のようなRealな色合いを表現出来る事を教えています。

この辺は秘伝にしてお金を払った人だけに教えても良い気がします。

<2023-07-30>

Geology 9 (Soil)を勉強しています。

Gaeaの勉強ではTemplateにあるDesert Mountainの実装を見て勉強しています。

<2023-08-06>

この週もGeology 9 (Soil)の続きを勉強しています。

Gaeaの勉強ではBuildの仕方をまとめていました。

今までやったBuildの勉強をまとめたBlogの内容を全部まとめていました。

しかし大した情報は無くて、結局自分でBuildのParameterを調べていました。

<2023-08-14>

Geology 10 (Sedimentary Rocks)を勉強していました。

これは今もってあんまり理解していません。

Gaeaの勉強もしていました。

Tutorialを作成するためにBuildの手順についてまとめていました。

UE5.3でこのやり方を確認したら以下のようにまだら模様になってしまいました。

これは後のVersionになったら修正されたんですが、この時は頭の中が真っ白になる位Shockを受けました。

こういう自分にできない部分で悩むのは時間の無駄ですし、後でEpic Games社が勝手にBugを修正してくれるのだから、果報は寝て待ての精神も必要なんだという事です。

<2023-08-21>

Geology 10 (Sedimentary Rocks)の続きを勉強していました。

Gaeaの勉強は時間が無くなったのでやっていません。

<2023-08-28>

Buildの部分のTutorialの作成部分を作成していました。

かなり綺麗にまとめています。

BuildのTutorialを作成する時は、この週のBlogを参考にします。

<2023-09-04>

Geology 11 (Metamorphic Rocks)を勉強しています。

Gaeaの勉強では、Terrainの高さを測定する方法を検証していました。

Buildの設定のRangeはNormalizeにセットしていますが、

これが高さだけに適用されている事を実験結果から推測しています。

一応、この実験結果を見る限りはこの推測は正しい気がします。

しかしまあ反証するための検証をしている人もいないので、なんとも言えません。

<2023-09-11>

Geology 11 (Metamorphic Rocks)の続きを勉強していました。

Faultと言う言葉が出て来ましたが、何の解説も無くてがっかりしていました。

GaeaのTutorialを作成するに当たって何をすべきなのかを検証していました。

Mind Mapを使用して整理しています。

UE5.3.0が公開されてそれでMaskを使用したLandscapeを作成したら

前にあった縞々が直っていました。

これ見て分かるように、UE5などの勉強は一点突破は絶対駄目という事です。

一個に全賭けしてしますと必ず行き詰ってしまいます。

色々試してどれか一個が成功すれば良い位に考えておいた方が良いです。

<2023-09-18>

Geology 12 (Earthquakes and Earth's Interior)を勉強していました。

Faultの例が載っていました。

ここではShearは以下のように解説していました。

これは後で作成したTutorialの意味と違っていますね。

どっちが正しいんでしょうか?

Gaeaの勉強に関しては、Tutorial用のパワホを作成していました。

本当に一寸だけやっただけでした。

<2023-09-25>

Geology 12 (Earthquakes and Earth's Interior)の続きを勉強していました。

GaeaのTutorialの作成に関しては、音声ソフトの検証を行っていました。

この週に検証したSoftはTextを読み上げるTypeの音声ソフトで、英語が全く読めない事が判明しました。

<2023-10-01>

なし。

この週は三カ月に一回のお休みの週でした。

<2023-10-09>

MindmeisterのBugについて憤慨しています。

Geology 14 (The Ocean Floor)を勉強しています。

Tutorial作成用のVoiceにRVCを試しています。

<2023-10-15>

RVCのModelについていたDefaultを使用した場合の規約の確認をしていました。

結構、複雑で途中で嫌になっています。

無償で公開されているならそれに見合った程度の規約にしてほしいです。

<2023-10-22>

ここで独自のCharacterを生成しました。

後、規約がうるさくないModelも見つけてそれを使用する事にしました。

Gaeaの勉強はしていませんね。

<2023-10-29>

Gaeaの最初のTutorialを作成しています。

MouseやKeyboardの操作方法を表示するSoftも追加しました。

これ地味に一個しか見つからなかったSoftです。

<2023-11-05>

遂に最初のTutorialの動画を完成させました。

<2023-11-12>

何回か作り直していますが、次のTutorialの動画の作成が出来ました。

<2023-11-19>

この週も最初のTutorialの計画からかなり内容が変わって別なTutorialの内容になっていました。

でも一応、完成して公開しています。

<2023-11-26>

Look Dev GroupにあるNodeの使用方法についてまとめています。

これ、かなりの秀作で、5回位しか再生されていませんが、一見どころか何回も見る価値がある出来になっています。

まあ、再生されないのは残念ですがまだ無名なのでそれは我慢します。

<2023-12-03>

先週上げた動画の再生回数が一回のままだと書いて嘆いていました。

それだけです。

<2023-12-10>

ErosionについてのTutorialを作成していました。

5.2 今年後半部分の感想・まとめ

こうやってまとめてみると、Gaeaは結構勉強しています。

Tutorialの動画も始めましたし、Geologyの勉強もしていました。

どちらもまだ成果が出ていませんが、これを続けるかどうかが問題ですね。

6. Houdiniの勉強

6.1 今年後半の作業内容まとめ

<2023-07-09>

なし

<2023-07-16>

Houdiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 4 – Subgraphs の実装をしていました。

結果だけ以下に示します。

<2023-07-23>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 4 – Subgraphsの実装の続きをやっています。

以下のようにSplineを引いた部分のPointsが消えるようになりました。

<2023-07-30>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 5 - Custom PCG Actor and Attributesの勉強をしています。

結果です。

うーん。

これは何を勉強したんでしょうね。

Blogを読み直したらNon PCG Volume Actor内からPCGを起動する方法を勉強したみたいです。

うーん。

憶えてない。

<2023-08-06>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 5 - Custom PCG Actor and Attributesの実装をしています。

以下の部分の実装まで終わらしていました。

<2023-08-14>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

あれ?

Unreal 5.2 Preview PCG Tutorial - Part 5 - Custom PCG Actor and Attributesの実装の続きをやるのかと思ったら

次のTutorialであるUnreal 5.2 Preview PCG Tutorial - Part 6 - Sampling Meshesを勉強していました。

このTutorialではPCG内でMeshの位置を取得して、更にその位置にPointを生成する方法を勉強しているみたいです。

結果です。

これか。

<2023-08-21>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

先週勉強したUnreal 5.2 Preview PCG Tutorial - Part 6 - Sampling Meshesの実装をしていました。

結果です。

結構綺麗ですね。

<2023-08-28>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 7 - Custom Nodesを勉強していました。

このTutorialではCustomノードを作成するためのBlueprintの作成方法を勉強しているみたいです。

今、ざっとこの週のBlogを読んだんですが、PCG Blueprint ElementからBlueprintを作成する事で、PCG用のCustomノードが作成出来るみたいです。

Houdiniの勉強はこのUEのPCGの生成方法の勉強も含めてまだ身になってないので、思い出せと言われても何も思い出せません。

まあ、焦って全部駄目にしてしまうよりもゆっくりでも結果を出せた方が良いので慌てないでやっていきます。

一応、最後の結果だけ示しておきます。

このBlogの最後にこんなの出来て何になるの?と書いていました。

このTutorialの目的がPCG内で使用出来るCustomノードをBlueprintから作成する事である事を完全に忘れている発言です。

まあ、仕方ないです。

急に何かを勉強しようとすると、必ずどこかに抜けが生じてしまうのは真理ですので。

<2023-09-04>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

先週勉強したUnreal 5.2 Preview PCG Tutorial - Part 7 - Custom Nodesの実装をしていました。

実装に関しては特に問題なく全部出来たみたいです。

<2023-09-11>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdown を勉強していました。

思い出してきました。

これ完成しなかったやつです。

Tutorialが40分もあるので、3分割して勉強すると言っています。

その最初の部分だけ勉強していました。

<2023-09-18>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdown の続きを勉強していました。

以下の地形を作成する所まで勉強して終わっていました。

<2023-09-25>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

先週までのUnreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdown の勉強した部分を実装するそうです。

以下の部分まで実装して終わっています。

<2023-10-01>

なしです。

<2023-10-09>

この週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial を勉強しています。

Unreal 5.2 Preview PCG Tutorial - Part 8 - Jungle Breakdownの実装の続きをやっています。

PCG_Pathの実装まで完成させていました。

<2023-10-15>

今週もHoudiniの勉強はお休みしてUE5のPCGの勉強をします。

がここで方向転換していました。

別なTutorialであるNodes of Nature氏のPCG Building in Unreal Engine を勉強すると書いていました。

このTutorialは全体で50分もあるので最初の10分だけ勉強していました。

<2023-10-22>

今週もHoudiniの勉強はお休みしてUE5のPCGの勉強をします。

先週勉強したNodes of Nature氏のPCG Building in Unreal Engineを実装しています。

一応、実装は出来たし、以下に示した様なそれぞれのPointのDataの表示方法なんかも勉強出来たんですが、

Tutorialの説明通りに全くならない箇所がありました。

のでこのTutorialの勉強は中止する事にしました。

<2023-10-29>

この週からHoudiniの勉強に戻っています。

この週からCastle Wall Toolの勉強をやる事にしました。

この週はCastle Wall Toolの最初のTutorialであるHoudini 19 - Wall Tool 01を勉強していました。

このTutorialはこれから作成するWallの使用方法について解説していたんですが、それには気が付かないで勉強していました。

<2023-11-05>

Castle Wall Toolの勉強をやっています。

Houdini 19 - Wall Tool 02を勉強していました。

<2023-11-12>

先週勉強したHoudini 19 - Wall Tool 02の実装をしていました。

以下の部分までの実装を終えました。

<2023-11-19>

Houdini 19 - Wall Tool 02の残りを実装していました。

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

<2023-11-26>

Houdini 19 - Wall Tool 02の実装で意味の分からなかった部分の解明をしていました。

その過程でRulerを使用するためにSide FX Labを表示する必要が有りました。

このSide FX Labの設定方法のやり方が分からなかったんですが、それをここで解明していました。

このSide FX LabのInstall方法は日本語で解説してあるのは無いみたいで、もしかしたらHoudiniだけを専門に勉強している人でも知らないかもしれません。

<2023-12-03>

Houdini 19 - Wall Tool 03 の実装をしていました。

あれ?

Houdini 19 - Wall Tool 03の勉強は?

よく見たら先週、Houdini 19 - Wall Tool 03の勉強もやっていました。

以下のようにPointの位置を移動したところで終わっていました。

Houdini 19 - Wall Tool 03の実装の続きをやっていました。

<2023-12-10>

Houdini 19 - Wall Tool 04の勉強をしていました。

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

6.2 今年後半部分の感想・まとめ

まだHoudiniというかPCGの勉強は赤ちゃんがよちよち歩きを覚えた状態なのでとても形になっているとは言い難いです。

まあ焦って台無しにしても勿体ないのでこんな感じでゆっくりやって行くことにします。

7. UEFNの勉強

7.1 今年後半の作業内容まとめ

<2023-07-09>

なし

<2023-07-16>

Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course!の実装の続きをやっていました。

Gameを終了するButtonを実装していました。

<2023-07-23>

Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course!の実装の続きをまだやっていました。

この週は敵の配置をする方法を習っていました。

<2023-07-30>

なんと、この週からMetaverseにおけるインベーダーゲームを作成すると書いていました。

そう言えばそんなのを考えていた時もありました。

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

<2023-08-06>

まだインベーダーゲームを作成していました。

敵が出現する所まで作成していました。

<2023-08-14>

何故か突然、別のTutorialを勉強すると宣言しています。

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

この週からTutorialの勉強に移行したみたいですね。

最初のTutorialであるMake a Sliding Door / Moving Object in UEFN Creative 2.0を勉強しています。

このTutorialではButtonを押すとDoorがSlideする機能を作成する方法を勉強していました。

後は、作成したUEFNを公開する方法について調査していました。

これも後回しですね。

<2023-08-21>

先週勉強したMake a Sliding Door / Moving Object in UEFN Creative 2.0 を実装していました。

後、UEFNのNiagaraが余りにも少ない事が判明してこの部分の専門家になるのが良いかもしれないと書いていました。

<2023-08-28>

次のTutorialであるMake a custom UI with a clickable Button - UEFN/Creative2.0を勉強していました。

このTutorialで初めてVerseの使い方を習っていました。

Classとか平然と使用していて全然Functional Programmingじゃないです。

Python系の言語で、Indentで調整したら、行の終わりにSemicolonを打ったりする事もなくて私には非常に使いづらい言語です。

結果です。

以下のようにUIにButtonが現れました。

押すと消えます。

<2023-09-04>

先週勉強したMake a custom UI with a clickable Button - UEFN/Creative2.0 を実装していました。

Indentが原因で変数が作成出来ず

滅茶苦茶苦労していました。

UIのButtonを作成したところで終わっていました。

<2023-09-11>

先週、書いたVerseのCodeで意味の分からない部分を検証したり調べたりしていました。

その後でMake a custom UI with a clickable Button - UEFN/Creative2.0の実装の続きを行っていました。

Buttonを押したらUIが消えるようになりました。

<2023-09-18>

次のMake Your Player Invisible in Fortnite! UEFN / Creative 2.0を勉強していました。

しゃがむと透明なる機能を追加する方法を勉強していました。

<2023-09-25>

先週勉強したMake Your Player Invisible in Fortnite! UEFN / Creative 2.0を実装していました。

ぱっとBlogを読み直しましたが、特に分からなくて困ったところとかは無かったみたいです。

最後にTestして普通に出来ているのを確認して終わっていました。

<2023-10-01>

なし

<2023-10-09>

Easily Make Anything Follow Your Player! UEFN/Creative 2.0を勉強しています。

Playerを追いかえるPropを作成する方法を勉強するそうです。

以下のような結果になっていました。

ここでは初めてFab Alpha MarketplaceからAssetをInstallしました。

<2023-10-15>

先週勉強したEasily Make Anything Follow Your Player! UEFN/Creative 2.0を実装していました。

完成したみたいですがScreenshotが無いですね。

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

<2023-10-22>

How to Make Custom Vehicles in Fortnite - UEFN / Creative 2.0 を勉強します。

小さな地球にのって移動する方法について勉強していました。

実際はHotdogのBanを使用していました。

<2023-10-29>

先週勉強したHow to Make Custom Vehicles in Fortnite - UEFN / Creative 2.0 を実装していました。

UFOに乗って移動するとHotdogのBanがついて回るようになりました。

<2023-11-05>

Make a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2を勉強していました。

前に作成したUIのButtonを押すとSequenceが流れるようにするそうです。

UI Cinematic To Playを使用していますが、このAssetの使用方法については全く説明がありませんでした。

<2023-11-12>

先週、勉強したMake a UI Button Play A Sequence! UEFN / Creative 2.0 Custom UI Part 2を実装していました。

椅子が移動するSequenceを作成してUIを押す事でそれを実行させることが出来たみたいです。

特に技術的な問題は無かったみたいですね。

<2023-11-19>

Make Anything Face Your Player! UEFN/Creative 2.0 Verse Tutorialを勉強していました。

Imageが常にCameraを向くようにするための実装方法について勉強していました。

<2023-11-26>

先週勉強したMake Anything Face Your Player! UEFN/Creative 2.0 Verse Tutorialを実装していました。

以下の狛犬で試したんですが全くこっちを見ません。

3つ位Bugを直してやっとこっちを見るようになりました。

<2023-12-03>

If I Don't Drive Above 40, The Bomb will Go Off! Fortnite UEFN/Creative 2.0 Tutorialを勉強していました。

車を40 km/s以下で勉強したら爆発する実装をするそうです。

特に記録すべき内容も無いですね。

<2023-12-10>

先週勉強したIf I Don't Drive Above 40, The Bomb will Go Off! Fortnite UEFN/Creative 2.0 Tutorialを実装していました。

実装した後、テストしたら普通に爆発したんですが、その瞬間のScreenshotは取れなかったそうです。

その後、再生された場面のScreenshotを載せていました。

7.2 今年後半部分の感想・まとめ

本当は、今年中にUEFNで作成したGameを公開しようとしたんですが、なんかUEFNのCreativeの方が色々問題を抱えているみたいなんで一寸中止しています。

来年は、Creativeの動向を見てどうするか考える事にします。

一番、成功しそうなCreative2.0が一番最初に崩壊しそうになっています。

未来を正しく予測するのは本当に難しいですね。

8. DirectX12の勉強

8.1 今年後半の作業内容まとめ

<2023-07-09>

あれ?

OlympusMonsTutorialsの勉強をしていますね。「HLSLシェーダーの魔導書」の勉強もしています。

勿論、「DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強もしていますが、

来週から「DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」だけ勉強すると書いていました。

<2023-07-16>

なしです。

YouTubeの動画の作成が終わらないのでDirectX12の勉強する時間が取れなかったと書いていました。

<2023-07-23>

DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の今までやった勉強の復習だけやっています。

しばらく勉強してなかったので何をやったのかを忘れてしまったと書いていました。

<2023-07-30>

この週もDirectX12の勉強はしていませんでした。

YouTubeの動画の作成が終わらなかったからそれをやるためにDirectX12の時間が取れなかったと書いていました。

<2023-08-06>

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

と言っても一寸だけです。

<2023-08-14>

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

時間を大幅に超過してやっと勉強する時間を確保出来たと書いていました。

<2023-08-21>

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

垂直同期を理解するために電子銃について調べていました。

<2023-08-28>

この週は無しでした。

<2023-09-04>

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

DirectX 12の魔導書」の勉強では「3.3 画面色のClear」のまとめをするに当たって今まで勉強した内容を全部復習する必要があると、今までのBlogの勉強した内容をまとめていました。

<2023-09-11>

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

<2023-09-18>

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

以下の用語についてまとめてしました。

<2023-09-25>

無しです。

<2023-10-01>

先週、DirectX12の勉強が出来なかったので、この週は休みの週でしたが、DirectX12の勉強だけしていました。

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

<2023-10-09>

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

DirectX 12の魔導書」では「3.4 Error対応」を勉強していました。

<2023-10-15>

DirectX 12の魔導書」のみ勉強していました。

Direct3D 12 ゲームグラフィック実践ガイド」の勉強はしてませんでした。

DirectX 12の魔導書」ではDebug Layerについて勉強していました。

<2023-10-22>

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

うーん。

Direct3D 12 ゲームグラフィック実践ガイド」の勉強は「DirectX 12の魔導書」でFenceの勉強が終わるまでPendingしてたと書いていました。

<2023-10-29>

今週からLötwig Fusel氏のTutorialも勉強する事にしていました。

最初のTutorialであるProject Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] を勉強していました。

Tutorialの最初の10分まで勉強していました。

DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強もしていました。

Direct3D 12 ゲームグラフィック実践ガイド」による勉強はそろそろ中止した方が良いかもしれないと書いていました。

<2023-11-05>

先週勉強したLötwig Fusel氏のTutorial のProject Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] を実装していました。

DirectX 12の魔導書」の勉強もしていました。

DirectX 12の魔導書」の勉強では「Chapter 3 初期化から画面クリアまで」がやっと終わりました。

DirectX 12の魔導書」ではこの三章まででDirectX12の基礎を教えています。

のでこの3章を理解することがかなり重要だったんですが、それに気が付かないで勉強していました。

正し、焦らずちょびちょび一寸ずつ勉強していたんで結果的にはその大切な3章の内容を漏らさず勉強する事が出来ました。

<2023-11-12>

Lötwig Fusel氏のTutorial のProject Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez]の実装の続きをしていました。

最初のTutorialの最初の10分しか勉強してないのにまだ実装が終わってないのかと思ってBlogを良く読んでみたら

ぬぐぐ。

これか。

これを直すのは結構大変でした。

DirectX12はDirectX12を勉強する前の環境を整えるのにかなり時間が掛かります。

DirectX 12の魔導書」の勉強もしていました。

次の章である「Chapter 4 Polygonの表示」を軽く読んで内容を簡単にまとめていました。

<2023-11-19>

Lötwig Fusel氏の Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] の実装の続きをまだやっていました。

一応、この週のBlogではこれでやっと完成した。と書いていました。

更にProject Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] の続きを勉強していました。

ComPointerについて勉強していました。

DirectX 12の魔導書」の勉強もしていました。

4章の1と2をそれなりにしっかり読んだだけでした。

<2023-11-26>

Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez]で先週勉強したところを実装しています。

IUnknownがErrorになっていて

この原因を追究してますが、結局分からないで終わっていました。

DirectX 12の魔導書」の勉強もしていました。

4章の1と2は実装する内容がなかったので、「4.3 Vertex Buffer」を読んでいました。

<2023-12-03>

Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez]で先週動かなかったところの原因を追究していました。

その過程でなんとTutorialでもErrorになっていて

しかもそれを無視して先に進めている事が判明しました。

Tutorialと同じようにこのErrorを無視して強引に使用するとTutorialと同じ結果が表示されました。

しかもその後からこのErrorは消えてしまったそうです。

はい。

Error問題は解決しました。

DirectX 12の魔導書」の勉強もしていました。

この週では実装も一寸やっていますね。

<2023-12-10>

Lötwig Fusel氏のD3D12 Beginners Tutorialの2つ目のTutorialであるDebug Layer | D3D12 Beginners Tutorial [D3D12Ez]を勉強していました。

Debug Layerについて勉強していました。

DirectX 12の魔導書」の勉強もしていました。

「4.4 Vertex情報のCopy(Map)」を読んでまとめていました。

8.2 今年後半部分の感想・まとめ

DirectX12は内容が重いのでそれなりにしか理解が進みません。

こればっかり勉強したらすぐに終わるんですが、中々他との兼ね合いがありそう言う事は出来ないのでこの位の進捗で満足する必要が有ります。

9.まとめと感想

先週と今週のまとめを利用して来年の計画を考える事にします。

10.参照(Reference)

なし

 

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

1. 今週の予定

1.1 今週の予定

今週と来週は一年間の勉強のまとめを行います。

今週は今年前半部分のまとめを行います。

2.Landscapeの作成

2.1 今年前半の作業内容まとめ

2023-01-01

まだ作業は何もしていません。

上記の内容を今年はやると宣言しているだけです。

一年かけて以下の地形を作成すると宣言していました。

雪山や砂漠は作成出来ませんでしたが、やらなくて良かったです。

UE5.3になってLandscapeのDisplacement機能が復活しました。

これがあれば雪山や砂漠の足跡は簡単に作成出来ます。

しかしこれをVirtual Textureで再現しようとするととんでもない手間が掛かります。

今作成している森の周りの普通の建物の撮影が上手くいったら雪山や砂漠の作成も考える事にします。

更に以下のような具体的な計画も立てていました。

ここの問題はUE付属のWater Systemに頼って地形を作成使用としている所です。

ぶっちゃけUE付属のWater Systemはまだ実用に耐えれないです。

三月の予定表にHoudiniを使用して作成した建物の配置。とか書いています。

こんなの未だにどうやって良いのか不明です。

予定を作成する時に、その時に知らない技術を覚えて作成するみたいな計画を建ててはいけませんね。

絶対に実現不可能です。

2023-01-08

Gaeaを使用してLandscape用のDataを作成しています。

そんだけです。

2023-01-15

Gaeaで作成したTerrainをUEにImportして以下のLandscapeを作成しました。

この辺は順調ですね。

2023-01-22

Water systemを追加して川や湖、そして海を作成しています。

作業的には非常に順調ですね。

ただWater systemで生成された川とは見た目が最悪です。

2023-01-30

今まで作成した部分が製品化した時でもしっかり再現されているのかをPackagingして確認してみます。

なんとPackagingしたら川が消えてしまいました。

ここから色々な方法で川を作成しようとしていますが、駄目でした。

2023-02-06

Landscape用のMaterialを作成しています。

作成途中で終わっていました。

2023-02-13

Materialが完成しました。

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

全然駄目ですね。と感想を書いていました。

まあ、どこを合格点にするかですが、写真と区別がつかない地形を作成するとしたら駄目ですね。

2023-02-19

UE5ではDisplacementが無い事を知って衝撃を受けています。

後は手動で凸凹を直しています。

今、見直すと手動で直した箇所は、結構綺麗になっていますね。

2023-02-26

Virtual TextureをDisplacementの代わりに使用して足跡を作成する方法を検討しています。

更に以下のようにFoliageを使用して岩などを配置していました。

2023-03-06

Foliageで配置した岩の色を変更したり、Foliageで木を配置してみたりしています。

色々実験してるって感じです。

2023-03-13

Runtime Virtual Textureを使用して岩にLandscapeのMaterialを投影しています。

岩に投影したLandscapeのMaterialのSizeが100倍位大きくなってしまっています。

途中で岩のMaterialとLandscapeのMaterialの差を見るために岩の色を赤くしました。

これって偶然の産物ですが、かなり芸術点高いですよね。

後、Packagingした結果も確認していました。

2023-03-20

Virtual TextureとLandscapeのMaterialのSizeが違う問題を直しています。

以下のように完璧に直りました。

これは今、読み直しても凄いと感心します。

最終的には以下のような地形になりました。

こういうのは今見てもかなり良い感じです。

別に商業用のGameと比較してもなんら見劣りしていません。

2023-03-27

ここで島全体に木や草を配置していますが、ある問題に気が付きました。

これです。

この問題は今になっても解決しません。

この問題が解決しなかった事がGameの作成は諦める事にした理由の一つです。

以下のErrorが表示されます。

これって今読むとDirectX12の話ですよね。

D3D12 DeviceがCrashしたのでDebug Layerで理由を確認して下さい。

と言っているだけです。

はい。

それで木や岩を島全体に配置する事は諦めて、以下の位置から見える風景だけ本物らしくする事にしました。

岩や草を一個ずつ配置しています。

2023-04-10

GPU Crashed Errorについての検証を行っています。

更にFoliageを大量に配置してLandscapeの境界に来ると、FPSが異常に落ちて一瞬だけ止まる事を発見しました。

うーん。

こういう問題が起きないようにNaniteが開発されたと思っているですが5.3になった今でも駄目なんでしょうか?

後、以下の場所から見た風景の改良も進んでいますね。

UE5.2がReleaseされたそうです。

Packagingした時にWater Systemの川が表示されるかどうかを確認しています。

普通に存在していました。

2023-04-17

Landscapeの計算Costを下げる方法を検討しています。

一種類のFoliageの数は3万位までならSub Levelの境界でFPSが落ちる事はないのではないのかとの結論になっていました。

これ、2種類の岩しか試してないので全然信用性のない結論です。

この時点で、計画していたLandscapeの作成が出来ない事が判明して正常な判断が出来なくなってしまったんでしょうね。

今、Blogを読み直すと痛々しいです。

後、5.2でWater Systemを使用して川を作成すると

Packagingした後のExe.fileでも普通に川が生成されています。

こういうVersionの違いによる変化って本当に対応するのが大変です。

本当にこれでGameなんか作成する事出来るんでしょうか?

後はLandscapeをNanite化とかしています。

2023-04-24

この週はUE5.2でLandscapeを作成し直しています。

更にWater systemの川を追加して以下のようなLandscapeを作成しています。

ここでGaeaで生成したTerrainの地形の大きさとUE5で生成した地形の大きさが合ってないので、

UE5上では川のSizeが小さくなってWater Systemの川を追加した場合とサイズが合わないと述べていました。

Gaeaの地形のSizeの指定方法を理解している今なら、この問題に対して対処する方法をもっと詳しく検討する事が出来ます。

時間があったら試す事にします。

後、ここでは川の色を変える方法について勉強していました。

以下のように透明な川に変更しています。

これだと川があるのかどうか不明ですね。

もっとキラキラ輝いたら水がある事が判明しますね。

Specular Lightを追加すべきかもしれません。

2023-05-01

以下のようにしてWater Systemの海を追加しました。

今考えるとこのやり方よりも、Landscapeの形成を変化させない方で作成した方が簡単だしGaeaで作成した結果に近い気がします。

以下のようにLandscapeの境界がおかしくなっています。

Build Lighting Onlyをするとこの変化は直ったんですがここでそれを試しても直らなかったと書いてあります。

これ、この時の5.2だとBuild Lighting Onlyの機能がきちんと作用してなかった可能性もあります。

更にこの時からCamera Speedの値がおかしくなりました。

これでCamera Speedを調整すると表示されているCamera Speedの値がおかしくなります。

この後、Numen Brothers氏のTutorialでLandscapeに穴を開けて洞窟を作成する方法を勉強しています。

2023-05-08

自分でLandscapeに穴を開けて洞窟を作成しています。

うーん。

洞窟内に限って言えば実用Levelに達していますね。

2023-05-15

何をしているのかよく分からなかったんですが、最後まで読んだら理解出来ました。

まずFoliageを使用して木を島の周りに植えました。

そしたら木が埋まっている箇所がありました。

この原因はWater Systemの海が海岸の高低を自動で変更するからでした。

それを直すためには

手作業で一々海岸の盛り上がっている箇所を修正するしかないとの事でした。

それを直した結果、以下のように

Foliageで生成された木が普通に生えるようになりました。

2023-05-22

Water System OcceanにFoamを追加するための勉強をしています。

ここで

について初めて知りました。

この機能についてはもっと深堀すべきでした。

これは来年試す事にします。

2023-05-28

Water Body OcceanにFoamを追加しています。

結果です。

最も上手く出来たところですらこれです。

駄目な部分だと

こんな感じです。

2023-06-04

以下のようにまとめていました。

兎に角Foamに対してこれ以上時間を費やすのは勿体ないのでここで終了すると言っています。

2023-06-11

川を追加しています。

川の色がオカシイですね。

それ以外はかなり良いです。

前に勉強した川の色を変更する方法を試したらもっと良くなる気がします。

2023-06-19

先週追加した川のPackagingのTestをしています。

この辺からもうGameとしてのLandscapeは諦めて、撮影場所としてのLandscapeを作成しようと書いています。

後Virtual Textureの復習とかもしています。

岩とLandscapeのつなぎ目をVirtual Textureを使用して直したいと書いてありました。

これのやり方をまとめたTutorialを後で見つけたのでこれが必要な時はそれをそのまま使用します。

2023-06-26

この週はLandscapeの作成はSkipして何もやっていません。

以上でした。

2.2 今年前半部分の感想・まとめ

色々試して出来なくて挫折しているさまが、よく分かります。

これだけ色々試して出来なかったらGame作るのは止めるとなるのは納得です。

ただ一個だけこの失敗の連続から偶然、芸術性の高い結果が生まれています。

以下の赤い岩です。

写真そっくりなLandscapeが作成出来ない時は、こういう感じの一寸地獄のような地形を再現するのもありな気がします。

後、Programming的な視点からLandscapeを作成するだけでなく、Artiest的な視点から地形を作成すべきです。

3.Niagara の勉強

3.1 今年前半の作業内容まとめ

2023-01-08

Niagara Fluid Simulationの勉強をしています。

そう言えば今年はNiagara Fluid Simulationの勉強をすると決めたんでした。

勉強に使用できる教材がなくて結局諦めたんでした。

こんな良い事言っていました。

これが勉強する教材が無くてすぐに挫折する事になるとは思いもよらなかったです。

以下のようにVersionが更新されたらCollusionを管理する機能が無くなってしまったみたいな問題についても詳しく検証していました。

これ見た時、Epic Games社もこれからProgrammerのリストラしそう。と思ったのを思い出しました。

どうせリストラされるなら真剣にVersion Upするなんて馬鹿らしいですからね。

この当たってほしくない予測はしっかり当たってしまいました。

Unreal Engine Public Roadmapの5.3 [1]を見ると

がありますが、

Unreal Engine Public RoadmapのForward Looking [2]の方には無いです。

これはやっぱり開発中止に追い込まれたみたいですね。

2023-01-15

まだCollisionするための設定を探しています。

結局分からなかったです。

後以下のハチミツのSimulationの作成方法を勉強していました。

2023-01-22

先週勉強したハチミツを実装していました。

2023-01-30

久しぶりにCGHOW氏のTutorialの勉強をしています。

以下のEffectの作成方法を勉強しました。

もうCGHOW氏は実装方法は無料では公開しなくなってしまいました。

この私の勉強の記録も無料で手に入る資料としては、今ではかなり貴重な内容になっています。

2023-02-06

先週勉強した黒い雨のEffectを実装しました。

何て言うかCGHOW氏はVFXを作成するためのProgrammerとしての技術は凄いんですが、VFXを作成するArtistとしての才能が無いんです。

何でこのEffectが必要なのか?とかこのEffectはどんな情報をPlayerに送っているのか?とか全然考えていないんです。

ので実際のGameのどこにこのEffectを使用すべきなのかが検討つかないんです。

だから最初は凄いと思うんですが、その後が続かないんです。

2023-02-13

今度は以下の蝶々のEffectの勉強していました。

2023-02-19

その蝶々の実装をしていました。

全部は終わらなくて途中まで実装しています。

2023-02-26

完成しました。

2023-03-06

まだ蝶々のTutorialを勉強しています。

2023-03-13

Level Sequenceを使用したEffectの作成方法の勉強をしていました。

2023-03-20

実装しました。

2023-03-27

以下のEffectの作成方法を勉強しました。

なんか、まあ簡単な勉強って感じで例えば時分でEffectを作成するとかの意気込みは無いですね。

Blogには筋トレって感じでやっている。って書いていました。

そうまさしく筋トレしているって感じです。

2023-04-10

実装した結果です。

2023-04-17

以下の実装方法について勉強しました。

2023-04-24

実装しました。

2023-05-01

以下のイスが溶けて砂になるEffectを勉強しました。

これ勉強するのは何回目かですが今もってどうやっているのかは覚えていません。

2023-05-08

実装しました。

2023-05-15

このEffectの勉強をしていました。

2023-05-22

先週勉強した内容を途中まで実装しています。

2023-05-28

やっと完成ました。

2023-06-04

以下のEffectを作成するための勉強をしました。

2023-06-11

お休みしています。

2023-06-19

実装しました。

結構いいですね。

3.2 今年前半部分の感想・まとめ

結構真面目にCGHOW氏のTutorialを勉強していました。

今となってはCGHOW氏のTutorialは無料では見れなくなってしまったので残念ですが、これからは自分でEffectを作成すべき時期に来たと思うようにもなって来ました。

来年、何をやるかは来年の一月に考えますがNiagaraの勉強は一区切りつけたい。と思います。

後、Simulationに関してはUE5.4にまだSimulationが残っているかどうかを見てこれから勉強するかを決める事にします。

4.Materialの勉強

4.1 今年前半の作業内容まとめ

2023-01-08

以下のキラキラ光る雪の表面のMaterialを作成しました。

この辺は、Materialの勉強というよりMaterialに使用するTextureを作成するためのGimpの勉強が主でした。

TutorialではPhotoshopを使用しているため自分でやり方を見つけるそして操作方法も同時に勉強するで結構大変でした。

Atmosphere Sun Light Vectorノードを使用するとMaterial内でDirectional Lightの方向を知る事が出来る事も学びました。

2023-01-15

サイズの違うAssetでもそのAssetに使用されているTextureのSizeは均一になるMaterialの作成方法を勉強しました。

以下のImageではSizeの違う同じAssetの岩を結合しています。

その境目は全く分かりません。

これはMaterialに使用されているTextureのSizeがそのMaterialを使用しているStatic MeshのSizeによって変化しないからです。

2023-01-22

先週勉強した岩のMaterialを作成するためにGIMPでRGBA Channelの使用方法を勉強しています。

2023-01-30

前にやったキラキラ光る雪のMaterialに使用したTextureも作り直していました。

更に岩のMaterial用のTextureも作成しました。

ここでGIMPの使用方法を勉強するのにChatGPTを始めて使用しました。

2023-02-06

雪と岩のMaterialを作成しました。

岩のMaterialの作成は最後まで終わらなかったです。

2023-02-13

岩のMaterialを最後まで完成させました。

完成させたんですが、Sizeを変えた岩を結合すると上記のように境目が簡単に分かると書いてありました。

つまりどっか間違えているって事です。

でもこれで完成にしてしまっていました。

2023-02-19

以下のように雪が積もった岩のMaterialを作成するための勉強をしました。

2023-02-26

雪が積もった岩のMaterialを実装しました。

綺麗に出来ています。

2023-03-06

氷のMaterialの作成方法を勉強しています。

これこそ氷って感じです。

一般的な氷のMaterialって

こんな感じの氷を表しています。

しかし私がImageする氷は

以下のような

透明で白いMaterialのものです。

2023-03-13

更に氷のMaterialを進化させています。

結果です。

透明が無くなった結果、石のようになってしまいました。

2023-03-20

今度は自分で氷のMaterialを作成しています。

最終的には以下のようになりました。

2023-03-27

今度は金属のMaterialを作成しました。

2023-04-10

皮膚のMaterialを作成していました。

2023-04-17

更に以下の3つの皮膚のMaterialを作成しました。

更に車の塗装の表面のMaterialの作成方法も勉強していました。

こっちは車のパーツの表面でしょうか?

これって5.3で装備されたSubstrate機能と同じ効果を出していますよね。

どうやって作成したのか全く覚えていません。

作成方法まで復習していたら全部のBlogを見直す事が出来なくなるので深堀するのは止めておきますが、興味深いMaterialです。

2023-04-24

先週勉強した内容を実装しています。

2023-05-01

この週だけはRender Bucket氏のTutorialを勉強しています。

Substrateの使用方法とGemのMaterialの作成方法について勉強しています。

以下の布の質感を持つMaterialの作成方法について勉強しています。

次はPlasticな球の質感を再現したMaterialです。

これも凄いです。

で、GemのMaterialを勉強する時間は無くなってしまいました。

2023-05-08

先週の続きでGemのMaterialの作成方法について勉強しています。

この中に氷のMaterialも作成していますが、あんまり氷っぽくないです。

2023-05-15

やすりか何かで金属の表面に細かい傷をつけた感じのMaterialの作成方法について勉強しています。

2023-05-22

Eye Shaderについて勉強していました。

更にMeta Humanを少しだけいじっています。

めちゃくちゃがんばって作成した結果がこれです。

全然美人じゃないです。

Meta Humanが日本で人気が出ない理由がよく分かりました。

2023-05-28

今度は髪の毛のMaterialについて勉強していました。

2023-06-04

砂漠のMaterialについて勉強しています。

CGIとは思えない質の高さです。

2023-06-11

なしです。

2023-06-19

自分で砂漠のMaterialを作成しました。

Tutorialの結果と比較するとまだまだですが、それなりに砂漠に見えます。

2023-06-26

Parallax Occlusionについて勉強しています。

4.2 今年前半部分の感想・まとめ

こうやってまとめて見直すとやっぱりBen Cloward先生のTutorialは凄いなと思いました。

勉強し甲斐のある内容でした。

完成したMaterialそのものの質も高いし、勉強した内容も深い話ばかりです。

来年もBen Cloward先生のTutorialの勉強は続けます。

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

こんなの作っていたんですね。

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

5.1 今年前半の作業内容まとめ

2023-01-08

UE5に移植しました。

普通に動いています。

更にPackagingについてもテストしています。

2023-01-15

Packagingした後のSizeを小さくするために色々ためしています。

結局、あまり小さくはならなかったです。

2023-01-22

Levelの作成をしています。

以下のように変更しました。

更にSkeletonCrew(ゾンビタイプ)のMonsterのAnimationを追加しています。

その後も結構色々な事をやっています。

2023-01-30

以下の問題を直しています。

途中まで直して終わっています。

2023-02-06

先週直せなかったBugを直しています。

魔法のEffectの追加もしています。

2023-02-13

雷攻撃のEffectを追加しました。

モンスターの攻撃Effectも追加していますね。

2023-02-19

まだMonsterのEffectを追加しています。

2023-02-26

以下の作業を行っています。

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

これ試していません。

うーん。

これやるの忘れていました。

2023-03-06

音の追加をしています。

2023-03-13

以下のEventに音の追加を行っています。

2023-03-20

使用していた音源が著作権違反の音を使用していた事が判明したのでそれを外して別な音源を探しています。

2023-03-27

効果音の追加をやっています。

2023-04-10

まだ効果音の追加をやっています。

2023-04-17

まだ効果音の追加をしています。

こんなに効果音を追加する場所があったなんてびっくりです。

2023-04-24

今度はBGMを探しています。

2023-05-01

BGMを追加しています。

2023-05-08

UIの直しについて去年の失敗の原因を考察しています。

2023-05-15

先週何でそんなにUIについて考察していたのか分かりました。

この週からUIを作り直しています。

2023-05-22

UIの機能で最も大切な操作の説明を追加しています。

以下のようにする事にしました。

2023-05-28

全てのUIに説明文を追加しました。

2023-06-04

なんかUIを直すか直さないかで悩んでいます。

2023-06-11

Packagingをして動くかどうかを確認しています。

なんか急にやる気が無くなっています。

一寸しかやっていません。

2023-06-19

PackagingしたGameを知人にPlayしてもらった内容をまとめています。

2023-06-26

これで完成となっています。

5.2 今年前半部分の感想・まとめ

これは一応完成しています。製品として公開するかどうかはともかく完成したので一応成功という事にしておきます。

ただ売れるかどうかは分からないですね。

今、YouTubeの動画を作成していますが、誰も見てくれません。

なんか人を引き付ける魅力が欠けているんだと思います。

6.Gaeaの勉強

6.1 今年前半の作業内容まとめ

2023-01-08

Andrea Cantelli氏のGaea for Beginners Seriesを勉強しています。

まだこの時はGaeaの全体像は見えてないですね。

ただこの時点で既にTutorialを作成する気はあったみたいでUIを説明するTutorialを作成しています。

2023-01-15

Andrea Cantelli氏のGaeaのTutorialの説明は既に古すぎて、今のVersionだと何をやっているのか全く分からない事が詳しく説明されていました。

それに対して私の先週まとめたUIのTutorialは今のVersionの説明でかつ分かり易くまとめてある事がよく分かりました。

更にUIの使用方法についてまとめています。

これはかなり分かり易いです。

後でUIについてまとめる必要が出てきたらこのBlogを参考にする事にします。

2023-01-22

まだUIの機能について勉強しています。

Andrea Cantelli氏のGaeaのUIの説明はその半分は今のVersionには無いUIで、勉強しても半分くらい役に立たないものです。

後、Combineノードの使用方法について解説しています。

後で、Tutorialを作成する時に参照する事にします。

2023-01-30

最初の大まかな地形を作成する所を、勉強していますね。

ここで初めて以下のような工程でNodeを組んだらいいのではないか?

と思いついています。

今、この工程を見るとLookdevがErosionの後に来ていたりしますが、この発想そのものは今のTutorialの骨子となっている部分です。

2023-02-06

Erosionを作成する工程でLookdev GroupにあるSurfaceノードを使用しています。

この辺はまだ出鱈目ですね。

更にLookDev GroupにあるすべてのNodeの機能について調べています。

今読み直すとかなり役に立つ情報が書かれています。

かなり詳しく調べて、更に実際に実装した結果についても記録してあります。

その後で使えるNodeと使えないNodeに分類したりもしています。(Foldが使えないNodeとして分類されていました。)

2023-02-13

なんとこの週はErosion GroupのそれぞれのNodeの機能について調べていました。

これ今一番知りたい情報です。

全部読みました。

うーん。

どれも聞いたことのないNode名でした。

後でGeologyの勉強でやったErosionの内容と組み合わせてどのNodeの使用方法を覚えるのかを決定します。

2023-02-19

Erosion Groupにある15個のNodeを整理しています。

後、手順を新しく作成し直しています。

2023-02-26

先週考えた手順にしたがって以下の地形を作成しました。

後、Geo-Primitives GroupのNodeの機能なんかもまとめていました。

2023-03-06

今度はGaeaの色を追加する方法について勉強しています。

その中でMaskingするためにData GroupのNodeを検証・整理しています。

ここで更に貴重な実験をしています。

UE5で以下のMaskを

以下のMaterialに使用すると

以下のようになります。

これを理解しておかないとColoringにおける正しいNodeの組み方を理解する事が出来ません。

2023-03-13

先週の実験結果が衝撃的すぎて、今まで起きた事をまとめて直そうとしています。があんまり上手く行ってないです。

2023-03-20

まだこの時期は正しいColoringのNodeの組み方が分からなくて、Data GroupにあるTexture TypeのNodeがどんな役に立つのか理解していません。

このTexture TypeのNodeを前にして使用出来ないと書いてありました。

今、全部を理解した状態で思うのは、

ここに書かれている内容は結果的には間違っていましたが、この間違った結果に到達するために一生懸命頑張ったら今正解に辿り着けたという事です。

なんか不思議な気持ちです。

後、ここにはAzimuthについて分かり易い解説がありました。

これはいつかTutorialに採用したいです。

2023-03-27

まだTexture系のNodeの機能について文句を書いています。

Gaeaにおける色の塗り方が分からないと悩んでいます。

2023-04-10

ここではGaeaにおける色の塗り方とUE5における色の塗り方の違いについてまとめています。

2023-04-17

UE5のLayerを作成する時にNon Weight Blend Layerを選択したら問題が解決しないかとか悩んでします。

後はRender Bucket氏のBlenderを使用した地形の作成方法のTutorialなんかも試しています。

2023-04-24

Water Groupの使用方法について勉強していますね。

途中でKlaus氏のTutorialの勉強に代わってしまいました。

一応、そのTutorialの中でWater GroupのSeaノードとRiverノードの使い方を勉強しています。

後、ここで正しいColoringのためのNodeの組み方を理解します。

<2023-05-01>

正しいColoringのためのNodeの組み方について復習しています。

ここでやっとData Group内にあるTexture系のNodeの使用方法を理解しました。

2023-05-08

もう一回Data Groupのノードについてまとめ直しています。

2023-05-15

今までの勉強内容をまとめています。

そしてやっぱりGaeaの使用方法を理解するためにはある程度のGeologyの知識が必要だと結論になっています。

Hawaii大学のGeologyの講義を見る事にしました。

2023-05-22

どうやってGaeaのTutorialを作成するのかについてまとめています。

2023-05-28

Hawaii大学のGeologyの講義を勉強しています。

最初のLectureを勉強しました。

後、どうやってTutorialを作成するのかについても検証考察していました。

2023-06-04

Hawaii大学のGeologyの講義の四番目のLectureを勉強しています。

Mineralについての勉強でした。

2023-06-11

Igneous Rocksについて勉強していました。

2023-06-19

Magmaがどこから来ているのかについてのLectureを勉強しています。

2023-06-26

VolcanoについてのLectureを勉強しています。

6.2 今年前半部分の感想・まとめ

結構内容が濃かったです。

Geologyの勉強を始めてしまったのでGaeaのまとめは中途半端な状態になってしまっています。

とは言えGeologyの勉強も大切なのでこれは仕方ないです。

ただGeologyの講義の内容量が多すぎで頭の理解が追い付いてなかったです。

Gaeaで必要な専門用語とそうでない専門用語の区別がついてないです。

6.Houdiniの勉強

6.1今年前半の作業内容まとめ

2023-01-08

HoudiniのInstall方法のまとめとか書かれていました。

後、どのTutorialで勉強するのかを検討しています。

2023-01-15

FOUNDATIONS | OVERVIEWというTutorialを勉強しています。

このTutorial Seriesは本当に初めてHoudiniを弄った人向けのTutorialでした。

があんまり楽しくなかったです。

2023-01-22

Tool Barの操作方法などをまとめていました。

後、以下の画面の名前を初めて紹介したのもここでした。

2023-01-30

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

なんか色々やっていますが、今読んでも何を勉強しているのかあんまり分かりませんね。

2023-02-06

を作成していました。

2023-02-13

公式のTutorialであるFOUNDATIONS | OVERVIEWのWorking with Nodeの続きをやっています。

以下のようにNodeの色や形状を変化させる方法も勉強していました。

2023-02-19

公式のTutorialであるFOUNDATIONS | OVERVIEWのWorking with Nodeの続きをやっています。

以下のように一部のPolygonだけを選択する方法なんかを勉強していました。

2023-02-26

以下のように部分だけ選択する方法を勉強していました。

2023-03-06

以下のようにCupが割れるAnimationを作成しています。

この週は途中で終わっています。

2023-03-13

完成しました。

2023-03-20

Tool Workflowを勉強しています。

こんなの作成しています。

2023-03-27

もう一度作り直しています。

2023-04-10

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

ああ。

やっと意味が分かった。これFOUNDATIONS | OVERVIEWと言うTutorial Seriesの内のTransform Objects and Geometryを勉強していたんです。

それぞれのTutorialのどこを勉強しているのかBlogに書かれてなかったです。

このTutorial Seriesあんまり好きじゃないのでこれをきちんとまとめる必要性を感じませんので、まあ良いです。

2023-04-17

「11. Transform Objects and Geometry」の続きを勉強しています。

2023-04-24

FOUNDATIONS | OVERVIEWの復習を行っています。

2023-05-01

FOUNDATIONS | OVERVIEWの復習の続きをやっています。

前週とこの週のまとめを見れば、今までの勉強内容はだいたい理解出来そうです。

今、一生懸命まとめなくて良かったです。

2023-05-08

YouTube上の動画を見てその内容をまとめています。

Houdiniを使用してUE5のためのLandscapeを作成している会社の発表ですね。

実際の地形を飛行機から測定してそれをHoudini内で3D dataに変換しています。

その後、Houdiniに付属のGaeaの機能を使用して3Dモデルの精度を上げ、最終的にはUE5内でLandscapeとして生成していました。

2023-05-15

ここで初めてUE5にあるProcedural Content Generationの存在に気が付きます。

これを使用したら別にHoudiniを勉強しなくてもProceduralな地形の生成が出来るじゃないかと、なって急遽こっちを勉強する事に変更しました。

Free Time Coder氏のUnreal PCG Tutorialを勉強する事にしました。

2023-05-22

Unreal 5.2 Preview PCG Tutorial - Part 1 – Basicsを勉強しています。

以下のLandscapeの作成方法を勉強しました。

2023-05-28

Unreal 5.2 Preview PCG Tutorial - Part 1 – Basicsを実装しています。

最終的には以下のようになりました。

結構凄いですね。

2023-06-04

Unreal 5.2 Preview PCG Tutorial - Part 2 – Splinesを勉強しています。

こんな感じに森に道路が走っていてその部分だけPointsが生成されないCaseをどうやって実装するのかについて勉強していました。

2023-06-11

Unreal 5.2 Preview PCG Tutorial - Part 2 – Splinesを実装していました。

こんな感じです。

2023-06-19

Free Time Coder氏のUnreal PCG Tutorialを勉強しています。

この週ではUnreal 5.2 Preview PCG Tutorial - Part 3 - Scattering Pointsを勉強していました。

こういうPointの周りにPointを発生させる方法です。

2023-06-26

Unreal 5.2 Preview PCG Tutorial - Part 3 - Scattering Pointsを実装しています。

こんな感じです。

6.2 今年前半部分の感想・まとめ

まあ、Houdiniの勉強はまだ始めたばっかしなので成果が出てるかどうかを見るのは早すぎます。

こんな感じでダラダラ勉強を続けて、その内何か作成出来るかどうかを考える事にします。

7.UEFNの勉強

7.1 今年前半の作業内容まとめ

2023-01-08

なし。

代わりなのかVolumetric Cloudの勉強なんかしています。

2023-01-15

この週もVolumetric Cloudの勉強していました。

2023-01-22

この週もVolumetric Cloudの勉強していました。

2023-01-30

この週もVolumetric Cloudの勉強していました。

2023-02-06

この週もVolumetric Cloudの勉強していました。

2023-02-13

この週もVolumetric Cloudの勉強していました。

2023-02-19

この週もVolumetric Cloudの勉強していました。

2023-02-26

この週もVolumetric Cloudの勉強していました。

2023-03-06

何と、Volumetric Cloudの使用方法をまとめたTutorialの動画を作成するためにDavinci Resolveの使用方法を勉強していました。

2023-03-13

Davinci Resolveの使用方法を勉強していました。

今、読み直すと当たり前に使えている機能の使用方法を勉強していました。

ここでDavinciの使用方法を勉強したんですね。

2023-03-20

今度はPCの画面の録画方法について調べていました。

2023-03-27

ここで初めてUEFNについて知りました。

そしてUEFNがどういうものなのかを調査していました。

2023-04-10

Unreal Senseiが別アカで作成したUnreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course!と言うTutorialがある事が分かりました。

これを勉強しています。

2023-04-17

  この週からUEFNの勉強をやると書いていますが、実際は別な動画を作成しただけでした。

2023-04-24

Functional Programming(関数型プログラミング)について勉強しています。

これはVerseがFunctional Programming(関数型プログラミング)を進化させた言語だとわかったからです。

結論を今ここで書いてしまうと、実際はVerseはOOPで書く事が出来るので別にFunctional Programmingを勉強する必要はありませんでした。

2023-05-01

Functional ProgrammingであるVerseを勉強するためにThe Verse Programming Language | GDC 2023を見ていました。

2023-05-08

先週の続きを勉強しています。

2023-05-15

Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course!を勉強していました。

2023-05-22

Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course!を実装しました。

2023-05-28

Unreal Editor for Fortnite Beginner Tutorial - UEFN Starter Course!の実装の続きをやっていました。

下の島まで作成しました。

2023-06-04

以下の滝の地形を作成しました。

2023-06-11

以下のところまで作成しました。

2023-06-19

以下の部分まで作成しました。

2023-06-26

銃が使用出来るようになりました。

以上でした。

7.2 今年前半部分の感想・まとめ

UEFNに関しては、本当に最初のTutorialを勉強しただけでした。

この後にやるPi Equals Three氏のTutorialをやり始めてやっとVerseやUEFNについて理解し始めたのでまあ、この辺の勉強はまだ準備体操みたいなものです。

8.DirectX12の勉強

8.1 今年前半の作業内容まとめ

2023-01-08

OlympusMonsTutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window を勉強しています。

今までの勉強内容の復習を復習してまとめていました。

2023-01-15

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

HLSLシェーダーの魔導書は勉強していません。

2023-01-22

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

HLSLシェーダーの魔導書は勉強していません。

2023-01-30

OlympusMonsTutorials氏のTutorialとDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

DirectX 12の魔導書とHLSLシェーダーの魔導書は勉強していません。

2023-02-06

OlympusMonsTutorials氏のTutorialとDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

DirectX 12の魔導書とHLSLシェーダーの魔導書は勉強していません。

2023-02-13

OlympusMonsTutorials氏のTutorialとHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

DirectX 12の魔導書は勉強していません。

2023-02-19

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

この週は全部のTutorialを勉強していました。

2023-02-26

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

この週も全部のTutorialを勉強していました。

2023-03-06

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

この週も全部のTutorialを勉強していました。

2023-03-13

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

この週も全部のTutorialを勉強していました。

2023-03-20

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

この週も全部のTutorialを勉強していました。

ただし一つのTutorialにかける時間が凄く短くなっています。

2023-03-27

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

この週も一応全部のTutorialを勉強していました。

ただしDirect3D 12 ゲームグラフィック実践ガイドに関しては先週の復習だけやって終わっています。

2023-04-10

この週も一応、全部勉強しています。

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドの全部をです。

2023-04-17

この週も全部勉強しています。

2023-04-24

この週も全部勉強しています。

2023-05-01

この週も全部勉強しています。

2023-05-08

この週も全部勉強していますが、Direct3D 12 ゲームグラフィック実践ガイドは本当に一寸しか勉強していません。

2023-05-15

この週はDirectXの勉強はお休みしています。

2023-05-22

OlympusMonsTutorials氏のTutorialとDirectX 12の魔導書の勉強とHLSLシェーダーの魔導書、そしてDirect3D 12 ゲームグラフィック実践ガイドを勉強しています。

ただしそれぞれ一個だけ新しく学んで終わりにしています。

2023-05-28

この週も全部勉強しています。

この週は週の始めにDirectXの勉強をしていました。

2023-06-04

この週も全部勉強しています。

2023-06-11

この週も全部勉強しています。

2023-06-19

この週も全部勉強しています。

ここでやっとOlympusとHLSLの魔導書の勉強は中止する事を決意しました。

この決定はもっと早く行うべきでした。

2023-06-26

なし。

この週は勉強していません。

8.2 今年前半部分の感想・まとめ

一日で、DirectX12の何を勉強したのかを具体的にまとめるのは不可能なので、どの教材で勉強したのかだけをまとめました。

結局、今の時点で有効なDirectX12の教科書は「DirectX 12の魔導書の勉強」だけです。

つまり他の教科書で勉強するのは無駄だったという事です。

特にDirectX12はそれ自体の勉強をする以外にWin32とかVisual Studioの環境設定とかの勉強もする必要があり、これらの設定がそれぞれの教科書によってバラバラです。

そういう周辺の勉強に時間を大きく取られて、実際のDirectX12の勉強に入る前に膨大な時間が掛かります。

つまり役に立たない教科書で勉強を始めてしまうと、そういう周辺の意味のない部分の勉強に時間の大半を取られて、やっとDirectX12の勉強を始めたら意味が分からない。という事態に陥ってしまうというかなり最悪な学習環境になっています。

この辺の情報を得られただけでもDirectX12の勉強は有効だったと思います。

9.まとめと感想

なし。

来週もまとめを行います。

10.参照(Reference)

[1] Unreal Engine Public Roadmap Unreal Engine 5.3. (n.d.). Unreal Engine Public Roadmap. https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/tabs/88-unreal-engine-5-3

[2] Unreal Engine Public Roadmap Forward Looking. (n.d.). Unreal Engine Public Roadmap. https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/tabs/94-forward-looking

 

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

1. 今週の予定

1.1 今週の予定

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

<Landscapeの作成>

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

Niagara の勉強>

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

Attribute Spreadsheetの使い方を調べてNiagara内でのParameterの値の変化を調べます。

<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 Metaverse、VR、AR、そして3D Gameの終わり

今年の前半で一生懸命勉強していたGame用のLandscapeの作成を急遽中止して映像作品用のLandscapeの作成の勉強に切り替えました。

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

それは先週OpenAIの騒動を調査して投資家観点から見て何故Metaverse、VR、AR、そして3D Game(これらを一括してMetaverse関連と呼びます。)に投資のお金が集まらないのかがよく分かったからです。

<Metaverse関連産業を滅ぼす無知なGame系YouTuber>

高収入で投資する余力のあるいわゆる投資家とよばれる人達は普段からBusinessに忙しいためGameをPlayする事はありません。

投資家からお金を預かり運用する人達は投資家からの信用を得るために通常は大学教授などの専門家の見解を重要視します。

この通常なら大学教授が担当すべき部分をMetaverse関連の投資に関してはGame系YouTuberが専門家になって行っています。

しかし実際は3日間Gameで遊べばGame系YouTuberに成れるので専門家もクソもないんです。

本来ならその時点で投資家は運用会社の担当者に文句を言うべきなんですが、彼らは普段自分でGameをPlayしないのでそれに気が付きません。

更に文句を言うためには投資家は自分で実際にGameをPlayしたりする必要があります。これはやりたくないのであまり文句を言う事もありません。

この構図が無知なGame系のYouTuberがこの分野の専門家として過剰な評価につながっている一因になっています。

AIの場合だったら例えにわか専門家でもLarge Language ModelやArtificial General Intelligenceとかの概念をしっかり勉強する必要があり、更に自分でCodeを書いて実装して確認する必要も出て来ます。

この専門家としての基礎知識という部分がMetaverse関連の専門家には完全に抜けているんです。

2020年頃Meta社からQuest2が発売された時、Game系YouTuberはそのGraphicsがまるで2000年頃の任天堂のGameみたいだと嘲笑しました。

しかし仮想空間内で数百人が集まる事が前提のVRとテレビ画面で2人で遊ぶ事が前提の2000年頃の任天堂のGameを同じ土台で比較する事は無意味です。

本来なら専門家としてCommentを求められたGame系のYouTuberがそれを言うべきなんですが、彼らは何とその素人の意見をそのまま専門家の意見として発言してしまいました。

これで実際は結構な技術革新があったQuest2は世間から全く評価されずVRのブームは終わってしまいました。

日本でもUE5でコツコツGameを作成していた個人がその作品を公開したらGame系YouTuberから総叩きされる事件がありました。

彼が大手の会社から1000万円を支援されているにも関わらずこんなGameしか作成出来ないのか。と凄い勢いでGame系YouTuberは彼の事を叩いていました。

しかし現在のGame制作の実情を知っていれば1000万円程度貰っても何も出来ません。

実際今のGameは10億20億かけて初めてまともなGameとして完成します。

予算が全く無い中で作成しているIndie Gameを10億とかかけて作成しているGameとをまともに比較して批判していました。

このような無知なGame系YouTuberの発言を専門家からの指摘を持ち上げる風潮が、投資家からのMetaverse関連への投資を避ける大きな要因になってます。

<Meta関連から逃走するProgrammer達>

Meta関連を避けているのは投資家だけではありません。

優秀なProgrammerも同じです。

DirectX12を直接叩けるProgrammerはProgrammer全体でも極一部です。

3Dの仮想空間をProgrammingで表すには大学理系Levelの数学の知識が必要な上、今になってはほとんどのProgrammerが難しすぎて勉強したがらないC++がMainの言語になっているからです。

このProgrammerの中でも最も有能な人達をたった3日勉強すれば成れるGame系YouTuberが上の立場からその成果物を猛烈に批判するんです。

しかもその批判が的を射ているならまだ納得するかもしれませんが、前に説明したような事情を全く知らない消費者と同じ意見を専門家の立場として発言します。

こんなの現代の文化大革命ですよ。

既に有能なProgrammerは別分野に専門をShiftしてしまいました。

そして今回のAI騒動です。

GPTsに代表されるLLMから作成されたAIの応用は無限に存在しています。

ほとんどの分野はまだAI化していません。

これから更に3D Graphics系のProgrammerはAIに移動していくでしょう。

つまりもうこれからGameを作成しようとか、VR関連の研究を頑張りたいというProgrammerは出てこないという事です。

<美人を軽視した無能アメリカ人デザイナーたち>

3D Gameがヒットするためには美男美女の3D Modelの力を借りるしかないです。

この時、それに待ったをかけたのがアメリカ人の3Dデザイナーたちでした。

彼らは異様なまでに美人という概念を拒否してひたすら不細工なキャラクターを作成し続けました。

そしてアメリカ産のGameは不細工なキャラで埋め尽くされる事になり、誰もPlayしなくなってしまいました。

日本のGameが美男美女しか登場しないのはしっかり理由があったんでした。

しかしそういう現実を突きつけられてもアメリカ人の3Dデザイナーは日本のサブカルな3Dデザインを学ぼうとはしませんでした。

その結果もうアメリカではどうやったら美人が作成出来るのが分からなくなってしまったんです。

2.2 Meta関連で生き残る、これから伸びるのは映像だ

このようなMeta関連の事情を知った上で、それでもこれから伸びる可能性が非常に高い分野があります。

それは映像関連です。

映画にしろStudioの映像にしろ、CGはこれから非常に簡易にそして低価格で作成する事が出来るようになって来ます。

そこに3D Graphicsの未来があります。

特に鳥瞰図から一気に人に近づくようなCamera WorkをCGIで作成するにはUE5が必要になるはずです。

来年はこれを実現させるための実装とそのための研究をやる事にします。

そしてUE5の機能を精一杯活用するためにRenderingはPhoto-Realisticに統一します。

3.Niagara の勉強

今週はAttribute Spreadsheetの使い方を覚える事に全力を注ぎます。

これのやり方を覚えないとNiagara SimulationのDebugが出来ません。

3.1 Attribute Spreadsheetの使い方を調べる

Unreal Engine 5で学ぶビジュアルエフェクト実装を読み直したらAttribute Spreadsheetの開き方が載っていました。

これをまず試します。

Niagaraを開きます。

Windowを選択し以下のBoxを表示します。

Attribute Spreadsheetを選択します。

む、私のNiagaraにはAttribute Spreadsheet(Legacy)とAttribute Spreadsheetの2つがありますね。

両方開いてみます。

Attribute Spreadsheet(Legacy)です。

何のDataも表示されていません。

Attribute Spreadsheetです。

こっちは完全に空です。

教科書に使用方法が載っていました。

これを試します。

まずDebugしたい位置までTime Barを移動するそうです。

しました。

ここでAttribute Spreadsheetを開くそうです。

開いた2つの種類のAttribute Spreadsheetを閉じます。

Attribute Spreadsheetを開き直しました。

結果です。

特に何も変化しませんね。

測定したいEmitterを選択します。

しました。

Captureを押します。

何の変化も起きないです。

Attribute Spreadsheet(Legacy)も試しましたが同じでした。

教科書だとこの後でParticle GPUを押しています。

うん。

Particle。

あ、これ魚のSimulationの時のだ。

試しに魚のSimulationでやってみます。

Attribute Spreadsheet(Legacy)が既に開いていました。

お、普通にAttribute Spreadsheetが表示されました。

Attribute Spreadsheetを開いてみます。

こっちも普通に表示されています。

Sample CodeのLife of Gameでも試してみます。

普通に表示されました。

Particle UpdateやParticle Spawnは何も表示されませんでしたが、これはこのNiagara SimulationにはそもそもParticleが無いから当たり前です。

Attribute Spreadsheetでは何も表示されませんでした。

三本線から以下のBoxを表示して

System Instanceを選択すると

以下に示した様にEmitterのInstanceの値だけ表示されるようになりました。

私のProjectで同様の事を使用としたら

そもそもSystem Instanceが存在していませんでした。

更にSample CodeのSystem Ageの値を見ると

Timelineの値とほぼ同じ値を示しています。

このParameter自体が存在しないとなると

私のProjectが動かないのはNiagara System自体に何か欠陥があって動いていないと考えられます。

となると別なNiagara Systemを使用して最初から作成し直せばきちんと起動するGame of Lifeが作成出来るという事になります。

私のProjectに新しいEmitterを配置して

そのAttribute Spreadsheetをみてみました。

まずLegacyの方ですが以下のように綺麗にそれぞれのParameterの値が表示されています。

Legacyではない方も最初は何も表示されていませんが、三本線からSystemを選択すると以下のような値が表示されました。

System.Ageの値を見ると

Timelineとほぼ同じ値を示しています。

3.2 Game of Lifeを再実装する

今度はこのEmitterを使用してもう一回Game of Lifeを実装してみます。

Attribute Spreadsheetは表示したままにしておき、今度はいつ個別のParameterのDataが見えなくなったのかを特定します。

まずPropertiesを選択して

設定を以下のように変更しました。

Attribute Spreadsheetの結果を見てみます。

きちんとDataが表示されています。

Materialは前に作成したものをそのまま使用します。

Render SectionにあるSprite Renderer Moduleを選択します。

Materialに前に作成したMaterialをセットします。

Attribute SpreadsheetのDataは普通に表示されていますが、Preview画面が以下のようになりました。

念のためにSample CodeについていたMaterialでも試しておきます。

同じ結果になりました。

Source Modeの値をEmitterに変更しました。

Preview画面に以下のImageが表示されるようになりました。

Attribute SpreadsheetのDataも普通に表示されています。

Tutorialではこの次はParametersにRender Target型のParameterを作成しています。

このParameterは既に作成しています。

これをそのまま使用します。

次にGrid2D Collectionを作成していますが、これも既にあるのを使用します。

Emitter Spawn Sectionに[EMITTER]Render Targetと[EMITTER]Grid2D Collectionを追加しました。

この状態でAttribute Spreadsheetを見るとDataがしっかり表示されています。

今度は新しいScratch Pad Moduleを作成します。

これはSet Grid 2DCells Ver2と言う名前にしました。

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

これで[EMITTER]Render TargetをSprite Renderer Moduleの以下の場所にセットしています。

この時点でもAttribute Spreadsheetは普通にDataを示しています。

ここから不要なModuleを消していきます。

消しました。

この時点でのPreview画面です。

近づいたらこんな画面になっていました。

前回やった時はそもそもこの画面が表示されてなかったのでやっぱりEmitterに何か問題があったんでしょうね。

Attribute Spreadsheetです。

今度はParameterである[EMITTER]Texture Sampleを追加します。

これも前に作成したのをそのまま使用します。

Parameterには以下のTextureをセットしました。

Preview画面には変化はありません。

新しいGeneric Simulation Stage Settingsを作成します。

以下の条件で作成しました。

このStage(Section)にScratch Pad Moduleを追加します。

名前は

以下のような実装を組みました。

はい。

この時点でもAttribute SpreadsheetはDataを表示しています。

更にPreview画面も変わらずImageを表示しています。

今度はMain Logicの計算をするStageを作成します。

Solve Sectionを作成しました。

設定は以下のようにしました。

そしてこのSectionに新しいScratch Pad Moduleを追加しました。

名前はSolveにしました。

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

次にこの計算結果をRender Targetに書き込むためのScratch Pad Moduleを作成します。

次はRender Targetに結果を書き込むためのScratch Pad Moduleを追加します。

中の実装です。

Preview画面が以下のように変化しました。

ただしAttribute SpreadsheetにはParameterの値は表示されています。

教科書ではこれでGame of LifeのAnimationが始まるとかいてありましたが始まりません。

あ、Timelineの再生ボタンを押すのを忘れていました。

押します。

おお、動きました。

感動です。

3週間位かかりましたが諦めずにやってよかったです。

やっとGame of LifeのSimulationが完成しました。

4.Materialの勉強

4.1 Local Volumetric Fog - Advanced Materials - Episode 23 [1]を実装します

先週勉強したTutorialを実装します。

まずLevel上にCubeを配置します。

このCubeにセットするMaterialを作成します。

名前はM_LocalVolumetricFogにします。

Result NodeのMaterial DomainとBlend Modeを以下のようにセットします。

このMaterialを先程Level上に配置したCubeにセットします。

そしてExponential Height Fogの

Volumetric FogをEnableします。

結果です。

Scattering Distributionの値を変更しましたが変化は無いです。

この辺はMaterialの実装が終わってから確認します。

次に以下の部分を作成しようと思ったら

Object Local Boundsノードがありません。

いやあるにはあるんですが以下のNodeしかないです。

調べると

これのExtentsとLocal Bound Sizeの値が一緒っぽいです。

このNodeを試しに使用してみましょう。

以下のように実装して

その結果をLevel上で確認します。

色が薄いですが、出来ています。

その結果に以下の実装を足します。

結果です。

うーん。

丸くなっている?

薄くて分かりません。

のでEmissive ColorにもAlbedoにつなげた結果を繋げました。

結果です。

2.0の時です。

1.4の時です。

確かに四角になっています。

Unreal Engineの単位はcmなので100で割ってmに直します。

そしてFogの上部の形状の作成を行います。

結果です。

Fogが薄すぎて出来ているのかどうかわかりません。

CubeのSizeを大きくしたら見えやすくなるのではないのかと思い10倍にしてみました。

ドンピシャです。

Fogが波打っているのが確認出来ます。

更に細かい波を追加します。

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

結果です。

正直細かくなっているのかどうか分かりません。

今度はFogの色を調整します。

はい。

Tutorialのままに作成しました。

結果です。

結構凄いです。

Sizeを小さくして今まで作成したMaterialと一緒に並べました。

中々迫力があります。

5.Gaeaの勉強

今週はErosionについてのTutorialを作成します。

5.1 Erosionの何を教えるか考える

まずErosion Groupには以下の種類のNodeがあります。

このうちの何個かのNodeの使用方法を教えるか、それとも

Erosion NodeのPropertiesの

使用方法を教えるかどっちが良いのか考えています。

両方やるべきでしょうね。

今回はErosionノードのPropertiesの使用方法を教える事にします。

どのParameterについて教えますか?

まずParameterについて教える前にErosionノードのように計算が重いNodeでは変更を適用するためには以下のApply Changesボタンを押す必要がある事の説明が必要です。

これを教えた後で、Parameterについて教える事にします。

まず以下の2つのParameterについて説明します。

どちらも値が大きくなるとSedimentの量が増える設定になっていますが、

公式のErosion [3]の説明によりますと

のようにそれぞれの設定によって微妙に表面の形状が変化するそうです。

次はDowncuttingについてです。

そもそもDowncuttingはGeologyの言葉で

以下のようになっている川の断面図が

川底が削られて

以下のように変化する事を言います。

Gaeaでは

  • Downcutting:溝を深くする
  • Inhibition:土砂を近くに配置する

と言う効果になります。

今週はこれだけ教えて終わりにします。

6.Houdiniの勉強

先週で Houdini 19 - Wall Tool 03 [4]の実装は終わったので今週はHoudini 19 - Wall Tool 04[5]の勉強を行います。

6.1 Houdini 19 - Wall Tool 04[5]の勉強をする

<Intro>

今あるPointは一ミリの狂いもなく正確に配置されています。

リアル感を出すためにこのPointの位置を少しだけRandomにばらつかせるそうです。

正直、そんなのは後から勉強すれば良いのであって、早くProceduralな壁の生成方法の全体像を教えてほしいと思いますが、現状これ以上のTutorialは無料では存在しないので我慢してこれをやります。

<Attribute Wrangle>

Attribwrangle_fixHalfBrickにAttribwrangle2を追加しました。

名前はAttriwrangle_ShuffleBricksとしています。

<Random Shuffle>

昔の城の塀を見ると塀を構成するBrickの長さはまちまちだそうです。

それを再現する一番簡単な方法はLineの上のPointsをShaffleする事だそうです。

これをすると本当にBrickの大きさがバラバラになってしまう気がしますが、どうなんでしょうか?

それはともかくAttriwrangle_ShuffleBricks内にこれを実現するための実装を書いていきます。

まず以下のCodeを書きました。

Ch(“multi”)はこれから決定するそうです。

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

両端のPointは移動させないそうです。

そのため両端のPointかそうでないかをneighbourcount()関数で判断しています。

そしてCh(“multi”)のParameterを作成します。

以下の+を押します。

すると以下の場所にParameter, Multiが生成されています。

Multiの値を変更すると以下のようになります。

そんなに激しいPointの変化は見られません。

すこしだけばらついた位でした。

うーん。

こういうのが作りたかったのね。

これならBrickっぽさが出そうです。

Codeの説明をする前にどんな風にPointをばらけさせたいのかもう少し可視化出来る形で説明してほしいですね。

この辺は私がTutorialを作成する時に改善しましょう。

<Brick Geometry>

ここからBrickのGeometryを作成するそうです。

やっと知りたい部分が始まりました。

まずLineをPoint間で切るそうです。

そのために以下に示したConvertlineノードを追加します。

すると以下に示したように

LineがPoint間で分割されました。

こういうのは習わないと絶対に知る事が出来ない技ですね。

今度はFor-Each Primitiveを追加します。

凄い以下のNodeが追加されました。

ここでDisplay FlagをForeach_Beginに付けます。

すると以下の最初のPrimitiveのみが表示されます。

<Brick Depth>

まずLineを追加するそうです。

追加しましたがForeachには繋げていません。

LineのParameterを以下のように変更しました。

Originの値はLengthの値をDragしてOriginにDropし以下のRelative Channel Referenceを選択していました。

そして-を追加して2で割っています。

Lengthの単位はmだそうです。

Brickの大きさとしてふさわしいSizeに変更しました。

Lineノードの名前を変更しました。

Line_BrickDepthとしました。

更に黄色くしました。

今度はCopytoPointノードを追加しました。

更にLine_BrickDepthノードとForeach_Begin1ノードを以下のように繋げました。

結果です。

今度はその下にSkinノードを配置しました。

これは初めて使用するNodeですね。

結果です。

おお、Line間にPlaneを作成しました。

今度はそのSkinをExtrudeします。

Polyextrudeノードを追加します。

Extrudeって何だっけと一瞬思いましたが思い出しました。

Blenderの勉強した時に習いました。

Blogを調べたら前のHoudiniのTutorialを勉強した時もPolyextrudeノードを使用してExtrudeしていました。

PolyextrudeノードのDistanceを選択して

Alt+Eを押します。

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

Distanceの値が表示されています。

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

これは以下のLine_HeightとResample_BrickRowの値を取得しているそうです。

それは分かりますが何故../が必要なんでしょうか?

更にSegsを追加しました。

Segは以下に示したSegmentのParameter名です。

CursorをHoverすると以下のBoxが表示され

SegmentsのParameterがSegsである事が分かります。

そしてBoxの右下にあるApplyボタンを押します。

結果です。

結果を確認するためにPolyextrudeの値をForeach_Endに繋ぎます。

結果です。

見にくいのでPoint#とPrimitive#を消します。

結果です。

おお、かなりBrickっぽくなってきました。

Wを押してWire Frameに変更しました。

PolyExtrudeノードのDistanceに-を追加しました。

これを見るとOriginより下にBrickが生成されています。

これを直すために-を追加したそうです。

確かに

-を追加したら原点より上にBrickが形成されるようになりました。

でも理由が分かりません。

これは来週実装する時に考える事にします。

更にOutput BackをEnableします。

塀の底に穴が開いていたのが直りました。

後Brickの色がBlueなのはFaceが逆になっているからだそうです。

それを直すためにReverseノードを追加します。

結果です。

灰色の壁が現れました。

ここでそれぞれのParameterが正常に働いているかをCheckしています。

Line_BrickDepthノードのLengthの値を変化させて

塀の厚みを変更させました。

今度はBrickSpacingノードのLengthの値を変更して

以下のように

Brickの横幅を変更しました。

ShuffleBricksノードのMultiの値を変更して

それぞれのBrickの横幅のばらつきの変化を確認しました。

更にShuffleBricksノードを黄色くしました。

黄色くするのはParameterだからだそうです。

知らなかった。

今度はBrickRowノードのSegmentの値を変更して

Brickの高さを変更しました。

以上でした。

実装は来週します。

6.2 Houdiniが起動するか調べます

そう言えば先週、以下の警告が表示されていました。

後2日でLicenseが切れると言っていました。

という事は一週間後である今日は既にLicenseが切れてるはずです。

Houdiniが動くかどうか確認だけしておきます。

普通に開けました。

先週の警告は何だんたんでしょう?

7.UEFNの勉強

今週は先週勉強したIf I Don't Drive Above 40, The Bomb will Go Off! Fortnite UEFN/Creative 2.0 Tutorial [6]を実装します。

7.1 先週の復習

まず先週勉強した内容を忘れているので復習します。

先週勉強したTutorialは40km/hで走ると爆発する車を作成していたんでした。

そしてTutorialを勉強する前にどうやって実装するかについて以下の予測を立てていました。

細かい点、例えば車や爆弾を生成するSpawnerが存在する事とかを抜かすと大体の流れはあっていますね。

後、私のSubscribe()関数の理解がまだ足りないです。

この辺はまた別途勉強し直す必要があります。

7.2 If I Don't Drive Above 40, The Bomb will Go Off! Fortnite UEFN/Creative 2.0 Tutorial [6]を実装する

<Intro>

特になし

<Basic Device Setup / Explosive / Creative prop>

Sports Car Spawnerを配置しました。

Explosive Deviceを配置しました。

Prop用のBPを作成して名前をBombPropと名付けました。

Sphereを配置します。

SphereのSizeを小さくします。

Level上にこのBlueprintを配置します。

位置は先程配置したExplosive Deviceと同じ場所にしました。

重ねたらBombPropに追加したSphereを消します。

この後、BombPropにExplosive DeviceをAttachします。

これExplosive Device のAttach toを選択するとBombPropにExplosive Deviceが追加されます。

Attach toってそういう意味でしたっけ。

まあ良いです。

新しいVerseのFileを作成しました。

名前はExploding Vehicle Speed Deviceです。

以下のConstantを作成します。

Spellがあっているのかどうかは分かりません。

更に以下の2つのModuleを追加しました。

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

まずAgentEntersVehicleEvent()関数についてです。

この関数はこの表示を見るとVehicle_Spawner_deviceのMember関数です。

Carの型であるVehicle_Spawner_Sports_Car_Deviceは以下のBoxの表示から

Vehicle_Spawner_deviceの子Classの様に見えます。

公式Siteのvehicle_spawner_sports_car_device class [7]を見ると

確かにVehicle_Spawner_Sports_Car_DeviceはVehicle_Spawner_deviceをInheritanceしていました。

更に公式Siteのvehicle_spawner_device class [8]を見ると

Dataの項目にAgentEntersVehicleEvent()がありました。

Dataの項目にあるのか

ああ私が理解したいのはこのEventとpayloadの関係だ。

このDataはArgentがVehicleに入った途端にEventを発するだけです。

となるとその後のSubscribe()関数が重要になるのか。

Subscribe()関数の使用方法に関しては公式のSiteであるSubscribe function [9]を見ましたがあまり分かり易い解説は載ってなかったです。

Subscribe()関数の使用方法を説明している3. Subscribing to Player Events [10]の方がまだ分かり易かったです。

ただこっちもどんな関数からSubscribe()関数内にパス出来るのかについての解説は無かったです。

ここで使用出来る関数はReturn ValueがVoidで更にParameterにagentがある関数だけです。

これがまず説明されていません。

更にここで重要なのはReturn ValueがVoidである必要を決定しているのはSubscribe()関数ですが、ParameterにAgentが必要なのを決定しているのはAgentEntersVehicleEventの方です。

更にここでEventの概念をきちんと説明する必要もあります。

Eventの仕組みを知らないでいきなりSubscribe()関数だけ習ったってわけ分からなくなります。

こんなのきちんと解説されなかったらみんな混乱しますよ。

まあ良いです。

Subscribe()関数の理解が足りない理由は私が勉強不足だったわけではなくてそもそもしっかり説明しているSiteがネット上に存在してなかっただけでした。

これは後で自分でVerseのTutorialを書く時に考える事にします。

以下の関数を実装しました。

この関数をパスしている訳です。

<Creating GetSpeed Function to Get Car Speed>

今度は車の速度を得るための関数を作成します。

GetSpeed()関数です。

書きにくい。

本当にPythonを使用する人達はこのCodeの方が読み易いんでしょうか?

C関連のProgramに慣れている私からすると行の最後に;が無いとなんか不完全な気がします。

更にこれらのCodeを実装するために以下の変数を作成しました。

この書き方にもまだ慣れません。

先週のBlogには

と書かれていました。

これについての解答もまだ得ていません。

<Creating Main Explosion Loop>

今度は車を爆発させる関数を作成します。

先週は以下のように書いていましたが

関数の実装を見たら違っていました。

この関数は車を爆発させる機能を持っています。

実装しました。

まずLoopとIfの後には:をつける必要がある事を忘れていました。

後40と打ったらErrorになりました。Verseでは自動でintからFloatに変換してくれないみたいです。

<Creating Function to Teleport Bomb to Car>

ここではPlayerを追いかける爆弾の機能を持つBombFollowPlayer()関数を作成します。

しました。

TeleportToを使用しただけでした。

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

Definitionを見てみます。

うーん。

みたいですね。

何でParentheses じゃなくてSquare Bracketを使用しているんでしょうか?

分らんけど調べた限り他の例でもSquare Bracketを使用していますね。

次はRotation{}です。これってStructか何かでしょうか?

Definitionを見るとそのようです。

以下の箇所にこの関数を追加しました。

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

<Final Script>

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

このSpawnの使用方法は結局分かりませんでした。

<Setting Up Device with Car, Explosive Device>

UEFNに戻って来ました。

Deviceを配置しました。

そしてDeviceのConstantにそれぞれのAssetをセットしました。

<SETTING UP EXPLOSIVE SETTINGS>

Explosive DeviceのPlayer Damageの値を200に変更しました。

Visible During GameをOffにしました。

更にCollision During GameもOffにしました。

<Final Result>

それではテストします。

またCharacterが変わっていました。

車に乗って40km/h以下に速度を下げたら爆発して死にました。

Screenshotは取れませんでした。

以下のScreenshotはその後、復活した時のです。

爆発するのが確認出来たのでGameは終了します。

7.3 久しぶりにUEFNを起動したらLEGOとのコラボがやっていた件について

やっと実施したんですか。

もうLEGOAppleやMETAと組んでEpic Gamesを叩くのは止めたみたいですね。

と言うかAppleやMETAのVRも全然ヒットしなくてLEGOもブチ切れたんでしょうね。

Minecraft並みにヒットするって聞いているのに全くお金にならなかったらLEGOも切れるでしょう。

アメリカのYouTubeのTrendに2つもLEGO Fortniteが入っていたので

それなりには期待されているみたいです。

再生回数は4.6Mか。

うーん。10Mは行ってないですね。

後はGameをPlayした時の面白さ次第ですね。

LEGOを使用してMinecraftみたいな事がどれくらい出来るのかが気になります。

8.DirectX12の勉強

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

8.1.1 Debug Layer | D3D12 Beginners Tutorial [D3D12Ez] [12]を勉強する

先週やっと Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [11]の実装が終わりました。

今週はその次のTutorialであるDebug Layer | D3D12 Beginners Tutorial [D3D12Ez] [12]を勉強します。

Tutorialの作業を以下にまとめます。

最初にDebug Layerについて分かり易い解説をしていました。

この部分の説明はかなり参考になったんですが、実装には関係ないのでここにはまとめません。

まずDebugと言う名前のFolderを追加します。

そしてその中にDebugLayer.hとCpp Fileを作成します。

DebugLayer.hの実装です。

更に以下のHeaderをIncludeしました。

更にDXDebugLayerにpublicとprivateを追加しました。

Privateに以下の変数を作成しました。

早速ComPointerを使用しています。

こうやって見るとComPointerの使用方法、理解してないですね。

このComPointerの使用方法は来週、勉強し直す事にします。

Publicの方には以下のInit()とShutdown()関数の2つをDeclareしていました。

今度はcpp fileの実装です。

現時点では以下のようになっています。

Debugしている時だけDebug Layerが働くように以下の実装を追加しました。

Init()関数に以下の実装を追加します。

この実装でDebug Layerを作成するそうです。

TutorialではここでDirectX12とそれ以前のDebug Layerの作成方法の違いなどについて解説していました。

結構詳しい解説していました。

作成したDebug LayerをEnableします。

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

Debug Interface1を得てLeak Tracking For ThreadをEnableしています。

Debug InterfaceとDebug Interface1の2つを別々にEnableしていますね。

これってどっちか一個で全部やる事は出来ないんでしょうか?

Tutorialの説明ではこれをする事でDebug Layerで発見できるBugが最大化されるからやっている。みたいな説明をしていました。

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

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

これはShutdown()関数が呼ばれた時にDirectX12でまだ生きているObjectが有ったら報告するために関数だそうですが、

この関数も色々知らないと使用出来ない特長があってそれをTutorialでは例を見せて詳しく解説していました。

これは一回見ただけでは理解出来ないです。

このTutorialは実装する前にもう一回その部分のTutorialの説明を聞いてそれをまとめ直す事にします。

まあ、進捗は遅くなるかもしれませんがそれはそれで勉強になるでしょう。

更にOutputDebugStringW()関数も追加しました。

TutorialではこのOutputDebugStringW()関数についてのTipも話していました。

X Box用のGameを開発している時の話でした。

こういうのも結構重要なので実装する時は拾ってまとめていこうと思います。

今度はMain.cppに戻りました。

DXDebugLayerを追加しました。

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

結果です。

なんとDirectX12の生きているObjectがあったそうです。

しかし全ては正常に動いているそうです。

何でこの結果からそんな事が言えるのかまだよく分かりません。

最後に以下の場所にBreak Pointを追加して

実行して

以下の結果を示す事で

本当にDebug Layerが生成されている事を示していました。

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

8.2.1 先週の復習

もう一週間経つと何をやったのか全く覚えていません。

先週のBlogを読み直したら「4.3 Vertex Buffer」の実装が終わっています。

Blogを読み直したらかなりしっかり勉強したらしく綺麗にまとまっていて何を勉強したのかすぐに理解出来ました。

「4.3 Vertex Buffer」の実装は完全に出来ていました。

ので今週は次の「4.4 Vertex情報のCopy(Map)」を読む事にします。

8.2.2 「4.4 Vertex情報のCopy(Map)」を読む

<「4.4.1 ID3D12Resource::Map()Method」を読む>

ここの最初の文章を読むと前の節で作成したVertex BufferはCPU側にあってMap()関数を使用してそのDataをGPUに移動するみたいに読めます。

これは前の節までの解説で言っていたGPU側にVertex Bufferを作成してそこにMap()関数を使用してVertexのDataを書き込むと言う説明と矛盾します。

どっちが正しいんでしょうか?

前節を読み直したら大体こんな感じの説明をしていました。

まず以下のVerticesを作成しました。

当然ですが、これはCPU側に作成されています。

で先週、最後に実装した以下のCode

CreateCommitedResource()関数がGPU側にこのVerticesと同じ大きさのMemory領域を確保する。みたいです。

そしてそこに実際にCPU側のVerticesの情報を書き込むのが今週勉強するMap()関数のようです。

これを踏まえた上で、もう一回「4.4.1 ID3D12Resource::Map()Method」の最初の文を読むと、Vertex Bufferとぶっきらぼうに述べていますが、これはGPU側の事でそういう事を前提として理解しているなら、

とはならないので

まあ、前節通りの解釈でいいのかもしれません。

教科書にはこのMap()関数の機能を一言、GPU側のVertex BufferのAddressを返す。とだけ書かれています。

最近になって気が付いたんですが、この教科書では、紹介されているほとんど全ての関数の機能をこの著者独自の言葉で簡単に解説しています。

これが非常に俊逸で、公式Siteの説明を読んでも分かったような分からないような気分になるだけですが、それとは逆にこの著者独自の言葉による解説でズバット理解出来る事が多々あります。

以下の実装で

実際にVertBuffのAddressをVertMapで取得しています。

VertBuffは先週実装したID3D12Resourceクラスから生成したObjectです。

更にこのAddressにCPU側にあるVertexの情報をPassするために

以下のCopyを使用しています。

最後にMapを解放しています。

これでCopy出来たの?

なんか予想しているより簡単でした。

<「4.4.2 Vertex Buffer Viewの作成」>

前節で作成したBufferはそのままでは利用出来ません。GPU側から使用するためにはViewを作成する必要があります。

ああ、これは三章で散々勉強しました。

そのViewの作成方法について解説しています。

正しここではその作成方法だけ説明してその後、このViewをどうやってGPU側に渡すのかについては後で教えます。で終わっています。

Buffer用のViewですがD3D12_VERTEX_BUFFER_VIEWを使用して作成していました。

公式SiteのD3D12_VERTEX_BUFFER_VIEW structure (d3d12.h) [13]を見ます。

Simpleに以下の説明がありました。

それぞれの要素についての解説です。

Structのそれぞれの要素をMemberと書いてあるんですが、これってC++全般に共通でしたっけ。

それともMicrosoft特有の呼び方?

確認します。

検索の一番最初に出て来たC++ Structures (struct)[14]を見ると

Memberになっていました。

うーん。

こんな基礎的な内容も忘れてしまったのか。それとも私が習った時とは名称が変わっているのか?

いやそれならClassの変数はどうなってるの?

Classの変数もMemberになってないとオカシイですよね。

C++ Classes and Objects [15]を見たら

なってました。

ああ、そうかClass内の関数をMember Functionと呼ぶのはここから来てたのか。

うーん。

最初にProgrammingを習った時、JavaJavaScriptだったと思いますが、Class内の変数の事をAttributeとかPropertyとか読んでいた気がします。

これも一寸調べてみます。

Java Class Attributes [16]を見るとJavaではClass内の変数の事をAttributeと言うみたいです。

ウルルア。

やっぱりあってました。

色々読み漁ったら、ClassのMemberというのは本当にクラスのメンバーという意味しかないみたいで、言語によってはConstructorなんかもMemberになるそうです。

話がかなり脱線しました。

Sample Codeを見ると以下のようにセットされていました。

え。

GetGPUVirtualAddress()関数でもVertBuffのGPU内における仮想Addressを得る事が出来るの?

うーん。

さっきのMap()関数もVertBuffのGPU内における仮想Addressを得ていたんですよね。

うーん。

これはそれぞれ使用方法に適切なやり方でAddressを抽出していると考えた方が良いのか。

以上です。

実装は来週やる事にします。

9. まとめと感想

なし

10.参照(Reference)

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

[2] Ben Cloward. (2023, April 27). Local Volumetric Fog - Advanced Materials - Episode 23 [Video]. YouTube. https://www.youtube.com/watch?v=En-VjBjto_U

[3] Erosion - GAEA Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Erosion/Erosion.html

[4] Rick Banks. (2022, June 20). Houdini 19 - Wall Tool 03 [Video]. YouTube. https://www.youtube.com/watch?v=SxZEj504muU

[5] Rick Banks. (2022b, June 20). Houdini 19 - Wall Tool 04 [Video]. YouTube. https://www.youtube.com/watch?v=AwRKrGL7DmQ

[6] Pi Equals Three. (2023, April 16). If I Don’t Drive Above 40, The Bomb will Go Off! Fortnite UEFN/Creative 2.0 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=rt_S-GfWstY

[7] vehicle_spawner_sports_car_device class. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/devices/vehicle_spawner_sports_car_device

[8] vehicle_spawner_device class. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/devices/vehicle_spawner_device

[9] Subscribe function. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/versedotorg/verse/subscribable/subscribable%28t%29/subscribe

[10] 3. Subscribing to player events. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/team-elimination-game-3-subscribing-to-player-spawn-events-in-verse

[11] Lötwig Fusel. (2023a, May 1). Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=rF30qoUFDq8

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

[13] Stevewhims. (2021, April 2). D3D12_VERTEX_BUFFER_VIEW (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_vertex_buffer_view

[14] C++ Structures (struct). (n.d.). https://www.w3schools.com/cpp/cpp_structs.asp

[15] GeeksforGeeks. (2023, April 17). C Classes and objects. https://www.geeksforgeeks.org/c-classes-and-objects/

[16] Java Class Attributes. (n.d.). https://www.w3schools.com/java/java_class_attributes.asp

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

1. 今週の予定

1.1 今週の予定

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

<Landscapeの作成>

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

Lightの配置を行います。

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の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強をやります。

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

2. Landscapeの作成

2.1 建物の内部にLightを追加する

使用しているLightをOutlinerから調べます。

以下のように使用していました。

RectLightは一回も使用した事がないです。

設定とかどうなっているんでしょうか?

公式SiteのRectangular Area Lights [2]が解説していました。

うーん。

解説を読む限り普通のLightと同じですね。

後、深さの調整Parameterは無いみたいです。

RectLight2です。

こんな所に配置していました。

一緒にあるLightは

でした。

RectLight3です。

家具の無い空き室の天井です。

天井全体とまでは行かないですがかなり大きめなSizeにして配置していますね。

ここも先程のSM_Point_Lampを使用しています。

RectLight5です。

Bathroomの天井です。

ここは天井全体に配置しています。

取りあえずここまでLightを配置してみます。

こんなRadiusがある事が分かりました。

黄色の四角のSizeを変更する方法が分りません。

もう一度DemoのLightを見てみます。

窓のSizeと黄色の枠が同じになっています。

更に、水色の半径を示すLineは以下のような巨大なSizeになっていました。

これらを調整するParameterがどれなのかよく分からないので、

以下にRectLightの全てのParameterを記録しておきます。

まずはこのParameterのDataを元にLightの形状を調整してみます。

自分で作成している建物のLevelに戻って来ました。

RectLightのParameterを比較します。

まずLightのIntensityですが、Demoの方は1.0cdになっていました。

直しました。

次にSource WidthとSource Heightが以下の値になっていました。

直しました。

おお、黄色の枠の形状が変化しました。

黄色の枠のSizeはここで調整していました。

最後の水色の線です。

これはおそらく

で調整しているんでしょう。

試します。

値を500にしました。

球の大きさが半分になりました。

あってますね。

他のParameterでDefault値から変更しているものを調べます。

無いみたいです。

以下の3つのParameterだけ調整出来たら

一応それで良いみたいです。

RectLight2です。

横から見た状態です。

Demoを見直したらこのLightはRectLight3でした。

SM_Point_Lampも配置しました。

何で私が配置したSM_PointLampは灰色がかった色しているんでしょうか?

DemoのLampは以下のように光っています。

以下のMaterialが使用されていました。

私のProjectのSM_PointLampのMaterialの設定です。

Element1のMaterialが違います。

これを直します。

前よりはましになりましたが、DemoのLampと比較するとProの絵画と子供の落書き位の差があります。

Lightの位置を少しだけ下にずらしてみました。

SM_PointLampの淡い光も観察する事が出来るようになりました。

Lightが光っている感じが出ています。

でもまだ変な感じがします。

DemoではPost Effectとかは使用してないのか確認します。

BoxReflectionCaptureが使用されていました。

BoxReflectionCaptureの機能はよく知りません。

調べます。

公式SiteのReflection Capture [3]を読みます。

うーん。

よく分からん。

取りあえず使ってみます。

黄色の線でBoxを示してるのとScreenshotで示してるPanelがあります。

BoxのSizeはこの部屋と同じにしました。

このPanelは何を表しているのかまだ不明です。

UE4 Reflection Captures - How-to Use [4]を見たらUE4の場合ですが、非常に分かり易く説明していました。

簡単に言うとReflectionある物体を配置した時でRay Tracingを使用してない時に使う必要があります。

となると今回のLampが本物っぽくないのとは関係ないですね。

他の部屋には反射する装飾品や窓などがありますので、その時にReflection Captureの機能を勉強する事にします。

その時は表面的な使用方法だけじゃなくてReflectionの何を計算するのに使用されているのかとかの理論もしっかり勉強する事にします。

DemoのLampを見るとBloomとかの設定もいじってそうです。

これは Unreal Engine 5 for Architecture - 2023 Full Beginner Course [5]の勉強に戻った時に検討する事にします。

残りの部屋のLightやLampも配置します。

急用を思い出しました。

今週のBuildingの作成はここまでとします。

3.Niagara の勉強

先週は、Game of Lifeの実装を終えたんですが、動きませんでした。

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

3.1 Bugの原因の推測

まずBugの原因として考えられるのが2つあります。

一つ目は以下に示した警告の原因が分からない事です。

これ自体は警告なのでBugの直接の原因ではないでしょうが、この原因の意味が分からないんです。

のでこれとBugが関係しているのではと疑っています。

2つ目のBugの原因と考えられるのが

これです。

この[StackContext]Stateを2回作る必要があったのは、どこかを間違えて作成した可能性があります。

とは言えこの2つはどこを直したら直るのか分からないです。

ので別な角度からBugを直す方法を考える事にします。

3.2 どうやってBugの原因を追究するか?

Bug出しをするのに全体の構成を理解しておくのは重要です。ので一回Blogを読み直すのはどうでしょうか?

後は、Debugしてどこまでは出来ているのか確認するのも手です。

そう言えばNiagaraでDebugってした事無かったです。

調べたらNiagara Debugger [6]と言うのがあるそうです。

これを読んでいる内にある事に気が付きました。

私が先週作成したGame of LifeNiagara System画面のParameterのStack Context Sensitiveを見ると

[StackContext]Stateはありません。

以下のTexture to Grid 2D Once SectionにあるTexture to Grid 2Dを開いて

以下のようなScratch Module画面になった時だけ[StackContext]Stateは現れます。

それに対してSample CodeではNiagara Systemの画面のParameterの時点で

[StackContext]Stateは表示されています。

これは最初に[StackContext]Stateを作成した時に作成方法を間違えたんです。

Textbookを見て確認します。

Textbookを見直すと、Scratch Pad WindowのParameterから[StackContext]Stateを作成する。と書かれていました。

これが間違っているはずです。

これはScratch Pad WindowのParameterからではなくNiagara SystemのParameterから追加する必要があるはずです。

これを試してみます。

Niagara SystemのParameterから[StackContext]Stateを作成しました。

Scratch Pad Module内に2つの[StackContext]Stateが作成されているかと思ったんですが、それは無かったです。

結果ですが、

何も表示されません。

それぞれのModule内における[StackContext]Stateの値がどうなっているのかを確認したいですね。

さっきのDebuggerだ。

これを使ったら[StackContext]Stateの値が確認出来るはずです。

出来なかったです。

思い出してきました。

Slove SectionにあるSolve Module内の

Custom HLSL Module内の

以下のCodeが

Stateの値を得る事が出来ないのでは?と疑問に思っていたんでした。

うーん。

でもこれも中身が確認出来ないと分からないですね。

あ、良い事思いつきました。

Sample CodeのGame of LifeをこのProjectにMigrateして動くのか確認してみます。

もしかしたらUE5.3では動かないのかもしれません。

普通に動いています。

うーん。

なんと、こうやって同じProject内でSample CodeのLife of Gameと私が作成したGame of Lifeを見比べると結構簡単に違いが判る事が判明しました。

色々見比べてみます。

はい。

まず一個違いが見つかりました。

Emitter Spawn SectionにあるSet Grid 2DCells Moduleの位置が違っていました。

Sample Codeのは下から2番目にセットされています。

更にSample CodeではSet Grid 2DCells ModuleのGrid2DCollectionにセットされているParameterは

以下に示した様に[EMITTER]Grid2DCollectionがセットされていますが、

私のは

がセットされています。

うーん。

一寸この部分をどうやって実装したのか確認します。

2023-11-12のBlogにこの部分の実装をどうやったのかが載っていました。

最初からこのように実装していました。

教科書でこの部分を確認します。

武者 拓也. Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで (pp.784-785). 株式会社翔泳社. Kindle 版.

と書いてありました。

これは読み飛ばしていました。

直します。

結果です。

まだ何も変化ないです。

他にも間違えている所があるという事でしょう。

更にSample Codeと私のCodeを比較していったらまた間違いを見つけました。

今度はSlove SectionにあるGrid2D_To_RenderTarget Module内の実装で

Make Linear ColorノードのAの値が0になっていました。

本当の値は当然1.0でSample Codeも1.0になっていました。

直します。

結果です。

うーん。

まだPreview画面には何も現れません。

まだ何かの間違いがあるはずです。

ありました。

Sample CodeのSprite Renderer ModuleのAlignmentとFacing Modeの設定は

となっていましたが、

私のは

となっています。

これも直します。

直しました。

しかしPreview画面に変化は現れませんでした。

Typoですが以下のSolve SectionのSpellがSloveになっていました。

します。

うーん。

これ以上は違いは見つかりませんね。

これ以上Bugを直すIdeaも出てこないので一端教科書のGame of Lifeの実装の部分を読み直す事にします。

前回、読んで意味の分からなかった以下の部分の灰色でハイライトした部分の意味も今なら分かります。

武者 拓也. Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで (p.793). 株式会社翔泳社. Kindle 版.

Stack Contextを使用する事で、Grid2D Collectionに新しい変数を追加出来る。って意味です。

今回はFloat型のStateという変数を追加しました。

それが以下に示した[EMITTER][GRID 2D COLLECTION] Stateの正体なんです。

ほら、

試しにこのParameterをNiagara Systemにセットして

そのDetailを見てみると

Float型のState変数が存在しています。

うーん。

そう言う事だったのか。

となると2023-11-19のBlogの以下の解釈は間違っていましたね。

Stack ContextはScopeとは何の関係もなかったです。

そもそもStack Context Sensitiveで生成したStateは[Emitter]のScopeとして生成され直しされています。

うーん。

でもまだこの辺は一寸納得出来てないです。

もう少し後で考える事にします。

Solve SectionのSolve Moduleの解説のところで

以下のように書かれていました。

武者 拓也. Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで (p.807). 株式会社翔泳社. Kindle 版.

これか

Attribute Spreadsheetの使い方を調べてDebugするのが次の工程になりますね。

うーん。

来週やる事にします。

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

4.Materialの勉強

4.1 Local Volumetric Fog - Advanced Materials - Episode 23 [7]を勉強します

今週はBen Cloward先生のLocal Volumetric Fog - Advanced Materials - Episode 23 [7]を勉強します。

まずLevel上にCubeを配置します。

そしてそのCubeのMaterialにVolume Fogをセットします。

このVolume Fogの実装をみます。

まずResult Nodeの設定です。

Material Domainの設定が以下に示した様にVolumeになっています。

更にBlend ModeがAdditiveになっています。

今度はまたLevel上に戻ります。

Exponential Height FogをLevel上に追加します。

Tutorialによるとこれを追加しないとFogは表示されないそうです。

そしてExponential Height FogのPropertiesにある以下のVolumetric FogをOnにします。

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

Scattering Distributionの値を0.6に変更します。

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

UEはUnityと違ってFall offのParameterがありません。

のでMaterialの実装でこれを追加する必要があるそうです。

以下の実装を作成します。

この実装はLocal Positionにおける座標を示しているそうです。

この実装だけをMaterialのResult Nodeにつなげると

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

次にDistanceノードで中心からのそれぞれの距離を求めます。

中心は0.5になるそうです。

その結果に以下の計算をします。

その結果、真ん中がもっとも明るくなり端に近づくほど暗くなります。

更にその結果に5を掛けます。

白さが5倍になるという事はFogの濃さが5倍になるという事になります。

その結果をExtinctionに繋げます。

はい。

これは通常のMaterialにおけるOpacityと同じだそうです。

Opacityの三次元版だそうです。

結果です。

Fogが球状になりました。

今の実装でもFogの形状を変化させることは結構出来るそうです。

例えば以下のMultiplyノードのBの値を2から下げると

Fogの形状はCube状に近づきます。

次は以下の部分の実装の説明をしています。

何とBen Cloward先生、理論的な内容はUnityで説明しているのでここでは実装内容しか説明しないと言っています。

うーん。

とりあえず実装の説明だけ全部聞きます。

その後でUnityの説明を見るかどうかを決める事にします。

Local PositionノードのLocal Positionの値に以下の実装を繋ぎます。

UEの単位はcmなので100で割るそうです。m単位に変更したという事でしょうか?

この値はUV Coordinateの代わりに使用するそうです。

その値とTilingの値を掛けます。

一瞬何をやっているのかと思いますが、UV Coordinateの値を調整していると考えると単にTilingをしているだけだと気が付きます。

そして以下の実装に足します。

Timeノードを使用してTextureが移動するようにしています。

これはぱっと見が難しそうですが、一個ずつ見ていくと結構簡単です。

そしてその結果をTexture SampleノードのUVsに繋ぎます。

このTextureは3DなのにUVsの値はUVだけで良いのかなと思ったら

うーん。

ここは何をしているのか分かりません。

InvLeapノードってどんな計算でしたっけ。

Googleの検索がクソ過ぎて何も引っかかって来ません。

何とか見つけたのが以下の説明です。

この説明があっているのかどうかは不明です。

そうだ。

Bingに聞いてみます。

あれ。

滅茶苦茶しっかり返事が返って来ました。

でもよくSourceを確認したらUnityの内容が混じっていました。

UnityではInverse Lerpは以下の計算を行うそうです。

うーん。

Unrealでも同じでしょう。

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

Inverse Lerpの話はともかくInvers LerpのTの値は以下のMask(B)の値をPassします。

この値はCoordinateの高さの値だそうです。

おっと。

Tの値につなげる前に1.5倍していました。

先程、以下のように述べましたが

Tutorialでこの部分の実装について解説していました。

この結果をExtinctionにつなげると以下のようになります。

うーん。

Fogの上部の霧を作成していたのか。

Screenshotでは分かりませんが、Fogの上の部分が波打っていて本物の霧のようです。

次に以下の部分の実装を説明しています。

この部分はFogの細かい部分を作成しているそうです。

この部分の計算結果は先程のInverse LerpのBの値に繋がっています。

Multiplyノードの先のNodeについては分かりません。

Wind Directionノードに繋がっていました。

Tutorialではこの実装の細部について簡単に解説していました。

以下のMultiplyノードのBの値は

以下のCoordinateの値がPassされていました。

Texture Sampleノードですがもう一つのTexture Sampleノードと同じTextureが使用されていました。

結果です。

うーん。

確かにFogの形状がもっと細かくなりました。

最後にFogの色の計算だそうです。

SubtractノードのAの値には以下のInverse Lerpの結果が使用されていました。

あれ?

Inverse Lerpが2つあります。

あ、先程のFogのDetailの結果を追加した時に新たなInvert Lerpノードを追加していました。

この実装におけるSmooth StepノードのValueの値をどこから引っ張ってきているのか不明です。

ここから来ていました。

結果です。

うーん。

成程。

多分Unityの説明は聞かなくても大丈夫でしょう。

実装は来週します。

実装していて何か疑問があったらUnityの説明を見るかもしれません。

5.Gaeaの勉強

5.1 今週のTutorial作成は無し

先週、作成したGaeaのTutorialの再生回数が1回でした。

それはまあ良いんですが、Google Analysisを見たらお勧めに表示された回数が1回なんです。

つまり日本中の誰からも私のGaeaのTutorialがある事が知られてない状態になっています。

これは結構応えました。

まあ一応、Tutorial自体は完成させておいてYouTube上に上げておくようにします。

いつどこで誰かが必要にするかもしれませんので。

で、先程のGoogle Analysisなんですが、それを見るとごく少数ですが、第一回のTutorialから見ている人もいるようです。

ただまだ先週のTutorialを見てはいません。

のでそんなに慌てて次のTutorialを上げる必要もないと感じたので今週のGaeaのTutorialの作成はお休みします。

そして今週は別のYouTube用でOpenAI騒動についてまとめる事にします。

5.2 OpenAIの騒動をまとめた感想

Sam AltmanがOpenAIから追放されて奇跡のCome Backを果たしたまでの時系列をまとめました。

動画と同じ話をここに書くのもあれなので、動画を作成するに当たってこれから考えないといけない事についてここで考察します。

それは全然視聴者が付かない事です。

世界で一番再生数を稼ぐMr.Beastが2年は続けないと視聴者は付かないと言っていますが、本当なんでしょうか?

今の視聴者数で2年も続けるのは結構厳しい気がします。

もっと視聴者が興味のある話題の方が良い気がします。

あとYouTubeの特長として勝者が独り占めする傾向が強い気がします。

同じ分野の動画を作成する人が2人いると、優秀な人が全部の視聴者を奪ってしまう感じがします。

残りはGoogleの検索に引っかかるかどうかです。

検索に出てこないものはそもそもNetに存在しないのと同じになります。

そういうSiteも時には重要かもしれませんが、私の動画の場合は望んでないのにGoogleの検索結果に出て来ません。

後は、Click率です。

YouTubeの画面に私の動画が表示された時のClick率なんですが、これはGaeaのTutorialは5%前後あるのに対して、もう一方の動画では0.5~1%前後になっています。

つまり5倍から10倍もClick率が違う事になります。

やっぱりGaeaのThumbnailである以下のアニメ調の可愛い水着の女の子のIllustrationは

Click率が高くなります。

ただその後、ほとんどの人は1分以内に視聴しなくなっています。

つまりClick率だけ高くなっている訳です。

これは単なる感想なんですが、なんか負け組のレールの上を走っている気がしてならないです。

この列車に乗っている限り勝利という駅に到着する事が無い気がします。

どうやってこの電車の載っているレールを変更して勝ち組に乗っかれるのか。

それを考えるのがこれからの課題な気がします。

もうUnrealの勉強は十分しました。

今度はその知識を生かしたどうやって勝ち組のレールに変更するかを検討しないといけません。

これは聞いた話ですが、今GPTsのアプリは1000個出ているそうです。全世界でたった千個です。

このうちの一個をもし自分が作成していたら世界のTop千人の一人として認識されたはずです。

そういう他人から凄いと思われる方法を考えるのかこれから必要な事かもしれません。

6.Houdiniの勉強

一応、先週で Houdini 19 - Wall Tool 02 [8]の勉強は終わったはずです。先週のBlogを見たらHoudini 19 - Wall Tool 03 [9]の勉強も終わっていました。

今週はHoudini 19 - Wall Tool 03 [9]の実装を行います。

6.1 Houdini 19 - Wall Tool 03 [9]を実装する

Houdiniを起動させようとしたら出来ません。

色々なCommentが出て来ますが、よく意味が分かりません。

一回PCを再起動してHoudiniをもう一回起動させます。

うーん。

今度は起動出来ましたが以下のBoxが表示されました。

Karma RenderとかRendererのLicenseって何の事でしょう?

LauncherのLicenseを調べたら以下のように書いてありました。

これを更新する必要があるんでしょうか?

今日の時点では普通に動くので今回は気にしないで実装の続きをやる事にします。

Attributewrangleノードを追加します。

名前はAttributewrangle_fixHalfBrickと言う名前に変更しました。

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

Codeの内容については先週の勉強で既に調べていますのでここではSkipします。

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

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

この関数の機能については先週のBlogでしっかり記録してあるので今週はSkipします。

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

この関数の機能やそれぞれのParameterについても先週のBlogでしっかり勉強してあるのでここではSkipします。

これでPointが移動するはずです。

あれ?

Errorになってしまいました。

以下の部分がSyntax Errorとなっています。

直しました。

結果です。

Prim Pointの番号は偶数の左端から2番目のPointを見ていきます。

直ってそうですね。

前のPointの位置です。

Attributewrangle_fixHalfBrickを追加した後です。

Geometry Spreadsheetで確認してみます。

おお、Point8の位置がPoint9側によっていますね。

うん。

出来ています。

それではTutorialがやっているようにResample_BrickSpacingノードの

Lengthの値を大きくしてみます。

おお、Pointの幅が大きくなりました。

これもTutorialの通りに出来ました。

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

6.2 HoudiniのVersionをUpdateする

先々週ぐらいにHoudiniのVersionの20.0をInstallしようとしたらErrorになりました。

今週に至っては最初はHoudiniを起動させる事も出来なかったです。

こういう環境の設定で動かなくなるのは凄い自分が怒られている感があって嫌です。

ので今週の残りの時間はHoudiniの新しいVersionのInstallを試して成功させる事にしようします。

今度はあっけなく成功しました。

何で前回失敗したんでしょう。

普通に起動しましたが以下のBoxはVersion19.5と同じように表示されました。

これについては後で調べる事にします。

先程作成したProjectを開いてみます。

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

Scene Viewの結果です。

何も問題なさそうです。

先程試したのと同じ様に以下のNodeの

Lengthの値を変更したら

以下のように前と全く同じ変化をしました。

はい。

来週からVersion 20.0を使用する事にします。

6.3 Expiring Licensesについて調べます

Houdiniを開くと以下のBoxが表示されるようになりました。

これについて調べます。

調べたけど分かりません。

Which licenses are needed to run which product? [9]にヒントらしきものがありました。

以下のはHoudini FXのCommercial版を使用している場合ですが、RendererとKarma RendererのDefault Qtyには5が当てられています。

それに対してNon-Commercial版のHoudini Apprenticeには1が当てられています。

この5の方のLicenseが後2日で切れますよ。と言っている気がします。

でもよく分からんです。

そもそもCommercial版なんか最初から入っていませんから。

来週になってHoudiniが動かなくなったらもっと真剣に調べる事にします。

Version 20.0の方にもSide FX Labを追加しました。

はい。

以上です。

7.UEFNの勉強

今週もPi Equals Three氏のTutorialを勉強します。

7.1 If I Don't Drive Above 40, The Bomb will Go Off! Fortnite UEFN/Creative 2.0 Tutorial [10]を勉強する

今週はこの車を40 miles以下で勉強したら爆発する実装をするそうです。

流石にここまでTutorialを勉強したら大体どんな実装をすべきなのかは想像つきます。

ここにその予測を書いておきます。

まず車用のConstantを作成します。

この型は分かりませんが今は仮にCreative_Prop型と仮定しておきます。

次にあるEventが発生したら車が爆発する関数を作成します。

この関数は車用のConstantにパスします。

そして今度は速度が40Mileを超えたらEventを発生する関数を作成します。

この関数はOn Begin()関数内にセットします。

はい。

これで終わりです。

では実際の実装を見てみましょう。

<Intro>

特になし

<Basic Device Setup / Explosive / Creative prop>

UEFNを開いて車を生成するためにSports Car Spawnerを配置しています。

これは車を生成するためのDeviceだそうです。

こういうのが存在しているという事は知らないですのでこの辺はまだまだ勉強が必要です。

次にExplosive Deviceを配置しました。

こんなDeviceも有るんですね。

はい。

次にProp用のBPを作成して名前をBombPropと名付けました。

ComponentにSphereを追加して

そのSphereのSizeを凄く小さくしました。

これをLevel上に配置します。

そして表示されたSphereとExplosive Deviceの位置を重ねます。

重ねたらBPに戻ってSphereを消します。

うん。

この辺は何が目的でやっているのか今一分かりません。

先に言ったら判明するでしょう。

次をやって行きます。

Detail PanelからExplosive Deviceを選択してBombPropをAttachします。

以下のようになります。

ああ、分かった。

CreativePropでConstantを作成してそれを車に追加するはずです。

ここでVerseに移動します。

以下の名前のVerse fileを作成していました。

<Creating Car Entering Handle Event Method>

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

BombはPropに追加すると思ったんですが違いましたね。

更に使用するModuleの設定は以下のようになりました。

OnBeigen()に以下のEvent.Subscribe()関数を追加しました。

Ya Better Start Driving関数をPassしています。

更にYa Better Start Driving関数を作成しました。

<Creating GetSpeed Function to Get Car Speed>

今度は車の速度を得るための関数を作成します。

GetSpeed()関数です。

Return ValueはVoidになっていますが、本当はFloatです。

次に以下の3つの変数を作成します。

あ。ここまで来て分かりました。

Fort_CharacterにはSpeedを表すPropertyは無いんです。

でこれらの変数を使用してSpeedを一々計算するんです。GetSpeed()関数ないで。

以下の実装でSpeedを計算していました。

60mileじゃなくて60km/hでした。

DistanceXY()関数はXYの距離を返すんでしょうか?

最後の計算で3.6をかけているのは3600 sec/hour*1km/1000m = 3.6 (sec*km)/(hour*)mを掛けているからでした。

最後にSpeedKMHの値を返します。

この関数はLoop内で使用されるのはこの時点で明白ですが、この関数内にはLoopはありません。

その場合でも<Suspends>は必要なんでしょうか?
ここはよく分からないです。

<Creating Main Explosion Loop>

ここで車の爆弾がまだ爆発していなのかどうかを検査する関数を作成します。

まず以下の変数を作成します。

Blow Up If Below Speed ()関数を作成しました。

この関数内でLoopを使用するのは明白です。<Suspends>を追加しました。

最初の5秒間Sleepするのは車が加速する間の待ち時間でしょうか?

60 km/hを超えてから爆弾のSwitchが入った方がRealな気もします。

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

これはまあCodeを読んだら何をしているのか明白ですので解説はしません。

<Creating Function to Teleport Bomb to Car>

以下の関数を作成します。

更に以下のConstantを作成します。

うーん。

ここでDummyPropも作成していますね。

で先程作成した関数に以下の実装を追加しています。

Dummy PropだけTeleportさせています。

これでDummy Propに付属のExplosive Deviceも一緒にTeleportすると思っているですが違うんでしょうか?

この関数を以下の場所に追加しました。

次に以下の赤線の箇所にBomb.Expload()関数を追加しました。

ああ、分かりました。

Bombを車に追加するだけならPropだけで充分なんですが、Bombを爆発させるためにはExplosive Device型のConstantであるBombも必要になると言う訳です。

はい。

理解しました。

<Final Script>

ここでは以下の関数の実装を完成させただけでした。

Spawn:ってどんな機能なんでしょう?

調べます。

うーん。

こんな使用方法は検索に引っかからなかったです。

謎です。

<Setting Up Device with Car, Explosive Device>

UEFNに戻って来ました。

後はVerseで作成したConstantに当てはまるAssetをDeviceにセットするだけです。

Deviceを配置しました。

以下のようにそれぞれのConstantに対応するAssetをセットしました。

<SETTING UP EXPLOSIVE SETTINGS>

ここでExplosive Deviceの設定を変更しています。

Player Damageの値を200に変更しました。

この辺の設定の変更が何故必要なのかはよく分かりません。

これだけのDamageをPlayerに与えるとPlayerが死ぬんでしょうか?

実装した後で確認します。

更にVisible During Gameの値をOnにしました。

この意味は分かります。

爆弾が見えなかったら車が爆発する意味が分かりません。

爆弾がVisibleである方が車が爆発する可能性がある事がPlayerに伝わります。

と思ったらOffにしてしまいました。

うーん。

まあ。どっちでも良いです。

最後にCollision During GameをOffにしました。

これがOffになってないとBombが車と衝突するようになるそうです。

<Final Result>

運転している車の速度が40km/hを下回ったら、

爆発しました。

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

実装は来週やります。

Tutorialの実装と私の予測がどれくらい近いのかの検討もやりたかったんですが、もう時間が無くなってしまいました。

来週時間があったらやる事にします。

8.DirectX12の勉強

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

8.1.1 先週の復習

先週何を勉強したのか全く覚えていません。確か最初のTutorialである Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [11]の実装まで終わったはずです。

先週のBlogを読んで確認します。

違っていました。

終わってなかったです。

先週の勉強内容を以下に簡単にまとめます。

Lötwig Fusel氏の作成したComPointer.hppをComPointer.hとして追加したらErrorになってしまいました。

どこが間違っているのかが分からないのでまずCom Pointerが使用出来るかどうかの確認を行いました。

調べるとCom Pointerは別に何かをしなくても普通に使用出来るそうです。

Com Pointerを使用するにはIUknownを使用します。

以下のようにIUknownを使用すると

特に問題なく使用出来ました。

次にこのIUknown*で宣言したpを使用してRelease()関数を呼び出しています。

Release()関数の機能については以下のような説明がまとめられていました。

次はAddRef()関数についての解説です。

この関数は呼び出されるたびにRef Counterの数を一回増やします。

後、ここで重要な情報を得ていて、それは「Interface PointerをCopyする度に自分でこの関数を使用してRef Countを増やす必要がある」事です。

Com Pointerは自動でRef Counterの数を管理はしてくれない事が判明しました。

これは結構面倒です。

最後にQueryInterface()関数について説明しています。

QueryInterface()関数は以下のように

DeviceはID3D12Device*から作成しました。

でこの関数の機能がいまいち理解出来ないところで終わっています。

8.1.2 QueryInterface()関数の機能について

先週から一週間経って、落ち着いた状態で

公式SiteのIUnknown::QueryInterface(REFIID,void**) method (unknwn.h) [11]にあるQueryInterface()関数の機能を説明した以下の文章を読むと

以下のように解釈出来ます。

DeviceがCom Objectの派生かどうか確認します。DeviceはCom Objectの派生なのでCom Objectです。その場合はAddRef()関数を読んだ後にDeviceのPointerを返します。

ここでInterfaceと言う言葉が混じっているので意味が分かりにくくなっているんです。

Interfaceと言う言葉の定義をしっかり復習してこの文章の意味を完璧に理解します。

GeekforGeekのC++ Program to Create an Interface [12]を読み直しました。

直ぐにC++のInterfaceの仕組みについて思い出しました。

昔この辺の勉強は死ぬほどやったんでした。

ようはVirtual Classの事です。

C++にはInterfaceが存在しないのでVirtual Classで代用するんです。

でVirtual ClassからObjectを直接作成する事は出来ませんので、Com Objectは何かのInterfaceから派生して作られた子Classなはずです。

C++ですので、元になるInterfaceは一つである必要はなく複数のInterfaceからInheritanceする事も可能なはずです。

これがOne of its interfaceの意味と考えられます。

でa PointerはここではDeviceの事を指しています。このDeviceがCom ObjectがInheritanceしたInterfaceを指しているかどうかを調べます。

あ、ここで意味が破綻しました。

C++ではInterfaceから直接Classを作成する事は出来ませんのでPointerがinterfaceを直接指す事は出来ません。

うーん。

私の最初のImageだとCom ObjectというかCom Classはその下に沢山のInterfaceを持っているんです。

そして指定されたPointer(この場合はDevice)の指しているInterface(この場合はID3D12Device)がそのCom Classの下にあるInterfaceの一個である場合は、そのPointerの値を返します。

更にPointerを返した場合は、自動でAddRef()関数を呼び出します。

という意味に取ったんです。

でもC++のInterfaceの定義から考えるとこの訳は間違っていますね。

あれ?

そう言えばID3D12DeviceってInterfaceじゃなかったでしたけ?

ID3D12Deviceを調べれます。

公式のID3D12Device interface (d3d12.h) [12]です。

Interfaceって書いてあるじゃないですか。

やっぱり最初の解釈があってたんです。

うーん。

でもInterfaceからObjectを直接作成する事は出来ないのも正しいはずです。

どういう事?

まあ、良いです。

QueryInterface()関数の機能に関して言えば最初の解釈であってるはずです。

それさえ理解出来れば、今の時点では十分でしょう。

8.1.3  Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [11]の続きを実装する

QueryInterface()関数を実装しました。

IID_PPV_ARGSを使用しています。

これは「DirectX 12の魔導書」の勉強などで何回も勉強しました。

一応、過去のBlogを見て何を勉強したのかを確認します。

2023-02-13のBlogで以下のように述べていました。

これしか勉強してないみたいです。

いや確かIID_PPV_ARGSの公式Siteを調べた記憶があります。

他のBlogでもIID_PPV_ARGSについて勉強しているのかもしれません。

と思ったらこのBlogの下の方に以下の解説がありました。

成程。

これは分かり易い。

公式SiteのIUnknown::QueryInterface(REFIID,void**) method (unknwn.h) [11]のQueryInterface()関数のParameterには

以下の2つがあります。

それぞれ

となっています。

この2つのParameterを一個で代用するのがIID_PPV_ARGSです。

Tutorialを見ると同じような説明をしていました。

最初にTutorialを見た時は理解出来なかったですが、今こうやってある程度の知識の下地が出来た状態で聞いたら、何を説明しているのかよく理解出来ました。

次にCom Classですがそのまま貼り付けていました。

あれ?

これでErrorになったんですけど。と思ったら

TutorialでもしっかりErrorになっていました。

うーん。

どうやってこのErrorを直すんでしょうか?

何とそのままにして使用していました。

えええ。

まあ試してみます。

GitHubから最新のComPointer.hppの実装をCopyして前に作成したComPointer.hにPasteしました。

以下の箇所がErrorになっています。

Fileの位置を整理していたらいつのまにかErrorが消えています。

このComPointer.hを使用するとRef Counterを気にしないでCodeを書く事が出来るそうです。

うーん。

これは便利。

普通に使えました。

はい。

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

来週は次のTutorialを勉強する事にします。

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

8.2.1 先週の復習

先週は「4.3 Vertex Buffer」を読んだだけです。

先週のBlogでは

と書いていましたが実際のSpellはCreateCommittedResourceでした。

CommittedがComittedになっていました。

8.2.2 CreateCommittedResource()を実装する

Sample Codeを見ると以下のように実装していました。

順番としてはまずD3D12_HEAP_PROPERTIES型であるheappropを作成し、それぞれの要素の値を指定します。

次にD3D12_RESOURCE_DESC型であるresdescを作成しそれぞれの要素を指定します。

更にID3D12Resource型であるvertBuffを作成します。

これらをParameterとして最後にCreateCommitedResource()関数を呼び出してGPU側のMemoryを確保します。

この順番に実装しながらそれぞれのStructの機能を勉強していくことにします。

丁度教科書もその順番で説明しています。

<D3D12_HEAP_PROPERTIES>

まずは実装してしまいます。

Sample CodeにあるD3D12_HEAP_PROPERTIESの部分をCopyしてそのまま自分のProjectにPasteしました。

Sample CodeではShowWindow()関数の下に実装していたのでそのまま同じ場所にPasteしました。

後、Sample Codeには既に

Verticesの値が指定されていました。

先週、教科書を読んだ限りではVerticesの実装方法の説明はありましたが、実際の実装は無かったはずですがどうしましょう?

別にこの部分は何か勉強しないといけないところは無いので、もし後になっても実装しない場合はその時に実装する事にします。

公式SiteのD3D12_HEAP_PROPERTIES structure (d3d12.h) [13]です。

以下の要素があります。

Sample Codeの実装では4番目と5番目の要素は指定していませんね。

Typeです。

ここで作成されるHeapのTypeを指定するそうです。

公式SiteのD3D12_HEAP_TYPE enumeration (d3d12.h)[14]を見ると

ここで指定出来るHeapのTypeには以下の4つがあるそうです。

Sample CodeではD3D12_HEAP_TYPE_UPLOADが指定されています。

D3D12_HEAP_TYPE_UPLOADの解説を以下に示します。

結構長いですね。

CPU側から一回だけ書き込んでGPU側から一回だけ読み込む目的のHeapに最適の設定のようですね。

それ以上はわかりません。

教科書の「4.3.2 Vertex heapの設定」の説明も読んでおきます。

うーん。

まずBandwidthが何を表してるのかが分かりました。これが広い程Accessするのが速くなります。

D3D12_HEAP_TYPE_UPLOADに関しては教科書でもCPU側から一回だけ書き込んでGPU側から一回だけ読み込む目的では最適のHeap設定と書いていました。

後、残り3つのTypeの特長についてもそれなりに詳しく説明していました。

私は今回使用しないTypeの特長まで勉強する気はありません。

その部分はSkipします。

2番目の要素であるCPUPagePropertyについてです。

公式SiteのD3D12_CPU_PAGE_PROPERTY enumeration (d3d12.h)[15]を読んでみます。

以下の4つの要素があるそうです。

Sample Codeを見るとD3D12_CPU_PAGE_PROPERTY_UNKNOWNが使用されていました。

D3D12_CPU_PAGE_PROPERTY_UNKNOWNの特長については以下のような説明がありました。

うーん。

これだけじゃ何なのか全く分かりませんね。

教科書を読んでみます。

教科書読んだら、これ以降の設定はHeapのTypeがCustomの時だけしか使用しないので初心者は勉強しなくて良いと書いてありました。

はい。

残りはSkipして次にいきます。

<D3D12_RESOURCE_DESC>

これも最初に実装します。

Sample CodeをそのままCopyしました。

あれ?

Errorになっています。

あVerticesのところがErrorになっています。

ここではSizeof(前頂点)と書いてありましたが、その次の節ではSizeof(vertices)と書いてありました。

のでVerticesも追加します。

以下のようにSample CodeをそのままCopyして追加しました。

うーん。

Errorになっています。

教科書の「4.2 頂点情報の作成」を読み直します。

ありました。以下のDirectXMath.hをIncludeしろと書いてありました。

しました。

あれ、したけどErrorのままです。

教科書を読み直したらNamespaceでDirectXを使用するかDirectX:XMFLOAT3と書くようにと書いてありました。

Sample Codeではどうやっているのか確認します。

ありました。

Using namespaceを使用していました。

全く同じにします。

結果です。

Errorが消えました。

D3D12_RESOURCE_DESCのそれぞれの要素については、教科書ではあまり解説していませんでした。

見るとResdescのSizeを指定するための設定のようで前も似たような設定をWindowを作成した時にやりました。

そんなに真剣に勉強する必要はない部分な気もします。

今回はこの部分の設定についての勉強はSkipします。

<ID3D12Resource>

これはSample Codeでは以下のように実装していました。

教科書には特に説明はありませんでした。

同じ様に実装します。

<CreateCommitedResource>

やっとCreateCommitedResource()関数を使用出来る所までやって来ました。

まずはSample CodeをそのままCopyしてProjectにPasteします。

しました。

別にErrorの表示とかもないです。

一応、公式SiteのID3D12Device::CreateCommittedResource method (d3d12.h)[16]を見てみます。

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

この中のParameterで未だによく分からないのは2番目のParameterであるD3D12_HEAP_FLAGSと4番目のParameterであるD3D12_RESOURCE_STATEです。

これらのParameterについて一寸だけ調べます。

まず2番目のParameterであるD3D12_HEAP_FLAGSについてです。

うーん。

説明聞いてもピンと来ません。

D3D12_HEAP_FLAGSを見てみます。

公式SiteのD3D12_HEAP_FLAGS enumeration (d3d12.h)[17]です。

こんなに色んな種類のFlagがあるの?

Sample Codeで使用しているのはD3D12_HEAP_FLAG_NONEですね。

これの特長だけ調べる事にします。

はい。

四番目のParameterであるD3D12_RESOURCE_STATESについても調べます。

公式SiteのID3D12Device::CreateCommittedResource method (d3d12.h)[16]におけるD3D12_RESOURCE_STATESの説明です。

D3D12_HEAP_TYPE_UPLOAD heapを使用する場合はこのParameterの値はD3D12_RESOURCE_STATE_GENERIC_READになると書かれています。

Sample Codeのこの値は

になっていました。

こんだけ理解したら今は十分です。

はい。

最後に教科書ではこの関数がきちんと動いているかどうかをResultにS_OKが返っているかどうかで確認しろ。と書いてありました。

これをやります。

以下のCodeを追加してテストします。

Sample Codeを実行します。

何も表示されません。

出来てるようです。

念のため、以下の箇所にBreak Pointを設置してResultの中身を確認しました。

結果です。

S_OKになっていました。

出来ています。

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

9.まとめと感想

なし。

10. 参照(Reference)

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

[2] Rectangular area lights. (n.d.). https://docs.unrealengine.com/5.3/en-US/rectangular-area-lights-in-unreal-engine/

[3] Reflections captures. (n.d.). https://docs.unrealengine.com/5.3/en-US/reflections-captures-in-unreal-engine/

[4] Ryan Manning. (2021, May 25). UE4 Reflection Captures - How-to Use [Video]. YouTube. https://www.youtube.com/watch?v=KEwZD3hgX2o

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

[6] Niagara Debugger. (n.d.). https://docs.unrealengine.com/5.3/en-US/niagara-debugger-for-unreal-engine/

[7] Ben Cloward. (2023, April 27). Local Volumetric Fog - Advanced Materials - Episode 23 [Video]. YouTube. https://www.youtube.com/watch?v=En-VjBjto_U

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

[9] Which licenses are needed to run which product? | SideFX. (n.d.). https://www.sidefx.com/faq/question/which-license-strings-are-required-for-each-houdini-product/

[10] Pi Equals Three. (2023, April 16). If I Don’t Drive Above 40, The Bomb will Go Off! Fortnite UEFN/Creative 2.0 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=rt_S-GfWstY

[11] Stevewhims. (2022, August 31). IUnknown::QueryInterface(REFIID,void) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-queryinterface(refiid_void)

[12] Stevewhims. (2023, February 14). ID3D12Device (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nn-d3d12-id3d12device

[13] Stevewhims. (2021, April 2). D3D12_HEAP_PROPERTIES (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_heap_properties

[14] Stevewhims. (2023, February 14). D3D12_HEAP_TYPE (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_heap_type

[15] Stevewhims. (2022, January 31). D3D12_CPU_PAGE_PROPERTY (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_cpu_page_property

[16] Stevewhims. (2021, October 13). ID3D12Device::CreateCommittedResource (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createcommittedresource

[17] Stevewhims. (2023, February 14). D3D12_HEAP_FLAGS (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_heap_flags




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

1. 今週の予定

1.1 今週の予定

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

<Landscapeの作成>

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

内部の家具を追加していきます。

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の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強をやります。

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

2. Landscapeの作成

2.1 建物の内部を作成する

今週も建物の内部の家具や装飾品などを追加していきます。

何とか今週中には家具や装飾品の配置を終わりにしたいです。

先週の続きの勉強部屋の配置からやって行きます。

以下のAssetが使用されていました。

まずここを作成します。

出来ました。

今度は反対側です。

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

はい。これを配置します。

出来ました。

最後、本棚です。

配置されている装飾品です。

一個だけ装飾品が無いですね。

これで配置します。

勉強部屋の家具や装飾品の配置も終わりました。

次の部屋の配置をします。

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

以下のAssetが使用されています。

まずこれを配置します。

以下のAssetが使用されていました。

作成します。

今度は以下の箇所の配置をします。

Demoでは以下のようにかぐや装飾品が配置されています。

以下の装飾品や家具が使用されていました。

机の上のモノもAssetです。

これらを配置します。

今度は棚についてです。

この装飾品の配置は勉強部屋の配置と同じです。

同じような配置をしました。

本棚です。

以下のAssetを使用しています。

これらを配置します。

それぞれの部屋をDoorから覗いてみます。

これで家具と装飾品の配置は終わったはずです。

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

来週はLightや光関連の配置をする事にします。

3.Niagaraの勉強

3.1 CGHOW氏の近況

CGHOW氏がTutorialの公開を止めてしまったらしいという噂を聞きました。

今週はこの確認を最初にします。

822 UE5 VFX Tutorials in 0.71$ IS THIS EXPENSIVE?? [2]に説明がありました。

TutorialはMembership Onlyに移したそうです。そしてMembershipの会員費は月$0.71だそうです。

これは日本円に直すと104.68円ですのでまあほぼ無料と同じ金額です。

CGHOW氏もお金を稼がないと暮らしていけないのでこれは仕方ないですね。

ただ私はもうCGHOW氏のTutorialから学ぶ内容は無いです。

のでまあMembershipになったとしても勉強はしないでしょうね。

3.2 先週の復習

一個忘れていたのですがRender Targetについて書かれていました。

DirectX 12におけるRender Targetの機能を一言で説明出来るように、DirectX12の勉強のところで復習しようと思っていたんですが、それをすっかり忘れちゃっていました。

これは今週やります。

先週は「GridのDataを作成する」を実装していました。

3.3 「13.4.6 GridのDataを作成する」の続きを実装する

まずSample Texture 2Dノードを分割しました。

更にCustom HLSLノードを追加して以下のように実装しました。

成程。

TextureをGrid 2D Collectionで指定した升目で分割してそれぞれのAlpha値からSTATEの値を決定しました。

これは一例と言う訳で別に絶対こうすべきと言う訳では無いですね。

ここで重要なのはこのやり方でNiagaraのTextureの情報をMaterialにPass出来るという事です。

<Main Logicの計算を行う>

Niagaraに戻ってきたら以下の警告が出て来ました。

検索しても全く引っかかりません。

取りあえずはこのままにしておきます。

今度はLogicの計算を行うために新しいGeneric Simulation Stageを追加しました。

以下のように設定を変更しました。

ここで教科書では

とわざわざ警告をしてくれています。

これ前回の時に行って欲しかった。

Execute Behaviorの設定をNot on Simulation Resetに変更しました。

ここも教科書に大切な説明がありました。

1 Frame目は

ここで計算して2 Frame目から以下に示した

ここで計算をするわけです。

新しいScratch Pad Moduleを追加しました。

Solveと名付けたScratch Pad Moduleを開き

Map Getノードに

[EMITTER] Grid2D Collectionを追加しました。

ここは先程、作成したTextureToGrid2Dの結果を

使用するのかと思ったんですが違うんでしょうか?

教科書の書き込み方から推測しますと

以下に示した様にStack Context Sensitiveには

[STACKCONTEXT] Stateが存在しているはずなんですが、

無いです。

[STACKCONTEXT]のScopeの範囲がよく分からないんです。

以下の解説を読むと

[STACKCONTEXT]のScopeは1 Frameのようです。

となると

これは新しく作ってもおかしくは無いですね。

作ります。

Float型で作成しました。

これをMap Setノードに追加しました。

更にCustom HLSLノードを追加して以下のように繋ぎました。

ここからHLSLで実装します。

教科書の説明によると

以下の実装で対象のStack Contextの値を取得する事が出来るそうです。

GridCollection2D. SampleGridFloatValue <Attribute = name>(float2 uv, float value);

うーん。

Stack Contextの値でこの時点でまだ存在しているの?

ここのModuleが実行されるという事はFrameは2周目に入っている訳ですから、Stack Contextの中身は既に消えてしまっている気がします。

もしそうでないのなら

先程、このSolveを作成した時に

に何も表示されないのは何かを間違っているせいになります。

うーん。

取りあえず全部やってからこの問題については考える事にします。

残りの計算はGame of Lifeの設定をそのまま実装しただけです。

特に疑問な点は無かったです。

実際に一々書くのは面倒なのでSample CodeをそのままCopyしました。

うーん。

これは動かない気がしますね。

まあ、良いです。

兎に角最後までやってしまいます。

<Render Targetに結果を取り込む>

当然、これを行う為の新しいScratch Moduleを作成します。

名前はGrid2D_To_RenderTargetにしました。

中を開きMap Getノードに

[EMITTER] Grid2D Collectionと[EMITTER] Render Targetを追加します。

Set Render Target Valueノードを追加します。

IndexXとIndexYの値をRender TargetのLinear to Indexから獲得します。

Linear to IndexノードのLinearにはExecution Indexを繋ぎます。

ここがよく分かりません。

Execution Indexノードの説明には

以下のように書かれています。

そもそもこのSimulationにはParticleは存在してないのですから、何にも帰ってこない気がします。

それとも今、計算されているGridのIndexが返ってくるんでしょうか?

次にSample Previous Grid Float Valueノードを追加します。

あ、ここでExecution Index to Unitノードを使用していました。

これ前も使用していましたね。

という事は、Particleを使用しない場合もExecution Indexは存在しているという事ですね。

次にStateの値から色を指定します。

これは1なら白、0なら黒なだけです。

これで完成だそうです。

Preview画面を見ましたが何も表示されません。

Level上に配置しましたがここでも何も表示されません。

うーん。

やっぱり何かがオカシイんです。

Bugの問題は来週検討する事にします。

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

4.Materialの勉強

4.1 Retroreflective Road Sign - Advanced Materials - Episode 22 [3]を実装します

先週勉強したRetroreflective Road Sign - Advanced Materials - Episode 22 [3]を実装します。

<Reference Image>

ここは特にやる事は無いのでSkipします。

Photoshop

ここで以下の2つのImageを作成しています。

まじか。

これを最初に作成する必要があるのか。

今週は面倒なのでMediBang Paint Proで作成しました。

Sizeは256x256です。

これをPngのGray Scaleで保存すれば白黒になるはずです。

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

白い部分を透明として指定する必要があるかもしれません。

その辺は臨機応変に対応します。

Diamond Retroreflectiveです。

こっちもGray Scaleで作成しました。

<Shader>

UE5にImportしました。

まずはCautionの方から確認します。

Compression SettingはGrayscaleになってなかったので直しました。

更にsRGBもOffになってなかったのでOffにしました。

Diamond RetroreflectiveのTextureは同じでした。

ここからMaterialの作成に入ります。

InvLerpノードをCautionの文字が薄くなっているのを直すために繋げました。

結果です。

Aも文字が読めなくなっています。

InvLerpノードの値を調整します。

一寸明るすぎますが文字が読めてかつBlurが無いです。

使用した値です。

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

Aは何とか読めますね。

色を追加しました。

StepノードをOpacity Mask接続してRoad Signの端を消します。

結果です。

端の線が汚いですね。

まあ今回はこれは無視して続きをやります。

<Fresnel>

今度はFresnelを追加します。

MultiplyノードのBの値はまだ作成していないので1.0にしておきます。

この時点での結果です。

<Diamond Pattern>

FresnelのMultiplyノードのBの値を計算します。

結果です。

滅茶苦茶良いんじゃないでしょうか!

こっちの実装はこれでOKとします。

5.Gaeaの勉強

5.1 Tutorialの作成

今回はMountainノードの後につなげるNode群について解説します。

前回、以下に示した様にMountainノードを追加する事で山を作成しました。

これだけでもかなりRealですが、実際の地形の表面はもっと複雑です。

日本ではほとんどの山は木が生い茂っているだめ山の表面を見る機会はあまりありません。

ので山の表面がどうなっているのかなんで知りません。

そこで代表的な地形であるFolding、Shear(Fault)、Stack、(Shatter)そしてTerraceをここに紹介します。

Foldingです。

層になった地形がグニャっと曲がっています。

ここでは2023-02-26のBlogでした以下の説明をします。

次はShearです。

Shearは理屈を理解した方が現物を見るより分かり易いです。 

Shear Zones[4] に以下の解説がありました。

これが一番分かり易いです。

地面が引き裂かれるんです。

で真っ二つに引き裂かれた場合はFault、多少繋がっている場合はShearになります。

以下にWikipediaのShear zone[5]の例を示します。

By Mikenorton - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=25156710

でこれを見るとShearじゃなくてFaultじゃね。

と思います。

このFaultとShearの区別は文献によってまちまちでよく分かりません。

因みにWikipediaのFault [6]のPageにあるFaultのImageです。

By NASA Earth Observatory images by Robert Simmon and Jesse Allen, using Landsat data from the USGS Earth Explorer. Caption by Adam Voiland. - Faults in Xinjiang (Nasa Earth Observatory), Public Domain, https://commons.wikimedia.org/w/index.php?curid=30723575

こっちはスパッと切れていますね。

Stackです。

WikipediaのStack (geology)[7]の画像です。

By Jan from Singapore, Singapore - Two moreUploaded by Snowmanradio, CC BY 2.0, https://commons.wikimedia.org/w/index.php?curid=10677360

Computer ScienceのStackと同じじゃないですか。

うーん。

解説を読むと海のそばでしかこの地形は形成されないそうです。

ただGaeaのStackを見ると

凄い綺麗に出ています。

Shatterです。

WikipediaのShatter cone[8]によると

By Zatoichi26 at English Wikipedia, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=31287511

と紹介されています。

がこの地形が現れるのは隕石が落ちた後か核爆発があったかのどちらかだそうです。

Gaeaでは以下のように綺麗な地形を作成しています。

最後はTerraceです。

WikiのRiver terraces (tectonic–climatic interaction)[9]には

By Sushant savla - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=72683594

がありました。

これはTerraceの地形が分かり易いです。

写真もありました。

By Andreas F. Borchert, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=4568455

木が生えたりErosionが起きるとTerraceはあまりはっきりしませんね。

今度はGaeaの結果を示します。

Foldです。

あんまりFoldしていませんね。

Shearです。

この辺にShearっぽい地形が形成されていますね。

次いでにFaultノードの場合も検証します。

ただしFaultノードはLook Dev Groupに属するNodeでは無いです。

確かにFaultですが、地形が一辺してしまっています。

今回の主旨とは一寸違ってしまっています。

Stackです。

見事にStack状になっています。

Shatterです。

非常に綺麗な表面を作成しますが、Geology的には隕石や核爆発が起きた後しか形成されない地形だそうで、こんな感じで使用するのがありなのか一考が必要なNodeかもしれません。

最後にTerraceです。

このNodeもLook Devには属さないNodeでProfile Groupに属しています。

今回のTutorialで教える内容はこれぐらいが限界ですね。

因みに今回の結果の元になったMountainノードのSeedの値は

です。

5.2 Power Pointのまとめ

以下のようにまとめました。

Mountainノードの次に配置すべきNodeはどのように選ぶべきなのか?

を軸にLookdev GroupのNodeを紹介しています。

今回はGeology的に重要なNodeをPickupして解説する事にしました。

Foldの解説です。

今回はどうしてこのような地形が形成されるのかについての解説は一切省きました。

こんな地表が存在している事を知ってもらうのが最も重要だからです。

Shearに関しては実際の地形を見る前に理論を理解した方が分かり易いと考え、理論から解説しています。

その後で写真も紹介しています。

Faultの例も紹介しています。

Stackはあまり重要な地表ではないですが、

Lookdev GroupにNodeが有る事と、次のTerraceと形状が似ている事からここで紹介する事に決めました。

このTerraceは何故かLookdev Groupに属していません。

最後にShatterです。

これもそんなに重要な地表とは思えませんが、Lookdev GroupにShatterが存在しているのでこれも追加しました。

この後にSurfaceノードも解説しようと思っています。

これらのNodeをいつ使用すれば良いのかがよく分からない場合、Surfaceノードで代用するとそれなりに対応出来ます。

6.Houdiniの勉強

6.1 先週の復習

先週のBlogを読み直すと Houdini 19 - Wall Tool 02 [10]の実装は終わったみたいです。

ただ最後の部分が何をしているのかよく分からないと書かれていました。

これはResample_BrickSpacingノードのLengthの値をこのLengthにPassしているだけです。

つまり0.712です。

これ見ると長さは一定には見えないですね。

うーん。

Rulerがあったら長さを図る事が出来ますね。

調べます。

公式SiteのRuler [11]を見るとSideFX LabsにRulerが有るそうです。

以下のように長さを図っていました。

私のProjectを見たらそもそもSide FX Lab自体が無いです。

うーん。

分らん。

Geometry SpreadsheetにそれぞれのPointの位置やPoint間の距離が表示されていました。

#0から#9のPointです。

SpreadsheetのそれぞれのPointの位置からPoint間の距離を計算しました。

Ptdistの値と比較すると9の値が違いますね。

それ以外は同じ数字になりました。

一つ前のAttributewrangle1の

Pointの並びです。

うん。

Pointが8までしかないですね。

Resampleノードを追加する事でPoint数が一個増えています。

公式サイトのResample geometry node [12]を見ます。

ResampleノードのRemarkの説明で均等な長さに分割するためにResampleします。

と書かれていました。

つまりResampleノードの機能そのものが距離を均等に分割するものだったんです。

そして以下のParameterです。

これについても解説していました。

これ読むとPoint間の距離がここで指定した値以下になるようにする設定です。

つまりResample_BrickSpacingノードのLengthの値である

以下になるように新しくPointを振った訳です。

確かにSpreadsheetを見直すとPtdistの値は全部0.712以下になっています。

うん。

こんだけ理解出来たら今回は十分です。

次に行きます。

6.2 Houdini 19 - Wall Tool 03 [13]を勉強する

以下のPointの位置が間違っているので直すそうです。

Attribwrangleノードを追加します。

名前はAttribwrangle_fixHalfBrickとします。

中の実装です。

とりあえずここまでの実装の説明をします。

位置を移動したいPointは全部@primnumが偶数です。

のでIf節で偶数だけ選別します。

次にIntのArrayを作成します。

関数、Primpoints()を使用しています。

この関数について調べます。

公式Siteのprimpoint VEX function [14]です。

Geometryは自身のGeometryを指すので0になるはずです。

次にPrimnumを指定しています。これが@primnumになるのか。

最後のParameterでprim Number内のVertexの番号を指定します。

今回はArrayなので全てのPointの番号を得るので、このParameterは指定していません。

次の実装です。

Tutorialによると位置を直す必要のあるPointは

以下の赤丸で囲ったPointなので

-2で指定するとこのPointになるそうです。

普通に8を代入した場合はどうなんでしょう?

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

次の実装です。

ここで位置を変更するPointの隣のPointを習得します。

Point関数について調べます。

公式Siteのpoint expression function [15]です。

それぞれのParameterについても見てみます。

最初のParameterです。

Surfaceノードだそうです。

今回は自身のノードなので0を指定しています。

次のParameterです。

これがPである訳が無いですので、ここは指定してないんでしょうか?

それとも最初の0がこれを指定しているんでしょうか?

よく分かりません。

次のParameterです。

ここでPを指定していますね。

PはPositionの事だそうです。

次のParameterです。

ここでPointの位置を指定しています。

例も載っていました。

これは納得です。

でもTutorialのPoint()関数の値どうなんでしょうか?

なんか全然合ってない気がします。

Tutorialみたら以下の解説が写っていました。

全然違うじゃん。

最初のParameterはGeometryです。

だから0を指定していたのか。

次のParameterがAttribute_Nameです。

ここはPointの位置を返してほしいのでPになるはずです。

最後のParameterはPoint Numberでした。

以下に示した様にprimPts[-1]で

位置を直したいPointの隣のPointを指定しています。

うーん。

何でPoint()関数のParameterが違っているんでしょうか?

謎です。

次は以下の距離の値を取得します。

以下の実装で取得しました。

これはすぐに意味が分かりました。

二番目のParameterで欲しい値がptdistと指定してます。つまりPoint間の距離を返せと言っています。

三番目のParameterでどのPointかを指定しています。

はい。

今度はこれらの値を使ってPointの位置を直すそうですが、どうやって直すんでしょうか?

次の関数です。

SetPointattrib()関数です。

今度はParameterで躓かないように最初からTutorialで表示されている画面をScreenshotしておきます。

途中で切れてしまっていますが、大体は読めます。

これを確認した上で公式Siteのsetpointattrib VEX function [16]を読みます。

先程のTutorialに表示された解説と同じですね。今度は大丈夫そうです。

先にTutorialがどんなArgumentを使用するか確認します。

Tutorialではこの関数の実装をする時にそれぞれのParameterの意味についても簡単に説明していました。

それを以下にまとめます。

最初のParameterです。

これはInput Indexで0を指定します。と言っていました。

公式Siteのsetpointattrib VEX function [16]のこのParameterの説明は後でまとめて読みます。

次のParameterです。

どんなAttributeの値をSetしたいのかをここで指定するそうです。Pointの位置を直したいので当然Pになります。

次のParameterです。

直したいPointをここで指定します。FixMeをここに指定しました。当然ですね。

次のParameterです。

ここには新しくSetしたい値を指定するそうです。

TutorialではtgtPの位置から@N方向にtgtLenの値を足した値を指定しています。

最後のParameterです。

ここはどんな操作をしたいのかを指定します。

TutorialではSetを指定しています。

ここは値をセットするからでしょうね。

公式Siteのsetpointattrib VEX function [16]の説明も確認します。

最初のParameterです。

うーん。

これは意味が分からん。

いや一応は意味は分かりますが、Tutorialの分かり易い説明を聞いた後だと、この説明を読むのはほとんど無駄に思えます。

最後のParameterのSetの意味だけ確認する事にします。

まさしくSetですね。

関数の上にCursorを合わせた状態でF1を押すと先程の公式SiteのFunctionのPageを開いてくれるそうです。

これは良い事知りました。

Resample_BrickSpacingノードの

Lengthの値を変更してTestしています。

以下のように変化しました。

Pointの数は減っていますが、Pointの位置が壁のBrickの位置を示すようになっています。

ここでこのTutorialは終わっていました。

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

6.3 Side FX Labの表示方法

Rulerを使用するためにSide FX Labを表示する必要が有りますがこのやり方が分かりません。

Side FX Labで検索すると

公式SiteのSIDEFX LABS INSTALLATION [17]が出て来ます。

ここにInstall方法を説明しているVideoがあります。

このVideoのやり方に沿ってやってみたところ、

以下のSide FX LabのTool BarとUpdate ToolsetのIconの表示のところまでは出来ました。

ここからUpdate ToolsetをClickすると

Tutorialでは以下のBoxが表示されていますが、

私のはHoudini Launcherが見つかりません。と言うMessageが書かれたBoxが出て来るだけです。

(ここにそのBoxのScreenshotを貼れたらよかったんですが、私の今のHoudiniは既にSide FX LabのInstallが終わってしまっています。のでこんな感じだったと文章で書くしか出来ません。)

そしてそのBoxにLauncherのある場所のPassを指定するとLauncherが開きます。

でその先はどうしていいのか分からないで終わります。

ここでHoudiniの勉強をしている時のSide FX LabのInstallは中止になりました。

次の日になってYouTubeを見てたら、お勧めに以下のVideoが表示されました。

Install Sidefx - Labs Tools - Easy and straight to point video [17]

これを見たら、Houdini LauncherからSide FX LabをInstallする方法が説明されていました。

やり方は超簡単で

Labs/Packagesを選択してInstallをClickします。

すると以下のような画面が表示されます。

ここまでは昨日も試したんですが、この動画を見たらこの後が有りました。

この画面で5秒位、待っていると以下のような画面が自動で表示されます。

ぬおお!

これは気が付かなかった。

昨日はこの前の画面が表示された時、右下のInstall Buttonを押したりしても何の変化も起きなかったのでそこで諦めました。

なんとただ待っているのが正しかったとは。

もうここまでくれば後は使用したいVersionを選択するだけです。

この動画では以下のVersionを選択していました。

ここでInstall ButtonをClickします。

すると選択したSide FX LabがInstallされます。

以下に私のHoudiniの開いた画面を示します。

Side FX Labがあります。選択するとUpdate ToolsetだけでなくRulerを含めた色々なIconが表示されています。

7.UEFNの勉強

今週もPi Equals Three氏のTutorialをやっていきます。

7.1 Make Anything Face Your Player! UEFN/Creative 2.0 Verse Tutorial [9]を実装します。

先週勉強したMake Anything Face Your Player! UEFN/Creative 2.0 Verse Tutorial [9]を実装します。

<Intro>

特に何もする必要がないのでSkipします。

<Properly Rotating Your Creative Prop>

以下のPropが見つかりませんね。

名前はPNGとなっています。

無いです。

Fabの方にあるかもしれません。

Fabで探してみます。

無いです。

探しても無いんで、以下の狛犬が常にCameraの方を向くようにセットする事にします。

現在、狛犬は以下に示した様な軸に沿って配置されています。

Tutorialでは軸の向きに揃えてStatic Meshの向きを変更しています。

この向きの変更がよく分からないんです。

どっち向きが正しいんでしょうか?

後、狛犬の説明BoxのところにRead Onlyと書かれています。

向きの変更は出来ない気もしています。

今回は向きは直しません。

このまま使用する事にします。

<Creating Verse Device>

新しいVerseのDeviceを作成します。

PNGという名前のPropは使用していないので名前にPNGが入っているのは変ですが、後からこのVerseを探すときにTutorialと違う名前にすると見つけるのが面倒になる可能性もあるので名前はそのままにしました。

Buttonが増えています。

Createを押します。

Png_face_player_device.verseが追加されました。

<Basic Logic Behind Rotating Our Prop>

ここは実装には関係ないです。

<Getting Reference to Player and Prop>

ここからVerseのProgrammingに入ります。

以下のような画面になっていました。

前と比較して得に変化したような感じは無いですね。

Creative_prop型の変数、PNGを作成します。

次に以下の関数を作成しました。

更に以下の変数を作成しました。

Arrayですね。

更に以下の場所でPlayers変数の値をSetしました。

これも何回か使用していますね。

<Creating DoFacePlayer Function>

今度はDoFacePlayer()に以下のCodeを追加します。

勿論、以下のFortnite.com/CharactersはIncludeしています。

<Getting Prop and Player Positions><Getting Prop Forward Vector

Playerの位置を以下の方法で獲得します。

Propの位置も同様の方法で獲得します。

次に以下の実装でPropの向きをPlayer側に移動します。

GetLocalForward()関数の簡単な解説がDefinitionのところにありました。

このPropの正面がどこに向いているのかを取得する関数のようです。

これを見るとPropは元々X方面に正面が向いていると仮定しているようです。

以下のImageを見ると分かりますが

狛犬はX方向を元々向いていません。

このままだと常に左横向きになりそうです。

後、以下に示したUnrealEnigne.com/Temporary/SpatialMathもIncludeしました。

更にPNGFrontにPNGPositionの値を追加します。

これはLocal Positionに変換しているだけだと思います。

先週のBlogでは

と述べていますね。

<Creating Vectors to Delete Z Axis>

Z方向が0のVectorを作成します。

PlayerのZ方向が0の場合です。

PropのZ方向が0の場合です。

PNGFront2DのZ方向が0の場合です。

<Creating Shortest Rotation Between Vectors>

これらの値を使用して回転するのにもっとも短い距離を判定します。

<Rotating Prop>

回転させるために以下の実装を追加しました。

これでVerse側の実装は終わりです。

<Configuring Creative Device>

UEFN側の設定をします。

Buildをします。

Deviceを配置します。

DeviceのParameterにPropをセットします。

狛犬をセットしようとしたら

と表示されてセット出来ません。

あれ?

調べたらPropはBP Classでした。

以下のBPをProp用に作成しました。

Static MeshをComponentsに追加しました。

ついでに狛犬の正面をX方面に揃えました。

このBPの狛犬をLevel上に配置します。

先程のDeviceのPNGにこの狛犬Propをセットします。

今度はしっかりセット出来ました。

<Final Result>

テストします。

あれ?

全く移動しません。

あ、理由が分かりました。

OnBegin()関数内にDoFacePlayer()関数を追加するのを忘れていました。

動く事は動いたんですが

狛犬はずっと横を向いています。

直します。

正面を向くようになりました。

後、以下のPrintを消すのを忘れていました。

左端にHelloが大量に表示されました。

これを消してもう一回テストします。

今度こそ完成しました。

左端にHelloの文字も表示されていません。

8.DirectX12の勉強

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

8.1.1 先週の復習

先週何をやったのか全く覚えていません。先週のBlogを読み直して思い出します。

分かりました。

一応、ProjectのFolderの位置はSample Codeのそれとほぼ同じになりました。

そして最初のTutorialである Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [18]を最後まで勉強しました。

前回勉強した内容はCom Pointerについて何ですが、やっている事はこのTutorialの作者が作成したCom Pointerを使いやすくするためのClassをCopyしてProjectに追加しているだけです。

8.1.2 Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [18]の続きを実装する

DirectX 12が使用出来るのか以下の実装を追加して確認しています。

こんな事もやっていました。

これは試さないといけませんね。

これはSample CodeにCodeが無いので自分で打ち込みました。

テストします。

ぐ。

Errorになってるやん。

まずCursorのSpellが間違っていました。

これを直して、WinInclude.hにあるIncludeしているHeader Fileを全部Main.cppにCopyします。

これで一端テストします。

普通に動いています。

WinInclude.hが読めないのが問題なだけです。

WinInclude.hからHeaderの情報を得る実装に戻してもう一回テストします。

あれ?

出来ています。

一回Rebuildしているので出来てると思います。

今度はCom Pointerの話です。

まずHeaderを作成してそのHeaderを使用出来るかどうかをテストしましょう。

その後でゆっくりとCom Pointerの話を聞く事にします。

Ohjurot/ComPointer.hpp [19]にSource Codeがありました。

これをまるCopyして貼り付けます。

なんかErrorになっています。

Sample Codeの方を見るとIUnknownはStructであると表示されています。

私のProjectだと

IUnknownはUndefinedだと書かれています。

検索したらCudaの実装をしている人達の間で似たような現象が起きている人もいるみたいです。

そこで行われていた解決策はここでは役に立ちそうにありません。

これはTutorialをもう一回勉強しないと解決しなそうです。

一端、ComPointerの実装を全部消してTutorial通りに進める事にします。

8.1.3 Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12Ez] [18]のComPointerをもう一回勉強する

速攻でIunknownについて説明していました。

ComPointerを使用するためのCom APIの事をIunknownとも呼ぶそうです。

このCom APIの目的は以下の2つだそうです。

  • C++やC#で書いたCodeを色々な言語で書かれたCodeと一緒に使用出来るようにする。
  • 複数の色々なCompilerやVersionの違Complierをまたがって使用出来るようにする。

この後もCom APIについて説明していますが、一寸専門的過ぎるのと、どこまでこのTutorialの説明を鵜呑みにして良いのか疑問な点もあるので、この後の説明はSkipします。

この後、普通にIUnknownを使用しています。

うーん。

試してみます。

あれ、普通に使えそう。

Tutorialではこの後、Release()関数を呼び出しています。

普通に呼び出せました。

うーん。

という事は普通にIUnknownは使用出来るって事?

TutorialではRelease()関数の機能について簡単に説明していました。

大体以下のような説明でした。

Com ObjectはRef CounterというReferenceされている数を記録する箇所があるらしく、ReleaseされるたびにそのCount数が減るそうです。

もしRef Counterの値が0になったらそのCom Objectは破壊されるそうです。

うーん。

単なるSmart Pointerですね。

今度はAddRef()関数について説明しています。

うん?

説明を聞いているとRef Countを増やすみたいに言っている気がします。

一寸これは調べて確認します。

公式SiteのIUnknown::AddRef method (unknwn.h)[20]の説明です。

やっぱりRef Countを増やしていました。

それよりもInterface PointerをCopyする度に自分でこの関数を使用してRef Countを増やす必要があるそうです。

こっちの方が大変です。

今度はQueryInterface()関数について説明しています。

この関数はError表示になっていますがArgumentをPassしていないからです。

この関数の機能はIUnknown Objectを別なObjectにCastする事だそうです。

TutorialではID3D12Device*のObjectであるdeviceを

ArgumentにPassしていました。

うーん。

これってPをID3D12DeviceにCastした訳ではないですよね。

だってID3D12Device*のObjectであるdeviceをPassしている訳ですから。

となるとQueryInterface()関数って単なるCastではないという事になります。

QueryInterface()関数の機能も公式のSiteで確認します。

IUnknown::QueryInterface(REFIID,void**) method (unknwn.h) [21]の説明です。

うーん。

よく分からないけど、Com ObjectにこのInterfaceへのPointerがあるかどうかを質問してるって事でしょうか?

このInterfaceが何を指してるのかよく分からないです。

Com ObjectがIUnknownと同じ意味だと仮定します。

Tutorialの説明だとIUnknownには沢山の子Classがあるそうで、ここで使用されているID3D12Deviceもその一つだそうです。

それらの子Classならぬ子Interfaceみたいなのがあってそれを指しているんでしょうか?

つまりID3D12DeviceはCom Objectの子クラスかどうかを聞いているって事なのかなと思いました。

うーん。

もう少し情報が無いと判断出来ないですね。

でもこの仮説が正しいと次の文章の意味がすっきり理解出来ます。

もしInterfaceがCom Objectから派生していた場合は、そのInterfaceから作成されたObjectのPointerを返します。と解釈できます。

だからこのTutorialの例はDeviceというID3D12Device*のObjectをPassしているとなります。

うーん。

これはそんな簡単に理解出来る内容ではなさそうです。

今週のLötwig Fusel氏のD3D12 Beginners Tutorialの勉強はここまでとし、この問題は来週考える事にします。

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

8.2.1 Render Targetの機能について

これを一言で解答出来るようになっておかないと、一体DirectX12の何を勉強してたのと言われかねません。

DirectX 12の魔導書」でRender Targetの定義を調べたらすぐに見つかりました。

描画先

って書かれていました。

GPU内のResourceだそうです。

はい。

よく考えたら英語もそういっていました。

いやDouble Bufferingで描画先って2つあったはず。

どっちがRender Targetなのかと調べたら「DirectX 12の魔導書」にしっかり両方Render Targetだ。って書かれていました。

教科書のその箇所を読み直したら、前の時より3倍くらい理解しました。

うーん。

成程。

8.2.2 先週の復習

「4.2 VertexのInformationの作成」の「4.2.1 Coordination Information」を読んでまとめています。

まとめると言っても別に実装する内容は無いので適当に内容をまとめただけです。

一個だけ疑問があるんですが、教科書に書かれているXMFLOAT3で指定されたVerticesの値は実装する必要があるんでしょうか?

これだけ確認します。

Sample Codeを開いて確認したらChapter 4で使用されているXMFLOAT3を使用したVerticesは以下のものだけでした。

値もVertexの数も「4.2.1 Coordination Information」のVerticesとは違います。

「4.2.1 Coordination Information」のVerticesは実装する必要は無さそうです。

8.2.3 「4.3 Vertex Buffer」を読む

今週はこの節を軽く読む事にします。

CPU側で作成したVertex情報をGPU側に渡します。

そのためにまずGPU側でそのVertex情報を受け取る事が出来るようにGPU内のMemory領域を確保します。

つまりBufferを作成します。

<「4.3.1 ID3D12Resource Object」>

GPU側のMemoryを確保するためにDirectX12では、ID3D12Resource Objectを使用するそうです。教科書ではこのObjectの機能をCPU側でいう所のNewと同じと解説していました。

ID3D12Resource ObjectはID3D12Device:CreateComittedResource()関数を使用して作成するそうです。

ここではCreateComittedResource()関数のParameterについて簡単に説明していましたが、実際の実装方法や実際のCodeなどは書いてなかったです。

<「4.3.2 Vertex heapの設定」>

ここは何の説明をしているのかと思ったら先程のCreateComittedResource()関数の最初のParameterであるD3D12_HEAP_PROPERTIESについて説明していました。

細かい設定については実装する時に勉強します。

<「4.3.3 Resource 設定構造体」>

CreateComittedResource()関数の三番目のParameterであるD3D12_RESOURCE_DESC構造体の設定について解説しています。

それぞれの要素の値の決定方法についてそれなりに詳しい解説がありました。

<「4.3.4 Vertex Bufferの生成」>

やっとここでVertex Bufferを生成します。

CreateComittedResource()関数を実装しています。

この実装は来週やる事にします。

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

9.まとめと感想

なし

10.参照(Reference)

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

[2] CGHOW. (2023, November 4). 822 UE5 VFX tutorials in 0.71$ IS THIS EXPENSIVE ?? [Video]. YouTube. https://www.youtube.com/watch?v=-adQRxv3Vps

[3] Ben Cloward. (2023, March 9). Sharp Text Shader - Advanced Materials - Episode 18 [Video]. YouTube. https://www.youtube.com/watch?v=Euvy_R03rlg

[4] Waldron, J. (n.d.). M. Shear zones. Pressbooks. https://openeducationalberta.ca/introductorystructuralgeology/chapter/m-shear-zones/

[5] Wikipedia contributors. (2022, March 14). Shear zone. Wikipedia. https://en.wikipedia.org/wiki/Shear_zone

[6] Wikipedia contributors. (2023, November 16). Fault (geology). Wikipedia. https://en.wikipedia.org/wiki/Fault_(geology)

[7] Wikipedia contributors. (2023, April 21). Stack (geology). Wikipedia. https://en.wikipedia.org/wiki/Stack_(geology)

[8] Wikipedia contributors. (2022, September 8). Shatter cone. Wikipedia. https://en.wikipedia.org/wiki/Shatter_cone

[9] Wikipedia contributors. (2020, September 2). River terraces (tectonic–climatic interaction). Wikipedia. https://en.wikipedia.org/wiki/River_terraces_(tectonic%E2%80%93climatic_interaction)

[10] Rick Banks. (2022, June 20). Houdini 19 - Wall Tool 02 [Video]. YouTube. https://www.youtube.com/watch?v=J2Tf_OIy9CA

[11] Buckley, M. (n.d.). Ruler | SideFX. https://www.sidefx.com/tutorials/ruler/

[12] Resample. (n.d.). https://www.sidefx.com/docs/houdini/nodes/sop/resample.html

[13] Rick Banks. (2022, June 20). Houdini 19 - Wall Tool 03 [Video]. YouTube. https://www.youtube.com/watch?v=SxZEj504muU

[14] primpoint. (n.d.). https://www.sidefx.com/docs/houdini/vex/functions/primpoint.html

[15] point. (n.d.). https://www.sidefx.com/docs/houdini/expressions/point.html

[16] setpointattrib. (n.d.). https://www.sidefx.com/docs/houdini/vex/functions/setpointattrib.html

[17] MOVFX. (2023, April 5). Install Sidefx - Labs Tools  - Easy and straight to point video [Video]. YouTube. https://www.youtube.com/watch?v=GYWWD-McB7s

[18] Lötwig Fusel. (2023, May 1). Project Setup & ComPointer | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=rF30qoUFDq8

[19] Simple templated COM Pointer class (Because I don’t like the WRL ComPointer). (n.d.). Gist. https://gist.github.com/Ohjurot/e17a5f04e9719a44866b4f38a4f2f680

[20] Stevewhims. (2021, June 29). IUnknown::AddRef - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-addref

[21] Stevewhims. (2021, June 29). IUnknown::AddRef - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-addref