
1. 今週の予定
今週から先週のBlogを読み直してから今週の予定を建てる事にします。
<映像作品としてのLandscapeの作成>
撮影した映像をLuma AIに上げて3D Gaussian Splattingを作成します。
更に Unreal Engine 5 for Architecture - 2023 Full Beginner Course [1]の勉強の続きをやります。
<Niagara の勉強>
「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」の最後の実装が、先週Errorになってしまいました。
この原因を追究します。
<Materialの勉強>
Ben Cloward先生のTutorialを勉強します。
今週は先週勉強した Procedural Brick Distortion - Advanced Materials - Episode 31 [2]の実装をします。
<Gaeaの勉強>
GaeaのTutorialを作成します。
今週は特に何もしないかもしれません。
<UE5.4の新しい機能について>
先週、以下の順番で勉強する事にしました。

今週は Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [3]の実装の続きをやります。
<Houdiniの勉強>
Castle Wall Tool [4]の勉強をやります。
今週はHoudini 19 - Wall Tool 12 [5]を勉強します。
<UEFNの勉強>
本来はMapを公開して少しでもお金を稼ぐのが目的だったはずですが、目的から凄いズレてしまっています。
今週は計画の見直しを考えます。
<DirectX12の勉強>
先週は勉強出来ませんでした。
先々週の勉強を見直すと今週何をすべきなのか大体判明しました。
Lötwig Fusel氏のDirectX12のTutorialではFence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [6]の最後の10分を勉強します。
「DirectX 12の魔導書」は「4.10.3 描画命令」を勉強します。
2. 映像作品としてのLandscapeの作成
2.1 Luma AIを試す
先週作成した3D Gaussian Splattingは地面がぼけてしまっていました。

今週は、同じ被写体を撮影して地面のボケを無くす方法を検討します。
まず、今回は少し下がって撮影しました。
結果です。

地面の周りはやっぱりボケていました。
先週作成した3D Gaussian Splattingです。

先週の方がボケている地面が多いです。
しかし今週の結果もボケている部分は多いです。
花は綺麗に写っています。

こっちの草はボケています。

どの角度から見てもボケていました。
2.2 別のDataを試す
別のVideoから作成した3D Gaussian Splattingです。

こっちは花を集中的に撮影して花にピントを合わせる事を最重要としました。

ブレブレです。
うーん。
元の動画を見て理由が判明しました。
花が風で揺らいていました。
これがピンボケを誘発していました。
うーん。
一つ勉強になった。
2.3 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の勉強の続きをやる
今週は公式SiteのLumen Technical Details [7]を勉強します。

序文から以下のような解説がされていました。

先週あった色々な疑問がこの説明だけでかなり解決しました。
先々週のBlogには以下のように書いていました。

この疑問も一瞬で解決です。
LumenはGlobal IlluminationとReflectionを行うためにRay Tracingを行っているそうです。しかも色々なRay Tracingを何回も行っているそうです。
更にSoftware Ray TracingとHardware Ray Tracingについても解説していました。
先々週のBlogではSoftware Ray TracingとHardware Ray Tracingを以下のように設定していました。


Support Hardware Ray TracingをEnableした上にSoftware Ray Tracingの設定もTweakしていました。
両方使用する事も可能のようですね。
<Surface Cache>
ここはDefaultではSurfaceのために12個のCardsが利用出来るようになっている事。
もっと複雑な形状のMeshを正確に再現したい場合はCardsの数の設定を
以下のMax Lumen Mesh Cardsから変更する事だけ覚えておきます。

このCardが実際は何をやっているのか今一理解出来ません。
おそらくCardがより正確になるとSurface Cacheもより正確になるんでしょう。
以下の設定でSurface Cacheの可視化が出来るみたいです。

以下のように可視化されるそうです。

Pinkの部分はSurface Cacheが無い部分だそうです。
他にも沢山解説が載っていましたが、現状理解出来たのはこれだけでした。
<Screen Tracing>
最初のRay Tracingの方法であるScreen Tracingです。
先週のBlogと先々週のBlogを読み直したんですが、この設定をいじっている箇所が見つかりません。
以下の方法でScreen Tracingの無い状態を見る事も出来るそうです。

<Lumen Ray Tracing>
ここでSoftware Ray TracingとHardware Ray Tracingについて解説しています。
以下の解説がありました。

更にそれぞれの解説がありました。
<Software Ray Tracing>
Software Ray TracingではSigned Distance Fieldsに対してのみRay Tracingが行われるそうです。
このRay TracingはShader Model 5 (SM5)がSupportされているHardならどのHardでも使用出来るそうです。
先週のBlogで確認すると、このProjectではSM6を使用していました。

後、このRay Tracingを使用するためにはProject SettingsのGenerate Mesh Distance FieldsをEnableする必要があるそうです。
Software Ray Tracing Modeのそれぞれの設定の解説もありました。
先週のBlogではこの部分の設定には以下の解説がありました。

うーん。
この説明だと何でSoftware Ray Tracingでこの機能が選択できるのかよく分からないです。
このSiteの解説です。

これなら納得出来ます。
そしてDetail Tracingの方が計算Costがかかりますがその分正確な計算をする事も理解出来ました。
この後、Distance Field Resolution Scalesの値を変更する事で以下のように

distance field representationのMeshの形状をより正確に表す方法を説明していました。
これは今の私では活用できないLevelの精度の話です。
ただこの辺までしっかりやったとしてどれぐらい評価されるのかは不明です。
誰もこんな細かい部分なんて気にしないんじゃないでしょうか?と言う気もします。
<Hardware Ray Tracing>
簡単にまとめるとHardware Ray Tracingの方が性能が良いです。
そしてHardware Ray Tracingを使用するためには
以下の設定をする必要があります。

うーん。
この設定を読むと先週のBlogで以下のようにまとめられていましたが

Tutorialの設定ではHardware Ray Tracingを使用出来ない設定になっているみたいですね。
あれ。
このTutorialを作成した人は本当にこの部分を理解しているんでしょうか?
以下の条件の時にHardware Ray Tracingを使用するそうです。

これ見ると普通にHardware Ray Tracingを使用しているみたいです。
<Large Worlds>
これは後で勉強します。
<Far Field>
この機能を使用すると以下のような遠くのSceneを含む場合でもきれいなLumenを再現出来るそうです。

うーん。
凄い。
ただしこれはHardware Ray Tracingだけについているそうです。
<General Limitations of Lumen Features>
ここは特に重要な情報はないみたいです。
<Lumen Platform Support>
Lumenを使用するためのHardwareの性能が書かれていました。
私のPCは余裕で要求をClearしていましたが、Androidの方はどうなんでしょう?
Vulkanを使用したら制限ありだけど少しはSupportしているみたいです。
<Lumen Visualization Options>
これです。
これが知りたかった。
以下のように説明されていました。

先週、Lumen Sceneにした時は以下のようになりました。

Lumen Sceneは以下のように解説されていますが、
![]()
Lumenを起動したらこんな変な画面になってしまうって事でしょうか?
<Troubleshooting Topics>
何の情報もないです。
<Problem-Causing Meshes>
具体的な例とその解決法が載っていました。
以上です。
2.4 Lumen Technical Details [7]を勉強した感想
かなりLumenについて理解が深まりました。
その結果ですが、Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の設定って間違っている気がします。
まず以下の部分ですが

Hardware Ray Tracingが使用出来ない設定になっています。
そのくせ、

はEnableしています。
うーん。
どうしよう。
他のTutorialでここまで解説しているのは無いかもしれないし。
取りあえずは最後まで勉強しますか。
3.Niagaraの勉強
先週完成したと思ったFluid Simulationの実装はErrorになってしまいました。
あんまり深く考えなくても教科書とSample Codeの実装に沿って作っていけば完成するだろうと高をくくっていたらこんな結果になってしまいました。
今週はこのErrorを直します。
3.1 Errorの原因を追究する
取りあえずSample Codeと比較して結果が違う箇所の原因を探ります。
まずSample CodeのCameraからみた画像です。

水に色がついています。
私のProjectのCameraから見た画像です。

水が透明になっているんです。
ここがまず違います。
水に色を追加する部分の実装のどこかを間違えていると思われます。
この部分の原因から探っていきます。
うーん。
今度はRT_WaterThicknessの画像に問題がある事が分かりました。
以下に示した様にSample CodeではLevel上のFluid SimulationとRT_WaterThicknessの画像が同じになっていますが、

私のProjectではLevel上のFluid SimulationとRT_WaterThicknessの画像は以下のようになっていて

全く違う画像になっています。
更にRT_WaterDiffuseAndSpecularの画像もSample Codeでは以下に示した様に

透明な部分は無いですが、
私のProjectの方のRT_WaterDiffuseAndSpecularの画像は以下のようになっていて

脇が透明になっている感じがします。
後、単純に撮影しているCameraの位置が遠すぎでSimulationがよく見えません。
もうこれはCameraの位置の設定から直したいですね。
うーん。最初からやり直すか。
教科書を読み直したら、最初はNiagaraのEmitterの設定をチクチクやっています。
流石にその部分に間違いがあるとは思えません。
SceneCapture2D_Thicknessの設定の部分を読んでいたら

Cine Camera ActorにAttachした後は、Transformの値をDefaultに戻せ。と書かれていました。
なってなかったです。
直しました。

RT_WaterThicknessの画像です。

Levelと同じ位置を写すようになりました。
うーん。
一個Errorが直りました。
このCameraの位置では見にくいのでCameraの位置を変更します。

BackgroundのImageは後で撮影します。
RT_WaterDiffuseAndSpecular とRT_WaterThicknessの画像も以下のように変化しました。


うーん。
RT_WaterDiffuseAndSpecularの画像がオカシイです。
しかしこれが実装が間違っているからか、元々のParticleの大きさや数が違っているのが原因だからなのかが分かりません。
PP_DiffuseAndSpecularの実装を確認します。
一個間違いを発見しました。
以下の部分のCamera Direction Vectorノードの結果に-1を掛けるのを忘れていました。

直しました。
RT_WaterDiffuseAndSpecularの画像です。

おお。
前よりは格段に良くなりました。
ただよく見ると
以下のように粒粒が生成されているのは元のままです。

これは生成するParticleのSizeと数の問題な気がします。
Emitterの設定を確認します。
ParticleのSizeと数は以下の部分で設定されていました。

Sample Codeと同じ値に変更しました。
RT_WaterDiffuseAndSpecularの画像です。

ううん。
前よりはかなり液体っぽくなっています。
これで一端結果を確認します。
RT_WaterThicknessの結果です。

PP_Compositeの以下の部分の実装が間違っていましたので直しました。

Cine Camera Actorから見た結果です。

Background Imageを直すのを忘れていました。
ああ。空のAssetを既に消してしまっています。
もう背景の撮影は出来ません。
ここは諦めます。
結果です。

うん。
十分でしょう。
FluidのSimulationになっています。
これで完成とします。
3.2 Fluid Simulationを勉強した感想
やっとFluid Simulationが完成しました。
このようなFluid Simulationは昔から作成したかったんですが、どう計算しているのか分からなくていつも挫折していました。
挫折する箇所はいつも同じで、
- Particleの計算方法がよく分からない箇所がある
- Particleから液体を生成する方法が分らない
で詰まってしまっていました。
UEの勉強を始めてすっかりその事を忘れていたんですが、今回たまたま「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強していてこの流体のSimulationに出会い、それこそ数年越しにFluid Simulationの作成方法を理解しさらに自分で実装する事が出来ました。
うーん。
感慨深いです。
こんな方法で実装していたのかとかなり感動しています。
今度はDirectX12から直接、流体のSimulationを実装してみたいですね。
3.3「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を勉強した感想
この教科書で勉強するのも今回が最後です。
ので勉強終わった上での感想をまとめておきます。
まず後半の内容はかなり勉強し甲斐がありました。
特にSimulationの理論の説明は簡易でありながら、その本質を捕らえた説明であって非常に分かり易かったです。
後、数式の解説も分かり易かったです。
3.4 Niagaraの勉強について
今週でNiagaraの勉強も一端お休みになります。来週からはAIの勉強を代わりにします。
AIの勉強としてまずはJeremy Howard氏のPractical Deep Learning for Coders [8]を勉強します。
Niagaraはかなり勉強しましたし、その内容はかなり理解しましたが、Businessに繋がるような結果にはならなかったですね。
CGHOW氏もYouTubeでTutorialの公開を止めてしまってMembershipだけの公開に変更してしまいました。
Niagaraだけ勉強してもそんな結果しか得られないという事も判明しました。
まあ、どこかで役に立つ知識である事は間違いないしょう。
4.Materialの勉強
今週は先週勉強した Procedural Brick Distortion - Advanced Materials - Episode 31 [2]の実装をします。
Noiseノードを追加します。

Functionの設定をFast Gradient – 3D Textureに変更しました。

Texture Coordinateノードの結果に0をAppendした値をNoiseのPositionにPassしました。

Noiseの計算結果をPreviewで見ました。

うん。
Tutorialの結果と同じですね。
Levelの値を1に変更しました。

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

更にMinとMaxの値も以下のように変更しました。

結果です。

これもTutorialの結果と同じです。
TurbulenceをOffにしました。

今度はScaleの値を3に変更しました。

結果です。

まぶしくてどこが変わったのがよく分かりませんね。
でもこの辺のParameterはただ歪みを追加するためのParameterなのでそんなに真剣に同じにする必要はないと思っています。
のでそんなに気にしないで先に進みます。
MinとMaxの値を以下のように変更しました。

この結果をBrickの結果に足します。
以下のように追加していました。

更にこの結果をHash23ノードに繋がるFloorノードにもつなげていました。

結果です。

うーん。
あんまり変わってない。
近づいてみます。

お、少しだけ歪んでいました。
うん。
出来ましたね。
Noiseの値を一寸だけいじってみます。
Scaleの値を1にしました。

結果です。

歪みが無くなりました。
今度はScaleの値を5にしました。

結果です。

歪みがはっきりしていますね。
でも歪み方が一律になっていますね。
他のParameterも色々弄りましたが結果はそんなには変化しませんでした。
以上です。
5.Gaeaの勉強
今週はGaeaの勉強はお休みします。
6.UE5.4の新しい機能について
6.1 Unreal Engine 5.4: Create STUNNING Product Commercials with Motion Design [3]の実装の続きをやる
<Setting up the Camera>
Cameraからの映像が以下のようになるようにCameraの位置を移動しました。

そしてCinematic Viewportに切り替えます。

Gridを選択します。

以下のようにGridが表示されました。

Canの位置を中央に揃えました。

Cameraの位置が決定したらBookmarkも追加しました。
そしてLens Settingsの値を以下のようにしました。

Cameraから見た画像です。

うーん。
Tutorialではこの時点で

こんな感じになっています。
これは後で確認します。
Focus MethodをTrackingに変更します。

Cameraからの映像が以下のようになりました。

ボケて何も見えません。
Actor to TrackにこのCanをセットします。

ピントが合いました。

Tutorialの方での確認もしました。
PlaneからのEmitterの色がものすごく弱かったです。
それで白く見えているみたいです。
私のProjectの方も以下のように調整しました。

良い感じです。
<Using Light Actors>
なんとここでRectangular Lightを配置していました。
このRectangular Lightで光の色を追加していたみたいです。
試しに以下のように左側のPlaneにそって一個だけ追加してみました。

光の色を水色に変更したりRectangular Lightの形状を変更したりしました。

Cameraから見た画像です。

Intensityの値を1.0にまで下げました。

結果です。

全く変化しません。
RectLightを消してみました。
![]()
全く変化しません。

全部のLightを消して確認したところ以下のようにCanに光が届くようにするには

Intensityの値を15cdにする必要がありました。

この状態だと全部のLightを切ってもいかのような光がつきます

Lightの色を調整したら以下のように青くなりました。

Rectangular Lightの形状と位置を以下のように移動させました。

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

うーん。
私の場合はPlaneからの光だけで青とオレンジの色合いを生成出来ていたのでここで敢えてRectangular Lightで青とオレンジの色合いを出す必要は無い気もしています。
しかしEmissive Lightの色だけで光を生成した場合、Global Illuminationかなんかで問題が発生した記憶があります。
ここはRectangular Lightで青とオレンジの色合いを出すようにLevelの配置を直します。
Rectangular Lightが無い状態です。

Rectangular Lightの左側を追加した状態です。

Rectangular Lightで色合いの変化を出す事に成功しています。
右側にOrangeのRectangular Lightを追加しました。

すっごい綺麗です。
上に白のRectangular Lightを追加しました。

すっごい綺麗です。
<Post Process Volume>
Post Process Volumeを追加しました。

Infinite Extent(Unbound)をEnableしました。

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

Cameraから見た結果です。

良い感じですね。
<Positioning and Movement of Can>
回転を掛けました。
![]()

ここからCanにNull Actorを追加します。
SM_Soda Canを選択します。
![]()
その状態で以下のIconを押します。


あれ、私のSoda CanはSequenceになっています。
どういう事?
うーん。
今回はこのままやってみます。
どこかで躓いたらそこでやり直す事にします。
Null Actorの名前をCTRL_Canと名付けました。

そしてSequencerに追加しました。
いや私のSequencerには既にCanが存在しています。

どこかで間違えたみたいですね。
一回消して以下のように追加したら

Canが消えてしまいました。

理由が分かりました。
CanのLocationを0に戻す必要がありました。
![]()
CTRL_CanにTransformを追加しました。

SequenceのFPSの値を60に変更します。

Endの値を300にしました。

Sequenceの最後を示す赤いLineが300の位置に止まっています。

以下の部分の値を60に変更しました。
![]()
白いBarが60の位置に移動しました。

この位置でCTRL_CanのLocationのKey Frameを追加しました。

今度はFrameの位置を0にします。
![]()
CanをCameraから見えない位置に移動して

あれ、なんか四角いのが写っています。
何これ?

消えてる?
うーん。
取りあえずはこのままやります。
Key Frameに追加しました。

以下の丸をClickして

以下のBoxを開きました。

Exponentialに変更しました。

再生して確認するとCanが下から飛び出してきました。
60にあったFrame Keyを90に移動させました。


と書いていましたが、単に選択して引っ張ったら動きました。
今度はRotationのFrameを追加します。
0の位置でRotationのFrame Keyを追加しました。

Frameの位置を300に移動しました。

ここにもFrame Keyも追加しました。

Rotationを開きます。

XYZではなくRoll、Pitch、Yawとなっています。
TutorialではXYの値を消す。とありましたが、XYはないのでRollとPitchを消しました。

Frameが0のKey FrameにYawの値、360を追加します。

結果です。
以下のように回転しています。

以下のように回転してほしいはずです。

Tutorialで確認します。
最初の回転であっていました。
今度は回転の速度を調整します。
最初は速くて後はゆっくりにします。
以下のKey Frameを選択した状態で
![]()
以下のKey Frameを押します。

すると以下のBoxが開きます。

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

2024-04-14のBlogはここで終わっているので今週はここまでにしておきます。
残りは来週やります。
7.Houdiniの勉強
7.1 Houdini 19 - Wall Tool 12 [5]を勉強する
Clean UpとDigital Assetの作成を行うそうです。
<Clean UP>
Color_TintGroutノードのClassの値をPrimitivesに変更しました。

更に以下の位置にGroupノードを追加します。

そしてGroup Nameの値をGroutに変更しました。

Merge3ノードを選択し

更にiを選択します。

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

以下の部分を見ると

沢山のAttributeが存在している事が分かります。
これらのAttributeのほとんどは必要ありません。
ので消します。
以下に示したAttribute Delete1ノードを追加します。

以下に示した方法で必要ないAttributeを消します。

同様の事をGroupにも行います。
Group Deleteノードを追加します。

以下のように設定します。

Outputノードを追加します。

名前をOutput_BrickWallOutputとします。

ここからDigital Assetを作成するそうです。
全部を選択します。

以下のIconを押します。

なんと一個のNodeになってしまいました。

更にこのNodeにBrick Wall Toolと名付けました。
右ClickしてDigital Assetを選択します。

<Create A Digital Asset>
以下のBoxが表示されました。

これは単なるSaveするための設定のようです。
以下のように変更していました。

Acceptを押すと以下のWindowが表示されます。

Maximum Inputsの値を2に変更しました。

次はParameterの設定です。
![]()
最初は高Polygonの結果と低Polygonの結果の表示を選択出来るParameterを作成するそうです。
以下のCreate ParameterからToggleをDrag and Dropして

Existing Parametersに追加します。

追加したら名前がLebelに変化しました。
何ででしょう?
名前をBuildModeToggleに変更しました。

更にLabelの値をBuild Modeに変更しました。

右下のApplyを押しました。

更にAcceptを押しました。
Windowが閉じて元の画面に戻って来ました。
Brick Wall Tool Buildノードを選択すると

以下のように

先程追加したBuild Modeが表示されています。
今度はBrick Wall Tool Buildノードの中を開いて以下の場所にNullノードを追加しました。

更に以下の場所にSwitchノードを追加しました。

このSwitchノードは以下のように繋ぎます。

更にNullノードの結果を繋ぎます。

以下の箇所をClickして以下のBoxを開き、Type Propertiesを選択します。

さっきのWindowが開きました。

一番右端にある以下の部分に

SwitchノードのSelect InputをDragして?

以下の場所にDropします。

以下のように変化しました。

これでToggleの機能が追加されたそうです。
そうなのか?
テストしています。
今度は以下のParameterを選択しました。

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

Build ModeがOffの状態です。

Onの状態です。

うーん。
何でこうなるのか不明です。
<User Interface Layouts>
またType Propertiesを開きました。

ここにParameterを追加していくみたいです。
以下の黄色くしたNodeが持っているParameterの事です。

ただし全部はやらないそうです。
最初の数個だけやり方を見せるので、後は自分でやるようにと言っていました。
<Line Width>
Line WidthノードのLengthをDrag and Dropして

Type Propertiesの以下のRootにDropします。

以下の場所の値も変えていました。

Nameの方のSpellは間違っていますね。Wall Lengthが正しい名前です。
Channelの以下の部分の値が3になっているか確認しています。

<Line Height>
今度はLine Heightノードです。

Line Widthノードの時と同じようにLengthをDragして

Type Propertiesの以下の部分のRootにDropしました。

名前も同様に変更していました。

<Brick Rose>
今度はBrick Rowノードです。

Resample Brick RowノードのParameterであるSegmentをDrag and DropしてType Propertiesの以下の場所のRootにDropしていました。

名前は以下のように変更しました。

以下の場所からDefaultの値が6になっているのも確認していました。

最後にParameterのRangeの値を調整していました。
以下に示したのはWall HeightのRangeです。

0.1から10に変更して更に鍵をかけていました。
Wall Lengthでは以下の値になっていました。

もうこれで完成かと思ったら今度は以下に示した様に
Type Propertiesの以下の場所から

Wall Length、Wall Height、そしてRowsを選択して右ClickしてBoxを表示させPut Parameters in New Folderを選択します。
以下のようになりました。

確かにFolder内に移動しています。
Folderの名前を以下のように変更しました。

更にFolder TypeをSimpleに変更しました。
![]()
残りのParameterは自分でやらないといけないそうです。
以上でした。
8.UEFNの勉強
もともとUEFNの勉強を始めたのは、Epic Games社がFortniteで稼いだ金の何割かを還元すると言ったのでそれで勉強を始めたんでした。
調べたら2023-03-27のblogにその話がまとめられていました。

しかし今のところMapを作成して公開する所まで全く出来ていません。
しかも公開したとしても、これだけ沢山のMapが既に公開されている状態で、誰かが私のMapにPlayしに来るとは思えません。
で、このまま勉強を続けても意味がないかもしれない。と思い始めています。
その辺、今までどう考えていたのかとか、これからどうすべきなのかとかをまとめ直すべきだと思い今週はその辺をここにまとめる予定でした。
ところが、その辺を考えていたら売れるSoftwareとは何なのかという事が稲妻のように脳裏をよぎりました。
これは凄いIdeaなんですが、このままだと忘れてしまうので、それをここにまとめます。
その上で、何故生成AIがこれから売れていくのか。とかもそのIdeaを発展させて考察します。
その後で時間があったらそれらの考察を踏まえて売れるUEFNのMapの生成が出来るのかどうかをもう一度考察します。
8.1 売れるSoftwareとはどんなSoftwareなのか?
Softwareの本質的な価値とは、何かという事をここにまとめます。
それは「ある情報をその情報が必要な人に提供する。」という事です。
例えば「来週の日曜日は、○○湾に午前7:00頃にアジの群れが回遊してくる。」という情報があったとします。
その情報を、来週の日曜日に○○湾に釣りに行く人に提供する事が出来るSoftwareがあったらそのSoftwareには価値が生まれる訳です。
そしてそれがお金を生むんです。
結局、Softwareって情報しか伝達していません。
情報をその情報が必要な人に届けられるかどうかだけがそのSoftwareに価値を追加します。
例えばGoogle検索です。
検索者は欲しい情報があります。
その情報に関するKeywordを入力するとGoogleはそれに関連する情報が書かれたSiteの一覧を紹介してくれます。
そしてこの観点から考えると、本当のSoftwareの定義はいわゆる一般的なSoftwareの定義とはかなり違うものである事も見えてきます。
いわゆる一般的なSoftwareの定義はPCやMacでProgramming言語を用いて作成された特定の媒体上で動くAppの事です。
しかし世の中にはそういうAppでは無くても情報をその情報が必要な人に届ける媒体は沢山あります。
例えばDrive Recorderです。
Drive Recorderは事故があった時にどんな風に事故にあったのかを客観的な情報として記録しています。
そしてその情報を保険会社やもしくは裁判所か警察に提出する事で、事故の正しい情報をその情報が欲しい人達に伝えています。
これは完全にはSoftwareとは言えませんが、ある情報をその情報が必要な人に伝達するという意味では今のSoftwareの定義そのものの機能を持っています。
8.2 生成AIがこれからのSoftware Businessに革命をもたらす理由
この情報の伝達と言う観点からSoftwareを見るとData Miningから始まったBig Dataの管理とそこから必要な情報を抜く出してくるためのDatabaseの技術が非常に重要になって来ます。
会社は顧客のDataを死ぬほど持っています。
しかしそのDataを有効活用する事はあまりできていません。
その有効活用するための技術として発達したのが昔のData MiningやBig Dataの管理方法、そしてそのためのSpecialistとしてのData Scientistの存在です。
しかし高額なお金を払ってData Scientistを雇ったのに、折れ線Graphの表一枚しか出てこんかった。みたいな話ばかりになってその費用対効果にかなり疑いの目が向けられ、大量解雇される事態になりました。
それに対して生成AIは入力したDataに対して、単に質問するだけで適切な情報を拾いあげ、更に簡潔にまとめて説明してくれます。
従業員の業務日誌を例にして説明します。
全従業員の業務日誌をData化してPCで管理したとします。
今までは、例えば3月15日に○○さんは何をしたのか。という直接的な情報しか抽出出来ませんでした。
ところが生成AIだと、もっと間接的、抽象的な質問から具体的な解答を引き出す事が出来るようになりました。
例えば
「3月14日に金庫から現金が3万円程消えたんだけと、犯人である可能性のある従業員の名前とその理由を述べて」
みたいな質問でもAIは的確な解答を返してくれます。
勿論、AIですのでHallucinationを起こしている可能性は常に考慮する必要がありますので、AIが答えた結果が正しいのかを確認する作業は常にやる事は必要になりますが。
9.DirectX12の勉強
9.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
9.1.1 Fence & Command List | D3D12 Beginners Tutorial [D3D12Ez] [6]の最後の10分を勉強する
今週やるのはこれだけです。
DispatchCommandList()関数にListsを追加しました。

この辺はExecuteCommandList()関数を数週間も追いかけていたので、もう自明の構造になりました。
更にSignal and Wait()関数を追加しました。

今度はMain.cppに戻って来ました。
Whileを追加しました。

Whileの中を実装していきます。

InitCommandList()関数を使用します。
ここに来てDispatchCommandList()関数の名前を

ExecuteCommandList()関数にかえてしまいました。

うーん。
混乱する。
そしてMain.cpp内の以下の箇所にExecuteCommandList()関数を追加します。

ここでテストするために実行したら以下のような大量のErrorが表示されていました。

Close()関数をExecuteCommandList()関数に追加しました。

Tutorialではこれが無かったからErrorになったと言っています。
最終的には以下のような実装になりました。

今度は実行してもErrorにはなりませんでした。
しかし以下に示した様な大量のMemoryを消費してしまっています。

これはDirectX12のLibraryが巨大なためだからだそうです。
Release Modeで実行してみましたが、それでも62MBも消費しています。

これでこのTutorialは終わっていました。
一寸短いですが、今週のD3D12 Beginners Tutorial [D3D12Ez]の勉強はここまでとします。
9.2 「DirectX 12の魔導書」の勉強
9.2.1 「4.10.3 描画命令」を勉強する
この節は4.10の中でもっとも複雑だったはずです。
気合を入れて勉強していきます。
以下の命令をCommandListに追加するそうです。
- Pipeline StateのSet
- Root SignatureのSet
- ViewportとScissor RectangleのSet
- Primitive TopologyのSet
- Vertex InformationのSet
- Drawを命令する
なんか凄い事をするのかと思ったら今まで作成したものを全部セットしているだけみたいです。
全部セットしたらDrawの命令を出す事が出来る訳ですね。
<「1.Pipeline StateのSet」について>
む、Setの方法以前にPipeline Stateが何をするのかを忘れてしまいました。
これは前に調べたはずです。Blogを見直します。
2024-04-28のBlogに以下の説明がありました。

以下の部分がPipeline Stateを説明していました。

日本語訳も次いでにつけておきます。

以下の方法でPipeline Stateはセットしていました。
![]()
<「2. Root SignatureのSet」について>
以下に示したSetGraphicRootSingature()関数を使用していました。
![]()
教科書ではこの関数について特に何も説明していませんでした。
<「3. ViewportとScissor RectangleのSet」について>
教科書にはこの部分の供述はありません。
Sample Codeを見ると

先程追加したSetGraphicRootSingature()関数の手前でRSSetViewports()関数とRSSetScissorRects()関数を使用してViewportとScissor Rectangleをセットしていました。
<「4. Primitive TopologyのSet」について>
Primitive TopologyはVertexをどう組み合わせてPolygonを生成するのかを指定します。
以下に示した様にIASetPrimitiveTopology()関数を使用してセットしていました。

D3D_PRIMITIVE_TOPOLOGY_TRIANGLELISTは公式SiteのD3D_PRIMITIVE_TOPOLOGY enumeration (d3dcommon.h)[9]によると

という意味だそうです。
<「5. Vertex InformationのSet」について>
Vertexの情報は以下に示したIASetVertexBuffers()関数を使用してSetするそうです。
![]()
今回は一個のVertexしかないからArrayは使用しないで&で値をPassしているそうです。
教科書の説明によると、最初のParameterはSlotの番号、二番目のParameterはVertex Buffer Viewの数、そして三番目のParameterにはVertexのDataをセットするそうです。
Slotの番号って具体的に何を指しているんでしょうか。
公式SiteのID3D12GraphicsCommandList::IASetVertexBuffers method (d3d12.h)[10]には

と説明されていました。
0をセットしておけば良いみたいです。
教科書には書かれていませんでしたが、この後に以下に示したIASetIndexBuffer()関数が使用されていました。

<「6. Drawを命令する」について>
そして最後にDrawInstanced()関数が使用されていました。
![]()
教科書によると
最初のParameterはVertexの数、2番目のParameterはInstanceの数、3番目のParameterはVertexのOffset、そして4番目のParameterはInstanceのOffsetを表しているそうです。
Instanceの数って何?と思ったら教科書に説明が書かれていました。
同じPolygonを何個表示するのかを指定するそうです。
成程、だからInstanceなのか。
これって一個以上必要になる事あるんでしょうか?
これで完成だそうです。
教科書ではこの時点で実行して三角形の図形が表示されています。
<「いろいろ試してみよう」を読む>
Vertexの値を変更したりしていました。
Sample CodeのVertexの値は以下のようになっていました。

これだと四角形になりそうですが。
左上と右上の値が同じなのか。
こういう書き方をしないとPolygonが閉じないのかもしれません。
更にPixel ShaderのReturn値を以下のように変更していました。

以上でした。
実装は来週します。
10. まとめと感想
特にないです。
11. 参照(Reference)
[1] Gediminas Kirdeikis. (2023, April 30). Unreal Engine 5 for Architecture - Full Beginner course [Video]. YouTube. https://www.youtube.com/watch?v=bT8aSTkpkDY
[2] Ben Cloward. (2023, November 23). Procedural Brick Distortion - Advanced Materials - Episode 31 [Video]. YouTube. https://www.youtube.com/watch?v=TBheGAKQeu4
[3] Reality Forge. (2024, March 29). Unreal Engine 5.4: Create a Product Commercials with Motion Design [Video]. YouTube. https://www.youtube.com/watch?v=yWQIz5yzTrw
[4] Castle Wall Tool. (n.d.). https://www.youtube.com/playlist?list=PLNbgmFvU__fiPhyUWHHzZ2Nv5ieM_bOdB
[5] Rick Banks. (2022, June 22). Houdini 19 - Wall Tool 12 [Video]. YouTube. https://www.youtube.com/watch?v=Bi-9UwB_B1Q
[6] Lötwig Fusel. (2023, May 22). Fence & Command List | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=KsCZDeJDXDQ
[7] Lumen Technical details in Unreal Engine | Unreal Engine 5.4 Documentation | EPic Developer Community. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-technical-details-in-unreal-engine
[8] Howard, J. (n.d.). Practical deep learning for coders. YouTube. https://www.youtube.com/playlist?list=PLfYUBJiXbdtSvpQjSnJJ_PmDQB_VyT5iU
[9] Stevewhims. (2023, February 14). D3D_PRIMITIVE_TOPOLOGY (d3dcommon.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3dcommon/ne-d3dcommon-d3d_primitive_topology
[10] Stevewhims. (2024, February 22). ID3D12GraphicsCommandList::IASetVertexBuffers (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-iasetvertexbuffers