UE4の勉強記録

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

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