UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する。Dialogue Systemの検証と復習

<前文>

<今週のDirectXの勉強>

今週も3つの本で勉強していきます。

先週、 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1] でMessage Loopを勉強したのでその辺りを勉強します。

<<DirectX 12の魔導書>>

先週、CreateWindow()関数まで勉強したと思ったんですが、RegisterClassEx()までしか勉強していませんでした。

まずCreateWindow()関数まで実装してしまいます。

そして C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]の実装方法と比較してやり方の違いなどを確認します。

まず最初の実装ですが、いきなりError表示です。

Sample codeを見ると特にErrorは表示されていませんね。

Sample Codeを見てたら以下の定義が書かれていました。

いや、これはSample Codeに書かれていなかったら分からんだろ。

追加しました。

Error表示も消えました。

こういうのを見ると、やっぱり英語圏YouTubeのTutorialのような勉強するCommumityが必要だな。と思います。

Comment欄に、window_widthとwindow_heightでError表示されるけど直し方が分からない人達へ、以下の方法で直りました。みたいなCommentを誰かが書いておくと、後から勉強する人はそれを見て直せばいいだけになります。

後から勉強する人は時間を浪費しないで済むわけです。

英語圏、特にアメリカでは、こういう相互援助の勉強するCommunityが自然に発生して、しかもそれを公式が正式にSupportするので、公式もちょっとした間違いなんか、いちいち直す必要が無くなります。

公式も完全無欠である必要も無くなる訳です。

日本は、やっぱり著作権の問題をClearしないとそういう勉強するCommunityの発生は難しいと思います。

更に言うと、そういうCommunityの存在を許さないと、読者は教科書の間違いに対してもものすごく厳しく接するようにならざるえなくなります。

だって一寸した記述の間違いや抜けのせいでCodeが動かなくなる訳ですから。

話がそれました。

次へ行きます。

AdjustWindowRect()関数を使用して

Windowのサイズを調整します。

この部分は C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]には全くない実装で、 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]ではCreateWindow()関数で直接、値を打ち込んでいます。

この辺は、win32の勉強が主目的なら深く突っ込んで勉強しますが、あくまでDirectX 12を勉強するのが目的でその手段としてwin32によるWindowの生成を学んでいる訳で、そこまで細かく勉強する必要は感じないので、このまま流します。

CreateWindow()関数です。

はい。

Parameterを見ていきます。

まず最初のParameterはこのWindowの名前です。

先週、以下の場所で指定していますね。

次のParameterはWindowのTitle名です。

これ、 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]の指定の仕方と比較すると非常に面白いんですが、それをいちいち書くとものすごく長い記述になってしますので、その部分は端折ります。

次のParameterです。

ここはWindow Styleを指定する箇所だそうです。

次のParameterです。

ここはWindowの開く位置を指定しています。

次のParameterです。

作成するWindowのサイズを指定しています。

次のParameterです。

ここは作成したWindowが親Windowを持っていたらその親Windowをここに指定する所です。

次のParameterです。

Menu Barを追加するParameterです。この実装ではMenu Barは作成しないのでnullptrになっています。

次のParameterです。

このParameterは先週作成した

をPassしているんですが、これが何なのかイマイチ分かりません。

最後のParameterです。

ここは特別な指示をWindowにするために使用するそうです。

うーん。今週の勉強としてはこれで十分です。

のでここまでとします。

<<HLSLシェーダーの魔導書>>

先週、Sample Code内で発見したSystem.cppにCreateWindow()関数もありました。

このSampleのCreateWindow()関数がもっともSimpleに書かれています。

ただし、解説は一番詳しく書かれています。

あれ、一番最初のParameterは、Window Classの名前となっています。

Windowの名前じゃないの?

公式のDocumentである CreateWindowW macro (winuser.h) [2] で調べると

となっていて、Window Classの名前が正しい事が確認出来ました。

あ。分かりました。

2重に勘違いしていました。

私はWindow Classの名前と書かれていたのでてっきり、

の事かと思ったのですが、実際は以下の赤線の部分のArgument

の事でした。

私はこれの事をずっとWindowの名前と呼んでいました。

ので実態は間違っていなかったんですが、名称を間違って覚えていました。

そんだけでした。

次です。

ここではWindowの名前と紹介されています。

C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]ではWindowのTitleと紹介されています。

公式のDocumentである CreateWindowW macro (winuser.h) [2]では

名前はWindowの名前となっていて、その機能はWindowのTitleを決定する。となっています。

これはどっちでも良い気がしますね。

名前はWindow Nameで機能はWindowのTitleの指定である。と覚えておきます。

次です。

C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]ではこれについては何の解説もなかったみたいです。

ここの解説を読むとWindowのStyleを指定しているみたいです。

公式のDocumentである CreateWindowW macro (winuser.h) [2]では

と解説されていました。

要するにWindowの形状を指定しています。

Windowに色々な形状がある事自体知りませんでした。普段何気なく使用していますが、全部同じだと思っていました。

Link先に飛ぶと、 Window Styles [3]につきました。

そこでは、WS_OVERLAPPEDWINDOWの解説が載っていました。

次です。

これらは

C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]の説明と全く同じだったので、SKipします。

次です。

こいつの意味がイマイチ分かっていません。

公式のDocumentである CreateWindowW macro (winuser.h) [2]では

と説明されています。

ここはHINSTANCEをパスする所とだけ理解しておきます。

最後のParameterです。

ここだけはなんの説明もありませんでした。

一応、公式のDocumentである CreateWindowW macro (winuser.h) [2]の説明も載せておきます。

これ読むと C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]の説明と大体一緒ですね。

以上でした。

後Tipとして書き残しておきますが、Microsoftの公式のDocumentは日本語と英語の切り替えボタンが装備されていません。

URLの以下の部分をen-usに書き換えると日本語の資料を英語に直す事が出来ます。

日本語の資料は英語の資料をそのまま訳しただけなので、訳す過程で情報がかなり削られています。

原文で確認したい時や、私の様にComputer 関連は英語の情報しかみない人には役立つTipです。

Direct3D 12 ゲームグラフィック実践ガイド>

先週は、2.1まで勉強したので今週は「2.2 アプリケーションクラスの作成」を勉強します。

これだけ一寸、他の教材より遅れています。

ただし、このDirect Xの勉強に入る前のWindowの作成方法もしっかり説明してくれているのは勉強する側としてはありがたいです。

先週、「 DirectX 12の魔導書 」の勉強で、WindowProcedure()という関数を作成したんですが、これが何をやっているのか全然分からない。と書いていました。

バッチリ説明してありました。

この説明によるとWindows Procedure()関数は、Window OSから、Message queueを通じてあれしろ、これしろという命令であるWindow Messageを受け取るそうです。それをApplication内に振り分ける仕事をしているそうです。

何となくですが、Window Procedure()関数のイメージがつかめました。

うーん。

でもそうすると、 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]とHLSLの魔導書のSample CodeではなんでWindow Procedure()関数を使用していないんでしょう。

DirectX 12の魔導書を見直したら、

Window Procedure関数は以下のWNDCLASSEXの初期化の時に使用していました。

このlpfnWindProc parameterにどんな値をセットしているのか、調べてみます。

まず、 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]です。

DefWindowProcがセットされています。

これってDefWindowProc()関数の特殊な書き方なのでしょうか?

どこかにMacroか何かで指定されているのでしょうか?

この指定方法自体がよく分からないで使用しています。

DirectX 12の魔導書 」では、Returnの部分で以下の様にDefWindowProc()関数を使用していますが、こっちはしっかりとParameterを一個一個記入しています。

HLSLの魔導書を確認したら以下の様になっていました。

これは気が付かないで読み飛ばしていました。

調べたら以下のようなWindow Procedure()関数がありました。

はあ。

実装を見る限り「 DirectX 12の魔導書 」の実装と同じ機能ですね。

となると C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]の書き方だけがよくわからないのか。

まあ、これくらい理解しておけば、「2.2 アプリケーションクラスの作成」の続きを読む分には十分でしょう。

先を読みます。

成程、Window ProcedureというかWindowそのものの仕組みが簡単ですが理解出来ました。

要するにWindowってのはEventの塊なんです。Userがボタンを押したらすぐにそれに対して対応する必要があります。

その流れの一部でOSからWindowの間を取り持っているのがWindow Procedure()関数だと理解しました。

「2.2.1 App Classの実装」をみたら実際にWindow Procedure()関数の実装をしています。

まじか。

今週は、 Window Procedure ()関数についての理解がある程度深まったところで終了にしても十分な気がしています。

Sample Codeの2.2のApp.cppのWindow Procedure()関数の所だけ見てみます。

以下の様になっていました。

これは、 DirectX 12の魔導書とHLSLの魔導書のWindow Procedure()関数の実装とほぼ同じです。

うーん。

C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]の書き方だけ違いますね。

一寸、 C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [1]で勉強するのが心配になってきた。

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

Direct3D 12 ゲームグラフィック実践ガイドの2.2.1 App Classの実装は来週までに読んでおく事にします。

今、読んでも集中しないのと、本読む時は、空いた時間を利用して読むのが私の流儀だからです。

一応、CreateWindow()関数と、WindowProcedure()関数に関しての理解が深まりました。

まだDirect X12の勉強する前のWindowの作成の段階ですが、ゆっくり勉強していきます。

それではUEの勉強を始めます。

<本文>

1.今週の勉強について

今週も以下の内容についてやって行きます。

  • Niagara: CGHOW氏のTutorialをやる
  • Materialの勉強
  • RPGPackagingについて
  • Open Worldの検証
  • Gaeaの勉強
  • 雪山のMapの作成
  • 報酬システムの研究
  • Anime Renderingの勉強
  • DirectX 12の勉強

2.Niagara: CGHOW氏のTutorialをやる

今週は、Render Bucket氏のUnreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [4]を勉強します。

NiagaraのFluid Systemを勉強するためにRTX3070Ti付きの新しいPCを買ったんですが、Fluid Simulationの勉強は全然進んでいません。

今週はFluid Simulationの勉強を頑張ります。

2.1 Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [4]を勉強する

まず全部を軽く見ます。

見ました。

やっている事は、たんなる火炎放射器のEffectの作成です。

これをFluid Simulationで計算しているのが凄いので、そこはまあ、しかたないです。

Niagaraの理論を勉強する時は、どうしてもEffect自体はショボくなってしまいます。

これを理論を学びながら凄いEffectを作成しようとすると、両方訳わからなくなってしまうので、ここはEffect自体のショボさは我慢して勉強します。

まず、このTutorial、作成されたのが7カ月前ですが、今のNiagara Fluid Systemと同じUIを使用しているんでしょうか?

ぱっと見た感じ、以下のNiagaraのUIと一寸違う感じがしました。

もし今のNiagaraのUIと違う場合は、臨機応変な対応を取る事にします。

後、凄い勉強になったのが、Niagara Fluid System では、Particleを飛ばしてそれを燃料とみなし炎をSimulateしている事です。

本物の燃焼のSimulationでも同じ様な方法で計算しているんでしょうか?

非常に興味があります。

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

まず空のNiagara Systemを作成します。

CGHOW氏のTutorialは、いつもFountain Emitterを追加したNSを使用するので、なんか新鮮です。

まずGrid3D_Gas_CONTROLES_Emitters を追加します。

このEmitterが燃焼部分を計算するそうです。

更にFountain Emitterを追加します。

ここは、燃料部分をSimulateするためのParticleを作成します。

Fountain Emitterを改造して燃料を噴射しているようにします。

まずParticle Spawn SetioncのAdd Velocity Moduleの

Velocity Speedを以下のように変更します。

この後もAdd Velocity Moduleの色々なAttributeの値を変更していますが、Fluid Simulationの勉強とは関係ないのでその辺の設定はSkipします。

最終的には以下のようになりました。

Tutorialの説明によると今はまだ、TemparatureとDenistyをEmittしていないのでショボいと言っています。

いや、この辺の説明が良く理解出来ません。

このParticleをGrid3D_Gas_CONTROLES_Emittersに繋げてTemparatureとDensityをGrid3D_Gas_CONTROLES_EmittersにEmittすると言っているのかもしれません。

兎に角、Tutorialによると、このFountain EmitterをGrid3D_Gas_CONTROLES_Emittersにつなげる為には、有る事をする必要があるそうです。

Explosion Particle Source EmitterをTemplateから作成します。

ここにある何個かのModuleを、Fountain EmitterにCopyするそうです。

まずParticle Spawn Sectionにある

をCopyしてFountain EmitterのParticle Spawn Section 内にPasteします。

この辺は実際にそれぞれのModuleとそのAttributeの設定を見ないと、良く分からないです。Denisyはありますが、Temparatureは無いですね。

PositionやColorは何故必要なんでしょう?

これでCopyするのは終わりだと思っていたら、今度はParticle Update SectionにあるSet Floud Source AttributeノードをCopyしました。

当然、Fountain EmitterのParticle Update SectionにCopyしたSet Fluid Source AttributeをPasteしました。

これでCopy&Pasteは終わりです。

Fountain EmitterのErrorを消すために、Particle Spawn Sectionに、Apply Initial Forces Moduleを追加します。

これでFountain Emitterの準備は終わりだそうです。

今度はFountain Emitter とGrid3D_Gas_CONTROLES_Emittersと繋ぐそうです。

Grid3D_Gas_CONTROLES_EmittersのEmitter Summaryの

Particle ReadのEmitter NameにFountain Emitterの名前を入れます。

TutorialではFountain Emitterの名前はFXE_Fuelに変更されているので、その名前が入っています。

Fountain EmitterのProperties

Sim TargetをGPUに変更します。

結果です。

以上でした。

Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [4]を勉強した感想>

Tutorialを見た感想です。

まずDensityをFountain EmitterからGrid3D_Gas_CONTROLES_EmittersにPassしたのは理解出来たんですが、TemparatureはどこでPassしているんでしょうか?

これが不明です。

次にExplosion Particle Source EmitterからFountain EmitterにコピぺしたModuleたちについてです。

これらのModuleについてどこまで勉強すべきなのかが分かりません。

後、Render Bucket氏のTutorialは、Emitterをとても小さく移すので、どのModuleのどのAttributeをいじっているのか画面から判断するのが大変でした。

いろいろ不満点はありますが、NiagaraにおけるFluid Simulationの仕組みがこのTutorialのお陰で大体理解出来ました。

この辺は凄いと思いました。

2.2 Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [4]を実装する

5.1 で実装してみます。

まず空のNSを作成しました。

名前はNS_FS_FlameThrowerとしました。

Grid3D_Gas_CONTROLES_Emittersが見つかりません。

Tutorialを見直したら以下のLibrary OnlyのCheckを外してParent Emittersを選択する必要がありました。

追加出来ました。

次にFountain Emitterを追加します。

CGHOW氏だけじゃなくて、RenderBucket氏もTempleteにFountainを選んでいますね。

みんなTemplateはFountainを使用するんでしょうか?

Fountain EmitterのModuleのAttributeの値を微調整してEmitterのParticleの軌道を以下の様にしました。

この辺の細かい調整に関しては、もう初心者じゃないので記録には残しません。

Tutorialの通りにやりました。

次に Explosion Particle Source EmitterのModuleをFountain Emitterに移植します。

まず Explosion Particle Source Emitterを作成します。

なんじゃこれは!

凄い。

でも今週はここからModuleを頂くだけなので、このEmitterの中身は見ない事にします。

Tutorialに書かれている通り、Particle Spawn Sectionにある

  • Curl Noise Force Small Module
  • Curl Noise Force Large Module
  • Curl Noise Force Density Module
  • Set: Particle Position Module
  • Set: Particle Density Module
  • Set: Particle Color Module

をCopyします。

そしてこれらのModuleをFountain EmitterのParticle Spawn SectionにPasteします。

次に Explosion Particle Source EmitterのParticle Update SectionにあるSet Fluid Source Attributes ModuleをCopyして

Fountain Emitter の Particle Update SectionにPasteします。

これらのModuleを一個一個見ていく予定だったんですが、それは全部完成してからやる事にします。

Fountain EmitterのErrorを直します。

Fix Error Buttonを押すとApply Initial Forces Moduleが追加され、Errorの表示が消えました。

Apply Initial Forces Moduleの位置をTutorialと同じ場所に移動させました。

今度は Grid3D_Gas_CONTROLES_Emitterを直していきます。

TutorialではError表示になっていましたが、私のはWarning表示でした。

Particle ReadのEmitter NameにFountainと書きました。

Warningが消えました。

Tutorialだとこの後もWarningが継続していて、それはFountain EmitterのPropertiesのSimの設定をCPUからGPUに変更すると消えるんですが、

私のEmitterはどちらも警告が表示されていません。

一応、Fountain EmitterのSim TargetをGPUに変更しておきます。

結果です。

Tutorialでは見事な炎が生成されていましたが、私のは一寸だけ炎が見えるときもあるって感じです。

まあ、でも一応は完成しました。

Fountain EmitterのSpriteを消すと

こんな感じです。

Tutorialのは

こんな感じです。

はあ。

全然違いますね。

2.3 Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [4]を改良する

あんまりにも、結果がTutorialと違うので一寸改良します。

Fountain EmitterのSpawn rateを9000にしました。

こんなのGPUで計算しているんだから余裕でしょう。

結果です。

Tutorialみたいな炎が確認できるようになりました。

火が付くまでの隙間が気になりますね。

Fountain EmitterのParticleを表示させると以下の様にParticleはあるけど、火がついてない部分があります。

Set: [PARTICLE] Position Moduleの

VectorのXの位置をずらしたら、

見た目は直りました。

これParticleを発射している位置がBoundaryの境界ギリギリだったので、

以下のようにVectorのzの位置を上げてみました。

3倍ぐらい強烈な炎が飛び出してきました。

後、xの位置をずらす必要もなくなりました。

うーん。分かった。

これはParticleを発生させる場所が悪いんです。

どうせなら最初にParticleを発生する場所を指定しているModuleから直します。

Shape Location Moduleの

Offset ModeをDefaultに変更してOffset のzに100をセットしました。

結果です。

炎がBoundaryに衝突してそこで消えています。

これは炎が強すぎるでしょう。

Spawn rateの値をもとに戻します。

結果です。

炎は適切な大きさになりました。煙はBoundaryに当たっていますね。

でも見た目はかなりよくなりました。

今度はLevel上に配置してみます。

何も見えません。

なにこれ?

一回再起動させます。

直りません。

 あ。もしかして!

NSの位置をWorld Spaceにおける(0,0,0)に移動させました。

今度は炎が表示されました。

これはあれだ。

これをOffにしてOnにしてみました。

ダメでした。

World Spaceの中心に配置した時だけこの炎が見えます。

Particleはどうなんでしょうか?

Particleも表示してみました。

うーん。

Particleは普通にNSの位置にそって表示されていました。

色々弄りましたが、よく分かりませんでした。

確認のために以下のTemplateを持つNSを作成してみました。

Level上に配置します。

別にWorld Spaceの原点じゃなくても炎が生成されています。

位置を変えても全然、平気です。

実装をみると今回Tutorialで教わった実装と全く同じやり方をしています。

Grid3D_Gas_CONTROLS_Emitterを使用していますし、

Grid3D_Gas_CONTROLS_EmitterのParticle ReadのEmitter NameにセットされているEmitter名は

となりのEmitterで、Tutorialの設定と全く同じです。

という事は、このやり方でも炎を好きな場所で生成できるという事です。

うーん。

分からん。

このTutorialはPart 2があるので、それを勉強してからもう一度考えることにします。

2.4 追加したModuleについて調査する

まず以下の6つのModuleについて調べます。

  • Curl Noise Force Small Module
  • Curl Noise Force Large Module
  • Curl Noise Force Density Module
  • Set: Particle Position Module
  • Set: Particle Density Module
  • Set: Particle Color Module

についてです。

Set: Particle Position Module  についてです。

Attributeを見ます。

これだと、[PARTICLE] Positionに [PARTICLE] Positionの値をセットしているだけですね。

正直、要らないんじゃと思います。

次は、Set PARTICLE Density Moduleです。

Attributeは以下の様になっていました。

流石にPositionとは違い、結構な計算していますね。

まずPowerがセットされています。

これはおそらく、a^bという式になっていると思われます。

そのaの値はRemap Rangeで決定されています。

Remap Rangeの計算は、以下のAttributeで決定されています。

Remap Range自体の計算がよく分からないのでこれでPowerのaの値を計算しているとだけ理解しておきます。

そしてPowerのbの値は以下のAttributeで指定しています。

最後にColorです。

Attributeを見ます。

これも少し複雑ですが、色の指定をしているだけです。

Tutorialが言っているTemparatureの指定はどこにもありませんね。

多分、次のTutorialでやるんだと思います。

次はCurl Noise Force Moduleについてです。

指定している値は少しだけ違いますが、Atrributeは全部同じでした。

取りあえず、これらは単なるCurl Noiseの計算をしているModuleたちと解釈しておきます。

次にParticle Update Sectionに追加したSet Fluid Source Attributes Moduleについて調べます。

Set Fluid Source Attributes ModuleのAttributeです。

以下の3つのGroupに分かれています。

Module Usage Noteは単なるNoteでした。

次のBaseから見ます。

なんとここでTemparatureの値を指定しています。

Temparetureの値は、Multiply FloatでAとBの値を掛けた値になっていました。

Aには[PARTICLE] Densityの値が、

Bには1が入っていました。

ここでTemparatureの値を指定していたんですね。

最後にErrorを直した時に追加されたApply Initial Forces Moduleについて調べます。

Attributeは以下の様になっています。

別に普通ですね。

今週のNiagaraのFluidの勉強はここまでとしておきます。

3.Materialの勉強

今週は、Ben Cloward先生のPost Process VHS Filter Part 3 - Shader Graph Basics - Episode 62 [6]を勉強します。

3.1 Post Process VHS Filter Part 3 - Shader Graph Basics - Episode 62 [6]を勉強する

このTutorialではSnowly StatickyなNoiseを追加するそうです。

Staticky なってどんな意味なんでしょう。Static なら知っていますがStatickyって単語初めて見ました。

定常的な、と言う意味なのか、Static electricityの影響で画面がちらついている事を指しているのかどっちなんでしょう。

まず軽く全部見る事にします。

UEの実装の部分だけ全部見ました。

特に変わった部分とかは無くて、いつものBen Cloward先生のTutorialという感じです。

以下にやり方をまとめます。

まず先々週までの実装を以下の様なきれいなBlockにまとめていました。

これは機能毎の名称が降ってあって非常に分かり易いです。

まずTracking Noiseの結果とTracking Phaseの結果を以下のように掛けます。

こんな結果が得られます。

次です。複雑すぎて追えません。

WaveのBlockのMask(G)の値とTimeをAppendしたみたいです。

その結果にHash23を繋ぎます。

結果です。

Timeが付いているのでScreen Shotでは確認出来ませんが、当然動いています。

色は要らないのでMask(R)で色を取ります。

それ以下のVectorで掛けます。

うーん。

ここの計算は良く分かりません。

Mask(R)にしたらScalerになるんじゃないの?

それにVector2を掛ける事が出来るんでしょうか?

もし出来たとしても、これってAppendで0を足したのと一緒なんじゃないでしょうか?

今度は以下のAppendノードの結果にMultiplyノードを追加しました。

このAppendノードがどこのAppendなのか分かりません。

実装する時に調べます。

ここで先週、勉強したPixelizationの実装を追加するそうです。

Screen SizeをPixel Sizeで割ったやつで、割って、Floorして、Screen SizeをPixel Sizeで割ったやつを掛けるんでしたっけ。まだ何となく覚えています。

割る所と掛ける所が逆でした。

結果です。

この結果と先程のMultiplyノードの結果を足します。

その結果を以下のVectorで掛けます。

うーん。どんな計算結果になるのか想像付きません。

この計算結果って、最終的にはUV値として利用すると思うんですが、今はどんな結果になっているんでしょうか?

次にHash23を繋ぎました。

これどんなNoiseになるんでしょうか?

TutorialではこれでSnowy Noiseが作成出来ると言っています。

Hash 23 が入るともう頭で結果を想像する事は無理になりますね。

更にMask(R)ノードを繋げます。

これは色をとって白黒にするためだそうです。

凄い。

こんな結果になるのか。

こういうのって、実際に初めて作成する人は頭の中で完全に理解して作っているんでしょうか?

それとも偶然の産物で作成された方法を逐一、記録しておいて、それを必要になった時に引き出しから取り出しているんでしょうか。

このImageを再現するための実装を思い付く方法が、全然、想像出来ないです。

今度はこのSnowy NoiseとLerpのAlpha値に使用して実際の画面と混合します。

LerpのAには実際の画面、LerpのBには(2,2,2)と実際の白よりも明るい色が指定されています。

白黒Noiseの画像はPowerノードを追加してContrastを強くしてAlphaに繋がれてました。

結果です。

Snowly Noiseが追加されています。

でも先々週作成した白いBandのNoiseがあんまりはっきり見えなくなってしまっています。

白いBandのNoiseをはっきりさせるため以下の実装を追加しました。

うーん。

Bには白いBandのNoiseがつながっています。A>BとA==Bには元の画像が繋がっています。

これだと白いBandのNoiseが有る所だけ白黒Noiseが追加されるようになる気がします。

結果です。

やっぱりそうでした。

YIQの結果を追加した最終結果です。

うーん。凄い。

3.2 Post Process VHS Filter Part 3 - Shader Graph Basics - Episode 62 [6]を実装する

まず、Tutorialと同じようにBlockを追加します。

Blockの名前がよく見えないのは適当な名前にしています。

それぞれのBlockの機能ですが、左に3つ並んでいるBlockの、真ん中と下のBlockの機能が何だったのか忘れてしまいました。

実装していくうちに思い出すでしょう。

Track Noise Blockの結果とTrack Phase Blockの結果を以下の実装で混合しました。

Start Preview Modeで見たら、こんな結果になっています。

あれ、Tutorialの結果と違って色がついています。

Tutorialと同じように、この結果をEmissive Colorに直接つないで確認しました。

今度は白黒になりました。

なんで?

よく分からないけど、Previewで画像の確認するのは止めておきます。

次はHash23を利用してNoiseを作成します。

まず以下の部分の実装を作成しました。

前節で、このAppendのAにつながっている部分が何を計算した結果なのか分からないと書いていますが、それが分かりました。

以下に示したWave Blockの結果そのものです。

このWave Block自体が何を計算しているのかを忘れてしまったので、今から確認します。

Mask(G)の結果です。

えー。

これ時間で変化もしていません。

これを作成するのにこんな複雑な実装は必要ないはずです。

Waveの実装をもう少し細かく確認します。

まず最初のHash23ノードまでの実装です。

Hash23がこの実装からどんなNoiseを返すのかなんて、推測するのは無理なのでこのHash23の結果を確認します。

特に時間で変化しているのかを確認します。

結果です。

しかも時間で線の位置が上下に移動してます。

次の実装は色を消しているだけです。

次は0.5 を引いています。

うーん。

忘れた。

0~1のRangeを-0.5~0.5のRangeにしているんでしょうか?

それだとその後に2を掛けて-1~1のRangeにするはずですよね。

これ何のためにしているんでしたっけ。

画像みたら何か分かるかも、この結果をMain ノードに繋いでみましたが、真っ黒でした。

まあ、いいです。

このVHS Filterはもう一回全部勉強し直す予定なのでその時に、この部分の勉強をします。

次に 以下の実装をしています。

ここは画面のサイズにかかわらず同じPixel数を抽出するための実装です。

それをTexCoord[0]に足している。

うーん。

掛けるんじゃなくて足すのか。

よくわからんです。

まあ、このWaveのBlockが何をしているのかは理解出来ました。なんのためにこれをしているのかは、まだ分かりませんが。

今は実装するのが目的なので、この部分の深堀はここまでにします。

この計算結果にHash23を追加します。

結果です。

白黒にするためにMaskを追加します。

今度は以下のAppendの結果をPixel化します。

このAppendの計算自体はWave Blockの結果とTracking NoiseとTracking Phaseの結果を組み合わせた複雑な計算の結果なので以下のその計算結果の画像だけ示しておきます。

これだけ見ると単なるTexCoord[0]と同じように見えます。

敢えて、こんな複雑な実装を使用する必要あるんでしょうか?

これも後で検証します。

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

先週、勉強したPixel化するための実装と全く同じです。

先週は、箸休めと言っていましたが、先週勉強した内容はしっかりここで使用する事になりましたね。

後、Tutorialでは、Pixel化の事をQuantized、量子化と呼んでいます。

これ別に原子の小さい挙動を示すとかの意味じゃなくて、単にアナログのDataをデジタルで表す事を言っています。

これ化学とComputer ScienceのDobule Majorだった私には、量子化の意味は常識なんですが、一般的はどうなんでしょうか?

前にQuantizedを単にデジタル化すると言うニュアンスで使用してたら、あるアメリカ人のPre-medの生徒からQuantizedはそんな意味じゃない。とつっかかられた事があります。

彼、Quantizedは原子とかの非常に小さい物が、一般の物理現象に反する挙動を示す事だ。と主張しだしたんです。

私が、だからそれがEnegyの最小単位の存在なんだ。つまりEnegyがデジタル化したんだよ。と言っても全く聞く耳持ちません。

散々、口論になった挙句、Googleで調べたら、私の言ってる事が正しい事が分かったんです。

そしたら、しれっと、真実が判明したので良かった。とか言ってどっかに行ってしまいました。

お前、散々、俺の事、間違っている。って攻撃したよな。それ、お前にとっては真実が分かって良かったかもしれないけど、俺は最初から俺が正しい事知っていて、お前の相手をしたせいで、凄い時間と労力を損したんだけど。

後、俺の言っている事の信用度も、お前の間違いのせいで凄い落ちたんだけど。化学専攻しているのに、Quantizedの意味も知らないの?と周りの人に見られたんですけど。

と思ったんですが、これがアメリカ文化なんですよ。

イラクが核や化学兵器持っているっていって戦争吹っ掛けて、散々イラク人殺した後で、やっぱなかったわ。

真実が分かってよかったわ。

はい。

おしまい。

これがアメリカ式なんです。

こういう連中に今、からまれているのがポケモンの最新作なんですよ。

だからそういう意味ではポケモン、更にその親会社の任天堂はかなり気を付けた方が良いのは確かなんです。

話がそれました。

Pixel化した結果です。

この結果と先程の結果を足します。

足しています!

先程のViewSizeの計算の時もTexCoord[0]に足していました。

ここは後でじっくり勉強する事にします。

後、前節でこの部分の計算の意味が分からないと言っていますが、今、全部の計算結果の画像を見て確認しましたが、やっぱり分かりません。

今回は実装する音に集中します。

この結果にHash23ノードを追加します。

結果です。

本当に見事なNoiseです。

白黒に変換しました。

なんか気のせいかもしれませんが、出来たNoiseがTutorialの結果と違うような気がします。

一回Projectを再起動しました。

そしたら同じになりました。

今度はこのNoiseと実際の画面の映像をLerpで繋ぎます。

結果です。

ここの理屈は前節で理解しているのでここでは繰り返しません。

最初に作成したNoise(以下に示す)

とIF節を使用して繋ぎました。

結果です。

一寸微調整が必要かもしれません。

白い点が目立ちすぎています。

この結果をYIQ Color Gradingに繋ぎます。

結果です。

白すぎます。

Powerの値を50に変更しました。

結果です。

これぐらいなら良い感じです。

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

来週からこのVHS Filterについてもう一度勉強し直して使用されている全部の技術を整理し、かつそれぞれの機能を理論的に明確にします。

4.RPGPackagingについて

先週もまだProjectの名前の変更方法についてグダグダやっていましたが、このProjectは今年中に終わらして、来年からはUE5で新しくPRGを作成しようと思っています。

のでもうProjectの名前の変更は諦めて先に進みます。

先々週、Cloneで作成したCh5_1でGameをPlayしてみましたが普通にPlay出来ました。

結構、Playしたら面白かったですが、Bugも凄いありました。

簡単に述べるだけで、

  • Eventが神殿の守り人と話す前に始まってします。
  • 山の入り口にいる老人がいない。
  • Save機能が働いていない。
  • Eventが終わってもNPCのセリフが同じ。

などがありました。

久しぶりに触ると今まで気が付かなかったBugにも気が付きます。

サイズが22GBもあってとてもこのままでは公開出来る内容ではないですが、ここはPackagingの勉強をする時なので、一回試しにPackagingしてみます。

その後で、サイズを減らすための色々な方法を試す事にします。

Packaginingの方法ですが、Matt Aspland氏のHow To Build Package And Export Your Game - Unreal Engine Tutorial [5]で勉強します。

4.1 How To Build Package And Export Your Game - Unreal Engine Tutorial [5]を勉強する

このTutorialでPackagingについて勉強します。

まずLightingについてです。

影の部分にPreviewと文字が書かれています。

これを直すためにBuildをやり直します。

やり方はBuild Light Onlyをやって、その後にBuildを行うそうです。

Build Light Onlyをやる前にLighting QualityをPreviewから別なLevelに変更します。

Buildが終わったらPackagingの設定に入ります。

Project Settingを開きます。

Descriptionを選択します。

ここは全部重要ですが、書き込まなくても問題ないみたいです。

特に重要だと思ったのが以下のProject Versionです。

Updateするたびに数字を増やしていきます。

次はMaps & Modesです。

Gameを開始する時の設定にしておく必要があるそうです。

全部、既にセットしてありました。

次はMoviesの設定だそうです。

Moviesは作っていないのでTutorialの内容だけまとめておきます。

以下の設定を指定するみたいです。

次はPackagingです。

まず最初の以下の部分は何の変更もする必要ないそうです。

次はBuildの設定です。

この設定がいやな場合は変更せよ。と言っています。

次はBuild Configurationです。

私の場合はDevelopmentかShippingで試してみます。

Build Targetです。

ServerとかClientとかを設定する箇所だそうです。Stand AloneのProjectはEmptyにしておけば良いそうです。

Staging Directoryです。

ここでどこのFolderにCopyを作成するのかを指定するそうです。

Projectのある場所にPackaging する場合は空白のままで良いそうです。

Full Rebuildです。

ここにCheckを入れるとPackagingの前にFull Rebuildするそうです。

For Distributionです。

Shippingの時はCheckを入れるそうです。

次はPackagingの以下の部分を開いて

Cook only mapsにCheckを入れます。

ここにGameで使用するMapを指定するそうです。

これSub Levelはどうなんでしょう?

Sub Levelもここで指定する必要があるんでしょうか?

私のGameで取りあえず必要なMapは

でしょうか?

宿屋用のMapがありますが使用しているのか覚えていません。

調べたら使っていませんでした。

後はLandscape4です。一応入れておきますか。

うーん。

Sub Mapを作成する時にPackagingについてなんて全く考えなかったです。

一応、Sub Mapを含めた全部のMapをセットしました。

次はSupported Platformです。

これはWindow一択です。

次はTarget Hardwareです。

これはこのままでいいそうです。

次はPlatformのWindowsです。

ここは色々な設定が出来るのは分かりましたが今回はこのままにしておきます。

ここからはまだ実際はやらないので、Tutorialの記録に戻ります。

以下の場所からPackagingをやります。

以下のようにPackagingを保存する場所を聞いてくるそうです。

今まで、このProjectを2020に作成してから一回もPackagingについて考えた事はないです。

これでPackagingが成功したら奇跡です。

これから22GBのProjectのPackagingを行ったらこのPCは半日もしくは一日は動かなくなるでしょう。

その結果が、何らかのErrorに成った場合、あまりにも代償が大きすぎるので、それは避けたいです。

ので今回は実際のPackagingは止める事にします。

これまでの知見からPackagingに関しての反省点だけまとめておくことにします。

4.2 Packagingに関しての反省点

新しい機能をProjectに追加するたびとは言いませんが、ある程度の期間に何回かはPackagingを試しておくべきでした。特に

  • C++で書いたCodePackaging出来るのか
  • Sub Mapの扱いはどうするのか正しいのか
  • 要らないAssetの処理はどうするのか
  • 別名でCloneを作成してそこでTestする方法

などについては常に調べて、試しておくべきでした。

今度、UE5でRPGを作成する時は、これらの事を常に考えておく事にします。

Packagingについての検証は今週で終りにします。

来年は、一年かけて、新しくUE5でこのRPGを作り直すことにします。

来週からはそのための計画を考える事にします。

4.3 時間が空いたので試しにPackagingしてみました。

PC1号の方は、1日くらい全く使わなくても大丈夫になったのでその時間を利用してPackagingしてみました。

10分位したらPackagingが止まってEditorが何も言わなくなりました。

なんか出来てるみたいです。

これって動的なLinkされてるんでしょうか?

Exe Fileの名前はch4_3のままですね。

まあ、それは良いです。

起動させてみます。

あれ、カメラの位置が違います。

Editorでは以下のようにCameraが移動してMain Characterの回りを撮影します。

更に、明るさも違います。Editorの方はもっと暗いです。

これは初っ端から問題発生です。

Start画面です。

Editorから始めた場合です。

明るさが全然違います。

ここから直さないといけないのですか?

これは大変です。

「新しく始める」ボタンを押しました。

この辺はEditorからPlayした時と全く変わらないで進める事が出来ました。

実際のGameの開始です。Map1に移動しました。

いきなり小Eventが始まりました。

「閉じる」を押しました。

普通にGameが始まりました。

これは出来ているんでしょうか?

辺りを見回したら、何故か短剣が後ろに落ちていました。

これじゃ最初のEventの武器を手に入れるがここで終わってしまいます。

ちゃんと夜にもなっています。

会話も普通に出来ました。

村に着くと普通にNPCが歩いています。

夜に成るとNPCは消えました。

道具屋にいって買い物をしようとしたら何も表示されません。

これは必要なData TableがPackagingされてないのかもしれませんね。

落ちている回復薬を拾ってみました。

拾った回復薬は記録されていました。

いやそれよりも、PlayerのParameterが全部0になっています。

これC++の方が全く動いてないんじゃないでしょうか?

武器を拾って装備しました。

これは普通に出来てます。

最後にMonsterと戦闘してみました。

戦闘画面に飛びましたが、戦闘が開始しません。

やっぱりC++の方のCodeとの連携が上手くいってないですね。

今週はここまでやったら十分です。

残りは、来週考えます。

5.Open Worldの検証

5.1 建物の作成

もう建物は大体完成に近づきました。

今週は建物の周りの環境を作成します。

こんな感じで緑を増やしたいんですが良いAssetがないです。

探してきます。

ありました。Environment Setです。

以下の様になりました。

建物はこれで完成とします。

5.2 Naniteの勉強

Naniteって通常だとCollisionついてないんでしょうか?

今週はこれについて調べることにしました。

Static Meshを開いて以下の場所に以下の設定をすれば良いみたいです。

ダメでした。

Collision自体が設定されてなかったです。

しました。

テストします。

今度はCollisionします。

動的に生成したNaniteにもCollisionするようになりました。

次はFoliageです。

この岩をFoilageで生成しました。

Collisionしません。

以下のFoliageのParameterの設定を変えるのを忘れていました。

Collision PresetsをBlock Allに変更しました。

Blockされるようになりました。

もう少し、Collisionを細かくしたいです。

全部試しましたが今のが一番細かいCollisionみたいです。

6.Gaeaの勉強

6.1 Layer同士がBlendしている時は、両方のLayerがBlendするのではなく、後のLayerが100%上書きするような設定について

先週、このやり方が分からなかったんですが、一つ思いつきました。試してみます。

それはMaterialのLayer BlendノードのParameterにあるPreview Weightです。

この値によってBlend率が変化すると思います。

まずLayer Grassだけ100にして、残りのLayerは0にしてみました。

赤い部分がGrass Layerです。

これではよく分からないので拡大してみます。

以下の部分は緑色のLayer、つまりForest Layerとよく混じっている感じがしますが、前に試したような黄色にはなっていません。

Forest Layerの緑も(0,1,0)に変更します。

わずかに黄色くなっていますが、前回と比較すると混じっている量はわずかです。

黄色くなっているところを発見しました。

今、Grass LayerのPreview Weightは0です。

100にしました。

変ってない?

この方法ではダメみたいです。

これはGaeaの方でMaskを作成する時に考える必要があるのかもしれません。

6.2 Layerを選んでそのLayerだけにFoliageをPaintする方法

これはやり方だけは先週、確認しましたが実装はしていません。

今週は実装もやります。

FoliageにSM_Rockを追加して

そのParameterにあるInclusion Landscape Layersに

Grassをセットします。

試しにこの状態でPaintしてみました。

見事にGrass Layerである赤い部分にだけSM_RockがPaintされています。

Play画面です。

Collisonの設定も以下の様にしておきました。

Collisionしています。

岩の並びはかなり変です。

SM_RockのParameterを色々弄ってみました。

前よりはましですね。

Nanite Viewで見ました。

しっかりNaniteも効いています。

6.3 Landscape生成における疑問の解答まとめ

先々週の以下の疑問はほぼ解明しました。

唯一、分からなかったのはLayer同士が重なったところのBlendについてです。両方のLayerが100%、その場所を保持している場合、どっちのLayerになるのかは不明のままです。

これは、Gaea側でそういうことが起きないようなLayerを作成すべきなのかもしれません。

これだけでは時間があまってしまうので、GaeaのTutorialの勉強もします。

6.4 Gaea Tutorial for Beginners #6 | Texturing our first terrain [7] を勉強する

Andrea Cantelli氏のGaea Tutorial for Beginners #6 | Texturing our first terrain [7] を勉強します。

このTutorialはもうLandscapeの作成とは関係無くて、作成したLandscapeにTextureを貼る方法について勉強するみたいです。

まず軽く全部見てみます。

前回、作成したと思われるTerrainの実装がこれです。

このTutorialの最初に出て来た実装が以下のものです。

Swirlノードの数以外は全部一緒です。

これを使用すればこのTutorialの勉強はすぐ出来ます。

全部見ました。

思ってたのより3倍位複雑でした。

後知らない事ばかりでした。

更にKlaus氏のやり方ともかなり違う気がします。

そして最期にとても勉強になる事ばかりでした。

これはしっかり勉強する必要があります。

Texturingに関しては、Klaus氏のTutorialでもあんまり真剣には勉強しなかったのでどこが違うのかとかその理由についてとかはまだ語れません。

今回は、Andrea Cantelli氏のやり方をそのまま勉強するのが限界です。ので、そのまま勉強します。

追加ですが、あんまりMaskについての役には立たないかもしれません。

それでは以下にこのTutorialの内容をまとめます。

<無題>

まずTexturingに使用しているNodeのタイプについて解説しています。以下のCategoryの中でData、Colorが良く使用されるそうです。

DataのCategory内にあるNodeです。

この中では、Slope、Texture、そしてSoilが良く使用されるそうです。

Color CategoryのNodeに関しては

これらは全部、色塗る為のToolだそうです。

Mixerノードとか、Normal Mapノードとか明らかに色塗る為のToolじゃないですよね。

実装は別枠でやろうと思ったんですが、このTutorial、Nodeの画像が小さすぎてScreenshotに取る事が出来ません。

のでNodeは自分のGaeaで実装したのをScreenshotします。

ので実装もここでやります。

まずSoilノードを追加します。

Errorが表示されているのはInputのNodeを繋いでないからです。

Portalを使用してNodeを繋げます。

Andrea Cantelli氏は同じGraph内でTextureの実装も行うみたいですね。

これについてはKlaus氏のやり方のようにTextureの作成は別のGraphを使用した方が、後から見た時に分かり易いと思います。

結果です。

凹凸が無くなっています。

Tutorialではこの凹凸を復元させる方法を教えてくれるそうです。

Micro Erosionを右ClickしてPin As Underlayを選択します。

以下のようにデコボコが復活しました。

ふーん。

Pin as Underlayの使い方、やっと理解しました。

こうやって使用するんですね。

Tutorialを勉強するのは地味でつまらないですが、こういう風に、Nodeの機能を一個一個、本当の意味で理解していくためには絶対必要です。

頑張ってやって行きましょう。

同様の手段でSlopeノードを追加しました。

結果です。

Slopeの激しい所が黒くなっているんでしょうか?

2Dでも確認してみます。

うーん。そうみたいですね。

なんか気分的にはSlopeがきつい方が白くなるべきな気がしますが。

<Texture

何故かここから次の節が始まっています。内容的には全く切れていません。

今度はHeight ノードです。

結果です。

黒い部分と影の部分が混ざって良く分からないです。

2Dで見てみましょう。

これは分かり易いです。

Parameterを弄ってみました。

なんとMaxとMinの値を指定する事で以下に示したように、山の中腹部だけ選択する事も出来ました。

これはMaskとして考えるとかなり重要な気がします。

後、これはまだ構想中なんですが、このMaskというかLayerに応じて、SpawnさせるMonsterの指定って出来ると思うんです。

SoilノードとSlopeノードのParameterの使用方法も勉強しておきます。

<<SolidノードのParameterについて>>

SoilノードのParameterです。

Powerの値を変更しても、GradedにCheckを入れても何も変わりません。

???となっていたら下の方Apply Change Buttonがありました。

まずGradedにCheckを入れました。

結果です。

凄い白くなりました。

これはどんな機能なんでしょうね。

Quadspinner社のGaeaの公式のDocumentのSoil [8]を見ると

と書かれていました。

Depositsって堆積物の事でしょう。

堆積物にもなだらかなGradationを付けるって事でしょうか?

分かりました。

以下に示したSoilのRemarkを読んだら、このSoilノードが何を計算しているのか理解出来ました。

まず、Soilっ土でしょう。という前提が間違っていました。

ここで言うSoilは、川とか山の溝から滑り落ちて崖の底などに貯まった堆積物の事を指していました。

この堆積物の量を管理しているのがもう一つのParameterのPowerだったんです。そしてGradedはその堆積物にGradationを付けるかどうかを聞いてるだけでした。

ではもう一つのParameterであるPowerですが、

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

これを30に上げてみると

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

変化しているのは分かりますが、どう変化しているのか?

それは公式のDocumentのSoil [8]に書いてありました。

Powerの値を上げると、堆積物の量が増えます。しかしその結果堆積物の細部の形状は消えます。Powerの値を下げると堆積物の量が減った結果、堆積物の細かい形状も見える様になります。

はい。理解出来ました。

<<SlopeノードのParameter>>

まず以下のParameterがありました。

Min、Max、そしてFalloffに関してはMinとMaxの間の値を白くして、その白さのGradationの割合をFalloffで決めるのは間違いないでしょう。

上記の条件でやったら以下のようにほとんど平らな部分だけ白くなりました。

Slopeが5~9°の間だけ白くなっているはずです。白い部分を見るとそんな感じです。

Classic StyleにCheckを入れていました。

結果です。

これは計算方法が昔のやり方と今のやり方で違ってて、その昔のやり方を採用した場合はこうなります。って事でしょうか?

公式のDocumentのSlope [9]を見ましたが、

Classic Styleについては何の記述もありませんでした。

以上です。

<<Textureノードについて>>

これで全部のNodeを勉強したのかと思ったら今度はTextureノードについてです。

まず結果を示します。

凄いけど、選択されている箇所の基準が良く分からないです。

Tutorialの説明は、このNodeはGaeaのNodeの中でも最も複雑なNodeの一つです。で終わっています。

Parameterも以下に示したように複雑です。

計算結果にSlopeやSoilの結果も入っていました。

このNodeは今回はこんなNodeもあるのか。位の理解に留めておきます。

<<Tutorialの続き>>

Tutorialの続きに戻ります。

まずResolutionの設定を2kにしました。

凄い細かくなりました。

でも正直に言うと私のMonitorだとあんまり良く分からないです。

Soilノードを残して他のNodeは全部消しました。

SoilノードにSat Mapsノードを追加します。

結果です。

SatMapsノード以外にも色を指定するNodeが何個かありそれを説明しています。

このTutorialの節の分け方、滅茶苦茶です。

最初のTexture(Mask)を作成するNodeで節に分けて、先程のSlope、Texture、Soil、Heightノードの説明を入れて、次の節で、そのTextureに色を付けるためのColorのNodeの説明をすべきです。

今の分割は何を根拠にして分割しているのか不明です。

まず一個目の色を付けるためのNodeはQuick Colorです。

Quick ColorのParameterです。

試しにColorに赤、Color2に緑をセットしました。

おお、こっちの方が直観的に理解し易いですね。

ただし、私はMaterialはUE内で作成するので、実際のLandscapeを作成する際には、このColor categoryのNodeは全く使用しないかもしれません。

次はCLUTerノードです。

これと、先程のSatMapsノードはKlaus氏のTutorialで何回か使用しましたので、機能は大体は理解しています。

CLUTerノードの以下のParameterを使用して

Quick Colorノードと同じ様なColorを作成してみました。

CLUTerノードはQuick Colorノードと違い、2つ以上の色をセットする事が出来ます。

やり方は矢印が指している場所にCursorを乗せた状態で左Clickするだけです。

作成した矢印を消す方法も有ったはずですが、このTutorialでは説明していませんでした。

というかこのTutorialではこのNodeの使用そのものを勧めていません。

色を指定するくらいならSatMapsノードを使用した方が遥かに本物らしい色を追加出来るので、SatMapsノードを使用しましょう。で終わっています。

そしてSatMapsノードの色の選択についても、

以下の様な沢山の色があるBarを選択すると変な色が追加されてしまうので、

色の変化の単調な以下の様なBarから選択する事を勧めています。

ここでTextureの節が終わっています。

<Texturing

ここで節が切れているのが全く理解出来ないんですが、今度は以下の実装を作成しました。

TextureノードでMaskを作成してそれをSatMapsノードで色付けしています。

どうせこの後、Mixerノードを使用して前のcolorと混合するんでしょう。混合具合が分かり易いように緑色にしました。

やっぱりそうでした。

と思ったら、そのMixerノードが私のGaeaにはありません。

きっとRGBMixノードを代わりに使用すれば良いんだろうと思ったら、コメント欄にAndrea Cantalli氏自ら、

Combineノードを代わりに使用して下さい。と書いていました。

はい。

しました。

取りあえずCombineノードの設定は以下のようにしました。

結果です。

ほとんど茶色になっているじゃないですか。

やっぱりMaskにTextureノードのような複雑な計算をするのを使用すると結果の予測が不可能になりますね。

<Masks

ここで節が変わっています。このTutorialの節を分けた人、全くこのTutorialの内容を理解していませんよ。

びっくりです。

これ以上、Tutorialの節通りに分けても無駄なのでここからは分けないでやります。

更にSatMapsノードを追加してCombineノードで混合しました。

ここはTerrainに本物のような着色をする色々な方法を教えていると解釈する事にしました。

Textureノードから2つのSatMapsノードで別々の着色をしてそれをCombineする事で、Terrainの色をもっと本物らしくする方法もありますよ。と言ってる訳です。

これUEにImportするならMaskが重要なのでそのMaskにどうやって着色するかはもはやUE側の問題です。

のでこの辺はサラッと勉強して終わりにします。

更にCombineノードのMaskをSlopeノードで指定しました。

この辺のTechniqueは既に自分のモノにしているので、サラッとやっていきます。

<Vegetationノードの追加>

そしてVegetationノードを追加しました。

Tutorialによるとこれを追加しただけで、Terrainに緑が追加されるみたいに言っています。

近づいてみます。

ホントだ。緑が追加されています。

TutorialによるとこれをGrass用のMaskに使用する事も可能だそうです。

Tutorialに習って以下のParameterを弄ってみます。

兎に角、緑を増やすようにしてみました。

うーん。何とも言えないですね。

SlopeのBottomの値を0にしても平らな所で緑色にならない部分が結構あります。

以下のようにVegetationノードのDistにFxノードを追加して、

Fxノードの画像を見ると

VegetationノードがどこをCoverしているのか一目瞭然です。

何と、Slope Topの値を下げると

平地の部分の色が黒くなりました。

これ、普通の設定と逆ですよね。

うーん。

良く分かりません。

ここでTutorialも終わっています。

ので最後に私のTerrainの色付けした結果を載せて終わりにします。

7.雪山のMapの作成

今週もVolumetric Cloudの勉強をしていきます。

まず、今週は今までの勉強の成果についてまとめます。

これは先週までの勉強で、UEにおけるVolumetric Cloudの全容が大体理解出来たので、それを忘れない内に記録に残しておくべきだ。と思ったからです。

そして Zero Conditional氏の Beginners Intro to Volumetric Clouds in Unreal Engine 4.26 [13]の続きを勉強します。

 Zero Conditional氏のVolumetric CloudのTutorialは全てのVolumetric Cloudの元になったTutorialです。一回は勉強しておく必要があります。

7.1 UE5におけるVolumetric Cloudについて、今まで勉強して分かった事のまとめ

Defaultでついている雲よりPlug-inにある雲を使用すべき>

Volumetric CloudのParameterにはMaterialをセットする箇所があります。

Volumetric Cloudが試験的に導入された4.26のころから、Defaultで使用されているMaterialを使用するよりは、以下のPluginの

以下の箇所にある

Materialを代わりに使用した方がPhoto-realisticな雲が出来ると言われています。

ただし、現在、5.1のVersionでは、ここにある全部のMaterialがそのまま使用出来るわけではありません。

というか、ここにあるMaterialのほとんどが、そのままでは使用出来ません。

以下に示したような

雲一つない空になってしまいます。

Volumetric Cloudは、実は別なやり方で作成する事が出来ます。

現状の5.1では、これらのMaterialは、その別なやり方でVolumetric Cloudを作成する時に使用するようになっています。

ので、多くのTutorialで主張されているような、これらのMaterialをDefaultのMaterialの代わりに使用する事は、5.1以降のVersionでは出来ません。

<2つの別なやり方について>

Volumetric CloudにはDefaultの作成方法以外に、更に2つの別な作成方法が存在します。

それについてまとめます。

一つ目はPlaceble Cloudと言われている手法で、作成した雲を好きな箇所に置く事が出来ます。

この手法で作成した雲は、Saveする事が出来ます。

2つ目の手法はPainted Cloudと言われる手法で、雲を自分で描く方法です。

この手法で描けるのはXY面だけでZ面は固定されています。

更に、現時点では描いた雲をSaveすることが出来ず、お試し用と言っても良い感じです。

(ただし、私が知らない方法でSave出来る可能性はあります。あくまで私が調査した範囲の結論です。)

<Volumetic PluginにあるMaterialに対しての私の見解>

ので私の結論としては、これらのVolumetricにあるMaterialをDefaultのMaterialの代わりに使用するのは、得策ではないです。

DefaultでSetされているMaterialをそのまま使用した方が良いです。

<Parameterについて>

となると、自分でVolumetric Cloud用のMaterialを自作する以外の場合、雲の調整をするのはParameterに頼る事になります。

このParameterにはVolumetric CloudのParameterと使用しているMaterialのInstanceにあるParameterがあります。

これらのParameterの内のいくつかは非常に重要で、Volumetric Cloudを使用する場合は、必ず理解しておかないといけないものがあります。

具体的なParameterについては今、勉強中で、来月中にはまとめたいと思っています。

<Volumetric Cloud用のMaterialを自作する>

Volumetric Cloud用のMaterialはぞんなに複雑な構造をしているわけではないので自作する事は可能です。

ただし、人は雲の形状については、ほとんど認識出来ません。

雲の形状を一生懸命、自作しても、評価されないどころか、雲の形状が変化している事にすら気が付かれないと思われます。

Volumetric Cloudの専門家にでもなるのでなければ、今あるMaterialをそのまま使用すべきだと思います。

逆に、 Volumetric Cloudの専門家としてGame、VR/AR、そしてCG映像関連の会社のコンサルをしたり、Volumetric Cloudで自作した雲をAssetとして販売したりするつもりなら、かなり将来性のある分野だと思います。

Volumetric Cloudについて私が勉強した範囲で理解できた事をまとめました。

7.2  Beginners Intro to Volumetric Clouds in Unreal Engine 4.26 [13]の続きを勉強します

先週は、Cloud Shadow Extentの値を弄って空にある層みたいなのを消すところまで勉強しました。今週はその続きをやって行きます。

<Cloud Ambient Occlusion

Ambient OcclusionはSky LightのParameterです。

これをOnにすると

になります。

更にSky Atmosphereでは

Rayleigh Scatteringの調整が出来ます。

The Volumetric Cloud Actor

Volumetric Cloudの

Parameterについて勉強します。

まずはLayerです。

この前にTransformがありますが、実際のVolumetric Cloudの位置を指定するのはこっちのLayerの方だそうです。

この中で特に重要なParameterが以下の2つで

雲の底と厚さを指定しています。

単位はKmだそうです。

実際の雲ってどのくらいの高さに存在しているんでしょうね。気になります。

調べました。

雲の観察マスターになる-自由研究スペシャル [10]によると一番高くても13kmぐらいだそうです。

Tutorialでも気になったみたいで調べていました。

この話題についてはGuerilla Games社の論文でも論じられているそうです。

Beginners Intro to Volumetric Clouds in Unreal Engine 4.26 [13]にはその論文のLinkも載っていました。

一応Downloadしておきます。

Tracing Start Max Distanceです。

これの説明をTutorialでは

と言っています。

この場合のTracingの意味が分かりません。

その下のTracing Max Distanceは

この値を変更する事で、

作成される雲の奥行が変わります。

Explore Cloud Material Instance

ここではMaterial InstanceのParameterの値を弄って雲の形状を変化させています。

ここにあるParameterの内、幾つかはGuerilla Games社の論文で詳しく論じられているそうです。

更に公式のVolumetric Cloudのサイトでも解説されているそうです。

以上でした。

特にこのParameterの機能は覚えておけというのはありませんでした。

Cloud Material Parent and Graph

今度は、DefaultでセットされているMaterialの実装を見て行きます。

ここでZero Conditional氏、一部の人の間でこのMaterialの実装がしょぼい。と言われていますが、それを言っている人達はこのMaterialの実装を理解していない。と憤慨しています。

以下に示したように、2つのパートに分けれます。

上の部分がNoiseとErosionを担当しているそうです。

このMaterialの実装は前にかなり勉強したので覚えています。

Noise and 3D Volume Texture

更に、Volumetric Textureが使用されている箇所を見つけています。

これ、私が発見した時は、ついに俺の時代が来たのかと狂喜乱舞しました。

Volume Textureを3Dで見る方法もしっかりここで紹介されていました。

うーん。

私、これ内心かなり自慢だったんです。3D Volume Textureを扱えるのは俺以外そんなにいない。やろ。みたいな。

このTutorial、しっかり3D Volume Textureの使い方を解説していました。

ここでBrightnessを変更して、雲の形状をこれから

これに変更しています。

ただしそのBrightnessのParameterがどこにあるのか不明です。

Screen上に写っていません。

今度はVolumetric Advanced OutputノードのConservative Densityのinputを切っています。

思い出して来た。

この実装、前にBen Cloward先生のTutorialで勉強しました。

この部分は雲のZ軸の形状を作成しているはずです。

Exploring the 2D Cloud Textures

本来はこの部分は来週勉強する予定だったんですが、どうもこの部分でその雲のZ軸の形状をしている事について解説するみたいなんで、見てしまいます。

まずこの雲の横から見ると以下の様な形状をしています。

これは先程の図にある以下の雲と形状がそっくりです。

更に、Volumetric Advanced OutputノードのConservative Densityにある以下のTextureにそっくりです。

はい。

私はこの部分は散々勉強したのでこのTextureがどうやってZ軸の雲の形状に還元されているのか、完璧に理解しています。

これは面白い事になってきました。

Tutorialの説明を聞いてみます。

何と以下の様なsの形状のTextureを作成して雲の形状がどうなるのか試しています。

私は工の形状のTextureを作成して試したんですが、同じ事しています。

はあ。

私の実験もまんざらじゃなかった。というかかなり優秀な実験だったんですね。

結果です。

うーん。

これはかなり解読しにくい結果ですね。

私の工の字のTextureは直ぐにXとYの値からZの値を指定しているんだ。と推測出来ましたが、これは中々難しそうです。

ああ、Z軸に対してS字の形状に雲を作成しているのかもしれないと。間違った結論に到達してしまいました。

今度は以下のTextureで試しています。

これは、なんかこのTextureの読み方を知っている人が作成したっぽい形状していますが、まあ偶然かもしれません。

結果です。

うーん。

これも分かりにくい結果になっていますね。

ここでZero Conditional氏、このTextureが具体的に何を計算しているのかを判明する事は諦めて、どんなTextureを入れるとどんな形状の雲が作成出来るのかについて調べ始めてしまいました。

あー。

惜しい。

でも以下の様な本物そっくりの雲を作り上げてしまいました。

これはこれで凄いですね。

以上でした。

Beginners Intro to Volumetric Clouds in Unreal Engine 4.26 [13]を勉強した感想

思ったより普通でした。

まあ、このTutorialが作られた時期とかも考慮しないといけないのかもしれませんが、Materialの実装の検証に関しては、私の分析結果の方が遥かに上でした。

これは、これからVolumetric Cloudについて勉強する人達のために、私のVolumetric Cloudに関しての勉強の成果をまとめておく必要がありますね。

私のVolumetric CloudのTutorialを見れば、無駄な事を勉強する必要がなくなり勉強時間がかなり短縮されるし、正しい勉強方向も理解出来ます。

後、勉強になったのは公式のVolumetric Cloudのサイトが有る事と、Guerilla Games社がVolumetric Cloudに関する論文を発表している事を知れた事です。

これは勉強する必要があります。

8.Dialogue Systemの作成と復習

今週は、先週の謎である

について調査する事にしました。

というのは、Dialogue Plugin Systemの使い方を勉強したTutorialの次のTutorialの名前が、 Dialogue Plugin: Conditions & Events (new version) [11]だからです。

これを勉強したらConditionが何を指しているのか判明するはずです。

と言う訳で、今週は Dialogue Plugin: Conditions & Events (new version) [11]を勉強します。

8.1 Dialogue Plugin: Conditions & Events (new version) [11]を勉強する

まず一回軽く見ます。

門番との会話中の門を開けるEventを行っています。

更にそのConditionとしてPlayerのIntimidation Skillが20以上なら門を開けるというConditionを設定しています。

この実装中に、

が使用されたのかどうかまでは確認出来ませんでした。

もう一回見て以下に実装方法などをきっちりまとめます。

まず以下のようなLevelが最初から完成しています。

この門番との会話に使用しているDialogueです。

これぐらいだったら自分で作成出来そうですね。

ただWidgetをどうやって作成しているのかの説明は全くないですね。

付属のWidgetを使用しているんでしょうか?

以下のNodeに到達した場合、門を開けるEventを発動する実装を組むそうです。

以下のParameterに何かをセットするみたいです。

ここにSetするためのClassを作成します。

Create BP Classを開き、Parent ClassにDialogueEvents Classを選択します。

Tutorialでは出来たBPにPlay Matineeと名付けていました。

中を開いてVariableを追加しました。

VariableのTypeは、Level Sequence Actorで

Referenceは、Class Referenceです。

ほお。

Class Referenceを使用するのはあまりないですね。

最後にInstance EditableにCheckを入れます。

次にFunctionsのOverrideをClickし、

Recieve Event Triggerdを選択します。

ここでEventの実装を書くんですが、Tutorialの内容が混乱しています。

つまり、このTutorialのやり方は古いVersionのやり方で、新しいVersionはこのやり方でやらなくても出来るみたいです。

しかし、それは本質とはあんまり関係なくて、今、このTutorialで勉強している人達は、簡単な例で良いのでEventの書き方を知りたいわけです。

なんかUserの要望と一寸ずれたTutorialになっているかもしれません。

後、新Versionでは新しいやり方で出来るようになったらこんなCaptionで直すんじゃなくてTutorial自体作り直せと思いました。

ああ、分かった。

このEvent、発動したら門を動かしたい訳です。

でもその門のActorにこのClassからAccessする方法がないわけです。

そのやり方をここで教えると言っている訳です。

しかし新Versionでは、このClassから直接、門のActorにAccess出来るようになったんです。

それでしかたなくCaptionで注釈を入れているんです。

はい。

では、TutorialのこのClassから門のActorにAccessする方法を見てみましょう。

まず、Considering PlayerをCastしています。

そしてPlayer Controller を開き

Custom Eventを追加しました。

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

うーん。

このSequence Playerが門を開けるSequenceなんでしょうか?

今度はさっき作成した Play Matineeに戻り以下の実装を追加します。

はい。

今度はDialgoue Classに戻って以下の場所に、 Play Matineeをセットします。

門が開きました。

はあ。

もっと簡単な例で解説してほしかったですね。

今度はこれにConditionを追加します。

以下のNodeにConditionを追加します。

CharacterのClassには前から変数、Intimidateがあり、

この値が20以上なら門を開けるようなConditionを作成するそうです。

なんと、Tutorialの説明を更に聞いていたら、以下のNodeでConditionを追加するそうです。

へえ。

びっくり。

このNodeの以下のParameterにConditionをSetする場所がありました。

分かりました。

ここに先程と同じようにClassを作成してSetする訳ですね。

やっぱりそうでした。

Create BP Classを開き、Parent ClassにDialogue Conditionを選択します。

そして名前をCheck Intimidationにします。

早速このClassを開き以下のVariableを追加します。

Instance EditableにCheckを入れます。

これはInstance毎にDoorを開けるために必要なImtimidateの値を設定できるようにするためなのか、それともこの実装をするのに必要なのかがはっきりしません。

次にIs Condition Met FunctionをOverrideします。

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

はい。

ここで一寸疑問に思ったんですが、Overrideって概念、Programmingを勉強したことない人に理解出来るんでしょうか?

この辺が、UEの宣伝をする時に、BPを使用しているからProgrammingを知らなくてもGameが作成出来るとか言っている人がいるのを見ると

うぇー。って吐きそうになる理由です。

BPだってりっぱなProgramming言語です。

きちんとProgrammingの基礎を学ばないと使用出来るようにはなりませんよ。

そして、Dialogue Classに戻って以下の場所にセットします。

PlayerのIntimidateの値を15に変更したら門が開かなくなりました。

以上でした。

Dialogue Plugin: Conditions & Events (new version) [11] を勉強して>

EventとConditionの設定方法は理解出来ました。

しかし以下のNodeとの関連性は不明のままです。

このNodeがDialogueのNodeが

  • Conditionを持っているのかどうかをCheckするのか
  • ConditionTrueかどうかをCheckしているのか
  • そもそもDialogueNodeConditionとは全く関係ないのか?

その辺は全く不明のままです。

これは来週、検証します。

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

9.Anime Renderingの勉強

本当は今週はAnime Renderingの勉強の総括をしようと思ったんですが、

をやる必要があるので、総括は来週やる事にします。

まずは以下の実装を組みました。

Tangent SpaceかWorld Spaceかの問題についてですが、偶然ですが、全部World Spaceで計算していました。

結果です。

うーん。

影がオカシイです。

上記の場合だと顔半分くらいは光が当たるはずです。

あ。

分かりました。

World Positionは単なる位置の情報を表していてWorld Positionの位置における法線を返していたわけじゃなかったです。

それなのにここに法線転写のために使用したNormal Vectorの計算をぶち込んだので、Positionの情報がVectorの情報に書き変わってしまっています。

これが全部駄目にしています。

一寸考えます。

いや、あってました。

この場所は、Vertex Normal WSを本来は返していた箇所です。Vertex Normal WSの値の代わりにNormal Modifier MiniのPositionとWorld Positionの差分から、そのWorld PositionにおけるNormal Vector、しかもWorld SpaceにおけるNormal Vectorの値を計算している訳です。

つまりここは位置の情報からVectorの情報を計算している箇所です。結果としてNormal Vectorを返すのは正しいです。

うーん。

全部見直しましたが、計算方法やLogicは全部、正しいように見えますね。

以下の方法で試してみます。

先週作成した以下のものがあります。

このMaterialの実装は

となっています。

このVertex Normal WSの値を以下のように変更します。

Sphere Centerは、このMaterialを使用するSphereをBP化して以下の実装を追加する事で

Sphereの中心の値をPassします。

この計算結果とNormal Vector WSノードの値は同じになるはずです。

いや、現実ではなってないんですが、私の頭の中の理論では同じになるはずなんです。

なのでこの結果を見て、私の理論のどこがオカシイのかを確認します。

結果です。

このままでは影しか映らないのでShadow Sizeを0.83に変更しました。

結果です。

Directional Lightを移動させます。

Zの値を変化させます。

うーん。

普通に変化していますね。

隣に、

を使用したSphereを並べてみます。

全然違う。

えーっと。以下の計算と

VertexNormalWSの値が

同じになるはずなんです。

これを確認するために

をEmissive Colorに繋いでみます。

Absolute World Positionの結果も

Emissive Colorに繋いでみます。

違う。

全然違う結果になっています。

Sphere CenterとWorld Positionを逆にしてみます。

結果です。

今度は同じ結果になりました。

Level上でも同じか確認します。

Vertex Normal WSです。

Sphereをどこに移動させても結果は同じです。

今度は、

の結果です。

あれ?

しかもこれSphereの位置で色が変わります。

原点に移動したときだけ同じ値になりました。

これが原因か。

更に調べた結果、Sphere Centerの値がLevelの全ての位置で(0,0,0)でした。

原因が判明しました。

Playを押さないとTick関数が動かないんです。

PlayでSphere Centerの値が反映させるようになりました。

Playボタンを押してもう一回テストします。

両端のObjectが

で真ん中のSphere

で計算しています。

影の向きが全部反対で間違っていますが、3つの結果は同じになりました。

Directional Lightの向きを変更しました。

影の方向は同じに出来ています。

SphereのBPのConstructorに以下の実装を追加したらPlay前でも同じ影を示すようになりました。

取りあえず、元のLevelに戻ってPlayボタンを教してテストしてみます。

Shadow Sizeの値を少し調整しましたが、それ以外は全く弄っていない、最初の実装と同じ状態です。

それでもそれなりに出来ていますね。

鼻の影が写ってない事から法線転写が作用している事が確認出来ます。

ああ。

疲れた。

原因はPlayボタンを押さないと、Event Trickが発動しないから、Sphere Centerの値が0のままだったからでした。

今週はこれしかやらないつもりだったので、ゆっくり時間をかけて楽しみながらやっていましたから、特に苦痛では無かったですが、まさか原因がPlayボタンを押さなかったからだったとは。

まだまだ勉強中である事を再確認させられるような結果でした。

これからも謙虚に、慌てず焦らず楽しくUEの勉強をして行こうと思いました。

10.DirectX 12の勉強

今週からOlympusMonsTutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [12] を勉強します。

今週は、このTutorialが全体的に何をやっているのかを整理してまとめます。

Intro

このTutorialで勉強する内容についてかんたんな説明をしています。

その説明によるとこのTutorialでは、前のTutorialで作成したWindowが従うProcessを作成するそうです。

具体的には以下に示したのPre-CompileしたHeaderを使用するそうです。

これによって効率化が高まるそうです。

次の部分の説明が良く分かりません。

以下の図が表示されて

Resource FileのImportに慣れるみたいな事を言っています。

ここの部分は実際の内容を見て理解する事にします。

最後にScriptのFormatについて解説するみたいです。

Introで説明されたのは大体こんなものでした。

Episode Two Folder

Two Folderって何をするんだろう。って思いましたが何んと、前回作成したFolderとその中のVSのCodeをCopy and Pasteしてもう一個作成していました。

いや、GitHub使えよ。と突っ込んでしまいました。

A Windows Process

前のTutorialで作成したWindowを開きます。

Tutorialによると、我々にはまだこのWindowを操作する機能がないそうです。

例えばこのWindow にあるClose Buttonを押すとWindow は閉じますが、VSのProgrammingは終了しないで実行し続けています。

その機能を追加するみたいです。

そのための具体的な手法がここで解説されています。

その具体的な手法は今回はここではPassします。その章を勉強する時に記録にまとめます。

一個だけ書いておくと、そのためにWindow Process() 関数を作成します。

これがこの節の題になっていた訳です。

この部分は、もしかしたら先週、勉強したWindow Procedure ()関数の事を言っているのかもしれません。

この節を勉強する時に、その辺もしっかり確認する事にします。

Pre-Complied Headers

最初から結構重要な話をしていました。

VSは、IncludingしているFileの全てをCompileしているそうです。

のでそれらのFileをPre-Compileしておけば、Compileに掛る時間を凄く短く出来るそうです。

実際のやり方については、この節を勉強する時にまとめます。

Adding Our Icon File

ここではIcon Fileを我々のProgrammingに追加します。

具体的は手法はこの節を勉強する時にまとめます。

以下の部分が何をしているのか判明しました。

ここからIconをProgrammingに追加していました。

IconがWindowの端に表示されるようになりました。

String Tables

先程出て来た、Add Resource BoxにあるString Tableについての解説をしています。

残念ながら、今回軽く見ただけでは、このString Tableが何を管理しているのかまでは理解出来ませんでした。

それについては、この節を勉強する時にじっくり勉強して答えられるようにします。

Version File

これもAdd Resource Boxの話でした。

これはVersion Controlのための情報を管理していると推測出来ます。

ここでは以下の様な票をAdd Resource Boxから開いて

どのDataをUpdateするのかなどを解説していました。

Formatting Our Code

後にCodeが膨大になった時に整理するのは大変なので、今の内からCodeのFormatをしておくそうです。

具体的に何をやっているのか分かりました。

以下のようにそれぞれの関数などにCommentをつけています。

なんだ、そんな事かと思ったんですが、このRegionの使用方法は知りませんでした。

後は、WinMain()関数内の実装を別な関数に移したりとかしています。

最終的に派WinMain()関数は以下のようになっていました。

A Window Refined

ここは完成したWindowを表示して、このTutorialで実装した成果を表示していました。

それだけです。

Outro

特にないです。

C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [12]をサラッと見た感想>

まだDirectX 12の勉強には入っていませんね。

同時期に勉強している3つの日本語の本では、次の章で確実にDirect X 12の勉強に突入します。

日本語の本の勉強は一寸待つか、それとも先にどんどん進んでしまうのか、考える必要がありますね。

11.まとめと感想

今週は普通に勉強するつもりだったんですが、よく考えたら今年も後2回しか勉強出来ない所まで来ていました。

来週から今年勉強した内容の総括をやります。

そして12月最後の週と来年の一月最初の週はお休みします。

12.参照Reference

[1] OlympusMonsTutorials. (2021, February 17). C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window. YouTubehttps://www.youtube.com/watch?v=2vrEIhAajhM

[2] CreateWindowW macro (winuser.h) - Win32 apps. (2022, July 28). Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindoww

[3] Window Styles (Winuser.h) - Win32 apps. (2022, August 19). Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles

[4] renderBucket. (2022, April 28). Unreal Engine 5 Tutorial - Niagara Fluids - Flamethrower [1/2] [Video]. YouTubehttps://www.youtube.com/watch?v=k3EBxQGVSj8

[5] Matt Aspland. (2022, February 6). How To Build Package And Export Your Game - Unreal Engine Tutorial [Video]. YouTubehttps://www.youtube.com/watch?v=O2PKihXmejw

[6] Ben Cloward. (2022, September 22). Post Process VHS Filter Part 3 - Shader Graph Basics - Episode 62 [Video]. YouTubehttps://www.youtube.com/watch?v=k5mzB9PSg4o

[7] Andrea Cantelli. (2020, June 6). Gaea Tutorial for Beginners #6 | Texturing our first terrain [Video]. YouTubehttps://www.youtube.com/watch?v=d879QNdQG7U

[8] Soil - Gaea Documentation - QuadSpinner. (n.d.). https://docs.quadspinner.com/Reference/Data/Soil.html

[9] Slope - Gaea Documentation - QuadSpinner. (n.d.). https://docs.quadspinner.com/Reference/Data/Slope.html

[10] 雲の観察マスターになる-自由研究スペシャル. (2021, July 29). コカネット. https://www.kodomonokagaku.com/experience/23377/

[11] Dialogue Plugin. (2018, January 5). Dialogue Plugin: Conditions & Events (new version) [Video]. YouTubehttps://www.youtube.com/watch?v=qGFDMaO4FrM

[12] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTubehttps://www.youtube.com/watch?v=rWylZKi8QbM