UE4の勉強記録

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

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

1. 今週の予定

1.1 今週の予定

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

<Landscapeの作成>

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

Niagara & Materialの勉強>

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

<Materialの勉強>

Ben Cloward先生のTutorialが復活しました。のでBen Cloward先生のTutorialの何かを勉強します。

<Gaeaの勉強>

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

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

<Houdiniの勉強>

今週もHoudiniの勉強はお休みしてUEのPCGの勉強をやります。

Nodes of Nature氏のPCG Building in Unreal Engine [1]の実装をやります。

<UEFNの勉強>

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

<DirectX12の勉強>

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

2. Landscapeの作成

2.1 先週の復習について

先週は以下の場所まで作成しました。

来週から地面を直していくと書いていました。

2.2 地面のMaterialを直します

取りあえず以下のMaterialを使用してみます。

こんな感じにMaterialに追加しました。

単に前はColorを使用していた箇所をこの2つのMaterialで置き換えただけです。

MaterialのSizeが2x2mだったのでTexCoord[0]に0.5を掛けました。

結果です。

先週配置したCameraを通してのImageです。

Landscape全体のImageです。

地面が少し白過ぎますね。

何も考えないで作成したのであれですけど、こんな箇所に一軒しか家がないってどんな環境なんでしょうか?

別な角度から建物を撮影しました。

地面をもっと黒くする必要があります。

色々なParameterを弄ってこんな感じにしました。

Textureの設定を弄る事で色を暗くする方法があったはずですが、これのやり方を忘れてしまいました。

調べます。

やり方は覚えていませんが、どこで習ったのかは覚えています。

Landscapeの洞窟を作成した時です。

Landscapeの洞窟の作成方法はNumenBrothers氏のTutorialで勉強しました。

そこから自分のBlogを検索したら2023-05-01のBlogにやり方がまとめられていました。

TextureのSaturationとRGB Curveの値を変更するそうです。

これも試してみます。

T_Canyon_Rocky_Ground_vefmeccn_2K_Dの

SaturationとRGB Curveの値を見てみます。

どっちも1になっています。

これを

に変更しました。

結果です。

おお、地面が大分黒くなりました。

Directional Lightの向きを変えてみました。

地面が白過ぎる事は無くなりました。

別な角度から見た場合です。

地面のTextureのSizeも丁度よさそうです。

建物の土台のレンガのサイズがオカシイです。

直します。

直しました。

何か違和感を感じると思ったんですが分かりました。

竹や笹がないんです。

Marketplaceで探したら無料のものは無いですね。

Quixel Bridgeにも竹関連のモノはこれしかないです。

Scatchfabにはそれなりにありました。

ただ質が十分は不明です。

これはTutorialの先を勉強してからImportするか考えましょう。

2.2 Unreal Engine 5 for Architecture - 2023 Full Beginner Course [2]の続きを見る

Tutorialで勉強したところは全て実装してしまったので、またTutorialを見る事にします。

<Camera Setup>

以下のSphereを配置したところまで勉強しました。

続きを勉強します。

Color GradingのTemperatureについて解説しています。

配置したCameraのParameterです。

この値は最後に調整するのが通常だそうです。

Color Grading内のShadowsのContrastの値を調整しています。

これも設定は変えませんでした。

2つ目のCameraの設定です。

最初のCameraからDuplicateして作成します。

適当な位置に配置したらPilotで移動します。

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

Current Focal Lengthの機能については2023-09-11のBlogで解説しています。

Cameraから見えるImageを遮る木を消して以下のようになりました。

これをCGであるか本物であるか判別するのは難しいです。

CameraのFocus Settingを調整します。

これってどんな機能だったけ。と思ったら以下の機能でした。

こういうのは慌てて詰め込んで覚えようとしても覚えられるものではありません。

ゆっくりじっくりと勉強する必要があります。

今度は建物の内側に3つ目のCameraを設置しました。

建物の内側は作成していません。

うーん。

どうしよう。

先を見てから考えます。

どうやらこの先はずっと建物の内部の撮影方法についてのTutorialみたいです。

となると建物の内部も作成する必要があります。

うーん。

これも大変だ。

来週は建物の内部を作成する事にします。

2.3 大昔に勝った建築関係の人が勉強するUEの本を見直す

まだUEの右も左も分からない時期にこの本を買ったんですが全く読んでなかったです。

今、見たら何か勉強になる事があるかもしれません。

軽く読んでみる事にします。

対象とする読者をしっかり定義していました。

これは結構大切な事で、大体、本でも講義でも内容に文句を言う人は製作者が想像している対象者から外れている人達です。

最初に対象となる人達を宣言する事で後で受ける抗議を大幅に減らす事が出来ます。

Part1の3D Maxについての解説は読んでも分からないのでSkipします。

Chapter 8のLightingについてです。

この辺の内容はかなり勉強になります。

UE5でも十分に通じる内容が説明されていますね。

HDRIとか今でもよく分かってない事もここで説明されていました。

IES配光データについての解説なんか、凄いですね。

何億円もする家を購入する人はこんな所まで気にして家を建築するんでしょうか?

そう言えば気まぐれクックさんが新しいStudioを建築した後で、

「Lightの色合いが想像していたのと違って、魚が美味しく撮影出来ないかもしれない。」

と言っていたのを思い出しました。

やっぱりカタカナ表記は非常に読みにくいです。

これってこの本に限った事では無いですが、日本全体で法律かなんかで一気に止めて英語表記に変更すべきです。

昔は、英語表記にすると読み方が分からなかったんです。

のでカタカナで表記したんです。

今なら英語表記にしたってネットで5秒も検索すれば発音なんてすぐに判明しますから、英語表記にしても何ら問題ないです。

Post ProcessのところでWhite Balanceについての解説がありました。

Bloom、Auto ExploreそしてLens Flareの説明もありました。

この辺は建築用のUEの使用方法では基礎なのかもしれません。

取りあえず10章の途中まで読みました。

2.4 本を読んだ感想

うーん。

この質の高さは個人が情報をちまちま集めて出来るLevelじゃないです。

Epic Games社の誰かが建築用のUE使用方法についてのManualを作成しているはずです。

まあ、ぼちぼち勉強していくしかないですね。

今の建築業界におけるUE5の使用量はどうなっているんでしょうか?

2億とか3億とかする高級住宅を購入する人達は、家を建築する前にVRで確認したいとは思いますが、そのためにこれを作成するのは更に少なくないお金がかかる気がします。

家が完成したらこの仮想空間上の家は全く必要無くなるのでそんなに需要があるとも思えません。

NFTなどで

「仮想空間上に完成した家を売れる。」

とかが無いと需要が無くなってしまう気もします。

3. Niagaraの勉強

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

今週も「Unreal Engine 5で学ぶビジュアルエフェクト実装 基本機能からNiagara、シミュレーションまで」を読んでその感想をまとめていきます。

GPU Simulation Stageの概要>

この辺から少しずつ知らない事が増えています。

Attribute Spread Sheetについてはこんなのが有る事すら知りませんでした。

この辺はやっぱり実際にやらないと理解出来ないです。

ただこれ本の内容なので一般に公開しているBlog上で実際に試していいんでしょうか?

DirectX12の本の内容はこのBlog上で実際に試していますが、Blog上で公開している本の内容はMIT Licenseで公開されているSample Codeのみに限っています。

更に言うと、これらの教科書もMicrosoft社が公開しているDirectX12のDocumentの内容をそのまま使用していたりしているので、

DirectX12のDocumentの引用と言う形で紹介しているので、実際の本の内容を記述する事無しに、その本に書かれている内容を再現しています。

何故、こんな形状に私がこだわっているのかと言うと、結局著作権に違反するのかどうかと言うのは、その著作者の利益を損なってしまっているのかどうかという点が最も重要だと考えているからです。

先程のDirectX12の教科書の場合は、私のBlogを見てもその教科書が無いと勉強した内容を理解して実装するのは不可能です。

ただしDirectX12の教科書を持っている人にとっては私のBlogを見る事は非常に参考になり、理解が進むのが速くなる訳です。

たから私は究極的には私のBlogは著作権を違反していない。と考えている訳です。

後は、苦情が来るかどうかです。

もし苦情が来たら消します。

そう言えばCGHOW氏も最近Niagara SimulationのTutorialを沢山上げていました。

そっちの内容もこの本と似ているならNiagara Simulationの勉強はそっちを主にしてこの本は副にするのもありかもしれません。

取りあえず、今週はこの本を最後まで読む事にします。

<魚の群れのSimulation>

これはかなり勉強になりました。

出来れば3章位からこういう内容にして欲しかったです。

Boidsなんて初めて知りました。

こういう理論に基づいて群れのCGは作成されていたんですね。

驚きです。

Boidsの理論についても分かり易く簡潔にまとめられています。

凄いの一言です。

アメリカに生まれていたらComputer Scienceの教授になれたでしょうね。この本の作者は。

実装の部分は実際に試してみないとなんとも言えません。

これはどうじても自分で実装してみたい。

やる以上はこのBlogでまとめたいので、まあ苦情がこない範囲で記録に残す事にします。

Game of Life

こっちの理論は何処かで勉強した記憶があります。

NiagaraでParticleではなくGridを使用する方法は知らないです。

この章を読んでいる途中で時間が無くなってしまったので残りは来週、読む事にします。

4. Materialの勉強

なんとBen Cloward先生の新しいTutorialが公開されていました。

やっとBen Cloward先生が復活しました。

今週はもう時間が無いので無理ですが、来週からBen Cloward先生のTutorialもやって行くことにします。

5. Gaeaの勉強

5.1 Tutorialの作成

5.1.1 Characterの作成

先週、Characterは無しの方向でやって行く。と言いましたが、やっぱり独自のCharacterを作成してそれを使用したくなりました。

Tutorialを作成するなら独自のCharacterを作成してそのCharacterをIPとして育てていくべきだと勝手に考えました。

前のPCにGameを作成した時のイラストがそれなりにあったんですが、壊れてしまったので取り出す事が出来ません。

唯一残っていたのは以下のイラストだけでした。

もっと上手く描けたイラストがあったのに残念です。

以下のイラストを作成しました。

何回修正しても手が上手く書けませんが、大体は上手く描けたと思います。

彼女に司会をやってもらうのであまりFantasy感はないDesignにしました。

今の流行りのイラストは綺麗過ぎてあまり私の好みでは無いんです。

なんかこう80~90年代のアニメのイラストの方が、本能に働きかけてくる何かがある気がします。

のでそんな雰囲気で色を塗りました。

絵としてはかなり気に入っていますが、独自のIPとして確立出来る程の特長はないかもしれませんね。

水着を着ているお姉さん以上の特長はないですから。

T-shirtsを追加しました。

これはイイ。

差分を追加するのは面白いですね。

ここまで来てもう少しFantasy感が欲しくなりました。

そこでBandを追加してみました。

うーん。

イイ。

でもこれだと何だか意味不明です。

鎧を追加してFantasy感を増してみます。

うーん。

なんか響かないですね。

色合いを変えてみました。

これは良いですね。

北斗の拳に出て来る悪役のモヒカン風な風味が加わっています。

ひとつ問題がある事に気が付きました。

このイラストと先週決定したAIの音声は合わないですね。

BoothでModelを探したら以下の音声がありました。

これは無料ですし、音声も5種類あって色々選べます。

規約は書いてませんでした。

備考に以下のコメントが書かれていました。

MIT Licenseだそうです。

後、生成した音声が現実の誰かに似ている事もなさそうです。

これが一番重要な事で、どの音声で学習させたのかは著作権的には全く関係ないんですが、何で勘違いしている人が多いんでしょうね。

音声を確認してみると、設定を指定通りにすれば、AIにありがちなかすれた音声になる事も無かったです。

これでやります。

それぞれの音声で試し撮りしてみました。

<ほわっと風味ちゃん>

結構良い感じです。

これを基準に考えます。

<かっこいい風味ちゃん>

これは僅かですが声がかすれてしまっています。

<さらさら風味ちゃん>

かなり良いです。

今までで一番良いです。

<しっとり風味ちゃんとしゃきっと風味ちゃん>

どっちも最高に良いです。

まったくかすれた声がないです。

<>

この声に私のイラストを合わせると私の絵にふざけている感じが出て来てしまいました。

話す内容もかなり真面目な内容ですのでイラストだけ浮いてしまっています。

うーん。

スーツ着せてみました。

襟がオカシイ気がします。

何がオカシイのか分かりませんがオカシイ感じがあります。

ネットでSuit姿の女性の写真を沢山見た結果、以下のようになっているのが正しい襟だと分かりました。

今度は胸が小さく見えるのが気になります。

これもネットで検索して確認しました。

すると胸の大きい女性は以下のような描き方をしている事が分かりました。

うーん。

深い。

しかしこれは今からでは直せません。

最初から書き直す必要があります。

実際のPower Pointにイラストを張り付けてみました。

あれ?

小さいんですけど。

これでも1080x1920あるんですけど。

絵を小さくするのと綺麗に見えるので良いですけど、大きくするのはその絵が汚くなるのであまりやりたくないです。

書き直します。

サイズを二倍にしました。

胸も直しました。

本来なら線から書き直すんですがやる気が出ません。

このモデルにスーツを着せて完成とします。

もしくはFantasy感のある人型の魔物にするとかします。

Suits姿です。

2 Pattern考えました。

うーん。

どっちも良いです。

Fantasy Versionです。

単なる悪魔風です。

一寸単純です。

蛾をモデルにしてみました。

うーん。

Ideaは良かったんですが、蛾らしさを出すためにGradationを使用してしまいした。

Air Brushも使用しています。

これらが80~90年代のアニメ感を消してしまっています。

お腹の模様はかなり良いです。

今週はCharacterを考えているだけで時間が無くなってしまいました。

6. Houdiniの勉強

先週からNodes of Nature氏のPCG Building in Unreal Engine [3]を勉強しています。

今週は先週勉強した内容の実装をします。

時間が余ったらその後で、Lectureを更に10分位勉強します。

6.1 PCG Building in Unreal Engine [3]の実装をする

先週勉強した内容を実装します。

指定されているPluginがEnableされているか確認します。

されています。

PCGから子クラスを作成しました。

名前はPCG_Buildingとしました。

Static Mesh Spawnerノードを追加しました。

Tutorialと同じようにMesh EntryのStatic Meshに以下のMeshをセットしました。

この後にTutorialではAttribute Operationを追加しています。

しかしそんなNodeは無いです。

Execution BPを見ると

Attribute Operationsならありました。

Attribute Operationノードはこの作者の自作のNodeのような気がして来ました。

Comment欄で確認します。

あれ?

6個しかCommentが無い。

5.3kも再生されていてCommentが6個?

これはかなりのCommentを消している可能性があります。

もしかしたらComment欄に、このTutorial実装出来ません。

みたいな書き込みは全部消している可能性があります。

更にその下にあるProjectのURLに移動すると

しっかり金取っています。

うーん。

なんかBusinessの香りがしてきた。

次はNodeを選択した状態でAを押すとそのMeshの持つDataの内容が見れる機能についてです。

TutorialではAttribute Operationノードで試していますが、Attribute Operationノードが無いのでStatic Mesh Spawnerノードで試します。

結果です。

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

Dも追加しました。

ここで「青いNodeはDouble Clickすると中身を開く事が出来る。」と解説しています。

やってみます。

Mesh Sockets To Pointsノードがありません。

また無いのか。

Execute BPノードから探します。

ありました。

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

確かに青いNodeになっていますが、これってExecute BPノードなら全部青くなる気がします。

Double Clickしたら以下のように中の実装が現れました。

Execute BPノード以外で試したいと思ったら、その下のSet Point Colorノードの

色も青でした。

これをDouble Clickしてみました。

おお。

これも中身が確認出来ました。

ここから一転してCreate Points Gridノードを使用して何かを始めます。

PCGをLevel上に配置すると以下のようにPointsが配置されていました。

Create Points Gridノードを以下のように変更しました。

結果です。

うーん。

Grid Extentsの意味が不明です。

Defaultの条件でのTop Viewです。

Grid Extentsの値を1500に変更しました。

Pointを生成するGridの数が3x3で9倍になっています。

この時点ではPointのSizeはそのままです。

次にScale Methodの値をAbsoluteに変更します。

Point Scaleの値はDefaultで1になっています。

成程。

PointのSizeがGridと同じになる訳です。

理解しました。

次にStatic Mesh Spawnerノードを追加します。

ここでMeshにSM_Columeをセットしています。

これが無いのでQuxiel Bridgeから似たAssetを探してきます。

これを使用します。

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

UEにInstallしました。

なんと複数のStatic Meshで構成されていました。

うーん。

以下のAssetにある柱を使用する事にしました。

以下のMeshを使用します。

Static Mesh SpawnerノードのStatic Meshにセットします。

結果です。

おお。

壮観な眺めです。

今度はCreate Points GridノードのCell Sizeの値を100から200に変更します。

結果です。

これを移動させようとすると元の位置に戻ってしまいます。

TutorialのようにColumnだけ移動させる事は出来ません。

まあ、PCGが進化してそうなったと信じて先をやって行きます。

Get Actor Dataノードを追加します。

Get Actor DataノードのModeをGet Single Pointにします。

Copy Pointsノードに繋げます。

そして

に繋げます。

更にCreate Points GridノードのLocalとLocal Inverse TransformにCheckを入れます。

結果です。

うーん。

滅茶苦茶。

PCGの移動も出来ません。

色々弄って以下の事が判明しました。

以下のように組むと

こんな風に配置されます。

確かに位置の移動は出来るようになりましたが、これは直りません。

うーん。

Give up。

これはどうやってもTutorial通りにはなりません。

一寸頭を休めます。

来週、もう一回Tryして出来なかったら諦めます。

夜中に目が覚めて寝れないので、もう少しだけやる事にしました。

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

PCGを動かします。

PCGは動きますが、Pointsは移動しません。

Create Points Gridノードの

LocalにCheckを入れます。

結果です。

PCGを移動させるとPointsも同じように移動するようになりました。

Static Mesh Spawnerノードを繋いで確認します。

結果です。

同じ様に移動させることが出来ました。

うーん。

こっちでいいじゃない?

<NodeのDataを表示する>

Nodeを選択した状態でAを押すと以下のように黄色の印が付きます。

更に以下のようなWindowが表示されます。

本来ならここにDataが表示されるはずですが、何も表示されません。

この部分は先週のBlogにはまとめてなくてどうしたらDataが表示出来るようになるのか分かりません。

Tutorialを見直します。

分かりました。

まずこのPCG GraphをLevel上に配置する必要があります。

配置すると以下の箇所に、Level上に配置したInstanceが表示されます。

望みのInstanceを選択します。

位置情報などのDataが表示されるので、

Localである必要があります。

結果です。

それぞれのPointの情報が表示されるようになりました。

このTutorialを続けるのは不安過ぎます。

残りのTutorialをやるのは一端中止します。

来週、何をするのかは一端白紙にします。

Houdiniの勉強に戻るかもしれません。

7. UEFNの勉強

今週もPi Equals Three氏のTutorialをやっていきます。

今週はHow to Make Custom Vehicles in Fortnite - UEFN / Creative 2.0 [3]を勉強します。

7.1 How to Make Custom Vehicles in Fortnite - UEFN / Creative 2.0 [3]を勉強する

<Intro>

小さな地球にのって移動しているんでしょうか?

かくついていますが、Playerの操作に従って動いているみたいです。

<Place UFO Device>

UFO SpawnerをLevel上に展開します。

こんなやつです。

<Create Prop>

BlueprintからPropを作成します。

名前はCustom Shipだそうです。

<Add Static Mesh Component>

中を開きStatic Meshを追加します。

Static Meshに追加する素材として以下のHot Dog Bunを選択しています。

Static MeshにこのHot Dogを追加しました。

Collisionの設定をNo Collisionに変更します。

Sizeを変更します。

今度はSphereを追加しました。

こんな感じです。

このSphereはHot Dogの位置を固定するのに使用しているみたいです。

赤い矢印が正面の方向だと言っています。

Levelに戻ってこのHot Dogを配置します。

<Create Verse Device>

Create Verse Scriptを開きます。

名前をHot_Dog_Ship_Deviceとします。

VS Codeを開きます。

以下の2つのModuleを追加しました。

2つのInstanceを作成します。

<Get List of All Players>

次は変数であるPlayerListを作成します。

こんな感じでArrayは作成するんでしょうか?

これは後で確認します。

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

これは今のLevel上にいる全てのPlayerのListを作成しています。

<UFO Enter and Exit Functions>

OnBegin()関数に以下のMethodを追加します。

UFOの乗り降りのための機能を追加するのは分かりますが、具体的にどう実装すればよいのかは不明です。

まず以下のような変数を作成しました。

更に以下の関数を作成しました。

一寸は何をやるのかが見えてきました。

<Create main UFO Teleport Loop>&<Get Player Position/Rotation>&<Configure Prop.TeleportTo Function>

次に以下の関数を作成しました。

もしUFOに乗り込んだ場合は、PlayerのところにTeleportします。

あ。

分かりました。

UFOはPlayerの移動した位置にそってずっと付いていくのでUFOに載っているかのような印象を与える訳です。

最後にこの関数をOnBegin()で呼び出して終わりです。

<Reference Prop and UFO Spawner>

まずUEFNに戻ってBuildします。

Hot_Dog_Ship_DeviceをLevel上に配置します。

2つのParameterにInstanceをセットします。

<Final Result>

テストしています。

あー。

こういう事だったのか。

元々、UFOにはPlayerが乗り降り出来る機能が付いていたんです。

そのUFOをHot Dogが追いかける訳です。

はい。

今週のUEFNの勉強はこれでお終いです。

8. DirectX12の勉強

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

8.1.1 先週の復習

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

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

思い出しました。

「3.4.2 Fence」を勉強したんでした。

ここでFenceをIncrementするという意味の具体的な手法が書かれていました。

読み直します。

Fenceを使用してどのようにGPUの作業が終わっているかどうかを確認するのか、とか終わっていない場合はEventを使用して終わるまでThreadの作業を停止する方法の実装方法についての解説がまとめられていました。

納得です。

と書いてありました。

更に、

Direct3D 12 ゲームグラフィック実践ガイド」の「2.3.6 Fenceの作成」で述べていたFenceをIncrementするの謎も解けたはずだと書いていました。

これも今週検証します。

8.1.2 「3.4.2 Fence」を実装する

以下のCodeを追加してFenceを作成しました。

これは単にFenceを初期化しているだけです。

次にCommand QueueからSingalを発信します。

ここが先週理解が甘かった可能性のあるところです。

先週は「Fenceには元々ある値を保持する所があり、それは最初にFenceを作成した時に_FenceValによって指定された。」とまとめました。

そして

「その値がGPUの作業が終わると勝手にIncrementされてその結果、このSingalでIncrementされた_fenceValの値と一致するようになる。」

と結論づけました。

しかしこの考え方を今、復習してみると一寸おかしい部分がある事に気が付きます。

もしこの考え方が正しいなら_fenceValの値を単にIncrementすれば良いだけで、あえてCommand QueueからSingalを呼び出す必要は無いからです。

Command QueueクラスのSingal()関数が何をやっているのかを確認する必要があります。

調べます。

公式SiteのID3D12CommandQueue::Signal method (d3d12.h)[4]です。

何と、Fenceの値をUpdateするとありました。

この解説を読むとFenceの値は二番目のParameterの値に新しくUpdateされるそうです。

Remarkには以下のような解説がありました。

単純に考えるとCommand Queueにあった命令を全部終えた後に、このSignalを実行するわけですから、Command Queueの命令が終わるまではFenceのGPU側の値は変化しないはずです。

次に以下のCodeが実行されます。

これも公式SiteのID3D12Fence::GetCompletedValue method (d3d12.h) [5]で調べます。

なんとこの関数は

今のFenceの値を返すそうです。

うーん。

かなり推測が入りますが、先程のCommand Queueの作業が終わる前にこの関数を使用した場合は、値がCommand QueueのSingal()関数で指定した値ではなく以前の値が返ってくると考えられます。

それだと別にIncrementする必要も無いですね。

あ、While Loop内なのでIncrementする必要があるんだ。

うーん。

納得。

教科書を読み直すと、こういう意味で解説されていました。

先週もかなり良い線までは理解していましたが微妙に間違っていました。

話は変わりますが、_fenceValの最大値までIncrementした後はどうなるんでしょうか?

結構早くその値まで行きそうですが。

残りの実装も追加します。

この部分に関しては教科書で一行一行の機能についてしっかり解説していました。

FenceのSet Event On Completion()関数はFenceの値が指定した値(この場合は_fenceValの値)になった時にEventを発生させるそうです。

Eventが発生すると自動でSignalを発生するのでその次のWaitForSignalObject()関数がこのThreadをPendingしているのを止めます。

このThreadは作業を開始します。

うーん。

納得。

これで「3.4.2 Fence」の実装が終わりました。

テストします。

まだ出来てないですが、教科書でも次の節の実装をしないとErrorになる。と書かれていました。

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

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

Fenceの機能についてはかなり理解したので「Direct3D 12 ゲームグラフィック実践ガイド」の勉強も再開します。

8.2.1 今までの復習

Fenceの勉強で意味が分からなくなってしまったので、「DirectX 12の魔導書」のFenceの勉強が終わるまで学習をPendingしていました。

まずどこで何が分からなくなったのかついて復習します。

2023-09-11のBlog

これを見ると以下の2つの実装しかやっていません。

Fenceの生成です。

Eventの生成です。

そしてここでのCommentが

となっています。

これじゃFenceの値がIncrementしたのか分からないと言うCommentももっともです。

実際、ここでやっているのはFenceを生成する事とEventを生成する事だけです。

これも今見たら大体何をしているのかは推測出来ますね。

最初の実装部分は、Fenceの値を指定するための変数です。そのDefault値を0に指定しているだけです。

このm_FenceCounterがArrayなのが「DirectX 12の魔導書」のFenceの設定と違っています。

これは後で検証します。

次にm_FenceCounter[m_FrameIndex]の値をIncrementしています。

これは後でCommand Queueのfence()関数を使用してFenceの値をIncrementするための準備と思われます。

はい。

こんな感じでした。

この後は、Eventについて調べたりしているだけです。

これでは、Fenceの値が何でIncrementするのか分からなくても不思議ではありません。

一応、教科書も読み直して確認します。

やっぱりこの2つの内容しかかかれていません。

この後のFenceの値をIncrementする方法とかまったく説明されていません。

それで次の節になってしまっています。

次の「2.4 Direct3D12の描画処理」を読んでみます。

うーん。

Resource Barrierの話になっていますね。

「2.4.6 表示処理」でFenceの残りの実装は追加されていました。

一応Fenceの解説はしていますが、軽く見た限りでは「DirectX 12の魔導書」ほど分かり易くは無いですね。

でもしっかり読み込んではいないのではっきりとは言えません。

8.2.2「2.4 Direct3D12の描画処理」の勉強

先程、軽く読んでしまったので内容は大体把握してしまっていますが、一応もう一回読む事にします。

Resource Barrierに関してはやっぱりこれも「DirectX 12の魔導書」で勉強した後で実装したいので、ここでは軽く読むだけにします。

<2.4.1 Commandの記録開始>

Command AllocatorクラスのReset()関数とCommand ListクラスのReset()関数についての解説です。

Command AllocatorクラスのReset()関数はCommand Bufferの内容を先頭に戻すそうです。

そしてCommand ListクラスのReset()関数が描画Commandの作成を開始するそうです。

この2つの関数に関しては「DirectX 12の魔導書」でも「3.3.6 Swap Chainを動作させる」の「ためておいた命令を実行する」で解説されています。

この解説では「Command AllocatorクラスのReset()関数がCommand Listの内容をResetする。」と書かれています。

そして

「Command ListクラスのReset()関数はCommand ListがClose状態になっているのを解放するために行う。」

と書かれていました。

うーん。

同じ事を解説していますが、「Direct3D 12 ゲームグラフィック実践ガイド」の解説が理論よりで、「DirectX 12の魔導書」の解説は実際のCodeの解説よりです。

2つを一緒に勉強する事で、理解が何倍にも膨らみます。

<2.4.2 書き込みのためのResource Barrier>

これ読むとResource BarrierはThreadのLockと同じ機能に思えます。

多分そうでしょう。

後は、Resource Barrierの設定方法について詳しい解説がありました。

ここで時間切れです。

残りは来週読む事にします。

9. まとめと感想

特になしです。

10.参照(Reference)

[1] Nodes of Nature. (2023, August 9). PCG building in Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=m1DJ7qXBgug

[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] Pi Equals Three. (2023, April 1). How to make custom vehicles in Fortnite - UEFN / Creative 2.0 [Video]. YouTube. https://www.youtube.com/watch?v=T3krv-HgksI

[4] Stevewhims. (2021, April 2). ID3D12CommandQueue::Signal (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12commandqueue-signal

[5] Stevewhims. (2022, July 27). ID3D12Fence::GetCompletedValue (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12fence-getcompletedvalue