UE4の勉強記録

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

UE5の勉強 -LandscapeのみのGameを作成する-

1. 今週の予定

以下の内容を勉強する予定です。

<LandscapeのみのGameを作成する>

先週の続きを行います。

Landscape用のMaterialのTilingを消していきます。

Niagaraの勉強>

CGHOW氏のTutorialを勉強します。

<Materialの勉強>

Rock Shader - Advanced Materials - Episode 3 [1]のDetail Textureの作成をやり直します。

その後で時間があったら実装も行います。

<戦闘システムの続きを作成する>

PackagingしてEffectがPackage化した後でも動いているのかどうかを確認します。

Effectの追加の続きを行います。

<Gaeaの勉強>

Andrea Cantelli氏のGaea Tutorial for Beginners #5 | Creating the shape of our first terrain [2]の続きを勉強します。

今週はErosionについてまとめます。

<Houdiniの勉強>

今週も公式のTutorialであるFOUNDATIONS | OVERVIEW [3]の続きを勉強します。

<Volumetric Cloudの勉強>

z方面の雲の形状の決定方法についての解説を書き直します。

PluginであるVolumetricの使用方法について解説します。

DirectXの勉強>

Olympus Mons Tutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [4]のVersion Fileを勉強します。

2.LandscapeのみのGameを作成する

2.1 それぞれのTextureの最適値を検証する

先週はFlow Layer用のMaterialのParameterの最適値を決定する所までやりました。

その続きをやっていきます。

<Sand Layer>

以下に示したThai_Beach_Sand_tdsmeeko

を使用します。

結果です。

以下のParameterを調整します。

まずTilingが見えやすくなるようにMacroVarianceは切りました。

Quixel Bridgeで調べるとこのTextureの元々の大きさは2x2 mでした。

TexSizeNearを1にセットすると1x1mになるはずです。ので0.5にしました。

先週はなぜか2x2mなら0.25だ。と言っていましたが理由が思い出せません。

1だと1x1mなら2x2mなら0.5だと思います。

結果を以下に示します。

FarのTexとの境界がものすごく目立っています。

Blend Range(s)を100から10000に変更します。

次いでにTexSizeFarも0.01にしました。

結果です。

遠くは良い感じになりましたが近くのTilingがひどいです。

Start Offsetの値を変更します。

色々な値をいれて試しましたがあまりおおきな変化は見られませんでした。

Start Offsetの値は-1000のままにしておきます。

Macro Varianceを追加しました。

うーん。まだTilingが目立ちますね。

これ以上Tilingを消すためには、別なTextureを選ぶか2022-07-10のBlogで勉強したBen Cloward先生のHex Grid Normal Tiling [5]を使用するしかありません。

PC1号を久しぶりに起動させて前に作成したHex Gridを探してきました。

これみたいです。

このままでは使いにくいです。

Material Functionにします。

これで試してみます。

Normal TextureがFloatになっていてTexture2Dではないと言っています。

???です。

あ。UE4からUE5に持ってくる時点で何かしらの問題があったのかもしれません。

この方法を試すのは諦めます。

別なTextureを探す事にします。

以下のTextureを新たにDownloadしました。

これを代わりに使用してみます。

Macro Varianceが無い状態です。

Titlingは見えますが、気になる強さではないです。

Macro Varianceを追加します。

Macro Varianceが強すぎます。

これだと岩に見えます。

Reduce Macro Constantの値を0.25~0.5にしてみました。

結果です。

まだ強いです。

0.75にしてみました。

近づくと以下のような細かい砂が表示されます。

凄い。

これを使用します。

<River Layer>

こんな感じです。

石が大きすぎる気がします。

確認します。

TexSize Nearを0.5にします。

結果です。

うーん。取りあえず他のParameterを調整してみます。

以下の様になりました。

Cameraの近くの石が写真を貼ったか用に見えます。

試しにDisplacementのTextureを使用して

以下の実装を試してみました。

結果です。

多少はましに見えます。

<Sea Layer>

こんな感じでした。

海の中だとこんな感じです。

2.2 Materialを作成する

以下の様に全部の実装をそれぞれのLayerに繋げました。

Material Functionを作成して整理した方が良いのは分かりますが、今週はこれで試してみます。

LandscapeのMaterialをこのMaterialに変更しました。

LandscapeのPaint /Paintを見ると

LayerInfoはしっかりとセットされていました。

Landscapeには色がついていません。

うーん。

こういう時はどうしたら良いんでしたっけ?

それだけじゃなくてMaskをImportしてもLandscapeが変わりません。

むー。

これはTextureの数が多すぎとかそういう問題かもしれないですね。

問題の原因が分かりません。これは一辺にやり過ぎました。

以下の様にCliffだけ入れ替えてみました。

結果です。

Cliff Layerに凹凸が見えるようになりました。

出来ていますね。

Grassも追加しました。

結果です。

普通に出来ていますね。

Flowも追加しました。

出来ています。出来ていますが、何か全体的に汚いですね。

何か間違っているんでしょうか?

Sandも追加しました。

こんな感じです。

何か全体的に汚いです。

そして異様な程、テカテカしています。

何で?

SpecularもMaterialも0にしているのに。

兎に角、全部のTextureを繋いでからこの問題は直します。

Riverを追加しました。

Textureが全部消えました。

これはあれです。Textureの数が多すぎると起きるやつです。

直し方を見つけました。

Unreal SenseiのHow to INSTANTLY TEXTURE your landscapes in UE4 - Unreal Engine tutorial [6]の5分辺りで述べています。

Texture Sampleノードの以下に示したSampler Sourceの設定を

Shared:Wrapに変更すれば良いんです。

全部のTextureをShared:Wrapにしました。

直りました。

ただし、以下に示したような変なRenderingの後があります。

前の時はBuild Light Onlyで直ったんですが直りません。

と言うかBuild Light Onlyが効いてない気がします。

最後のSeaも追加しました。

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

思ったより緑が少ないですね。

後、海の色が濃すぎますね。これは直す必要があります。

そう言えば、さっきまであったRenderingの違いはSeaを追加したら消えてしまいました。

これはいろんな意味でダメでしょう。

まず海岸の周りの盛り上がりがオカシイです。

これ塀になっていて外に出れないとかじゃないと変です。

でもそうなるとそもそも海を作成する意味もなくなってしまいます。

後Beachの砂浜が大きすぎます。

まあ、最初のLandscapeとしてはこんなもんでしょう。

2.3 島を探索する

岩が白すぎます。

後、凸凹です。

これは、結局、GaeaでTerrainを作成しても手直しをする必要があるって事です。

となるとあえて100倍に抑える必要もないとも言えます。

400倍にしても平気なら16km^2のLandscapeをFree版でも作成出来るようになります。

何か、Landscapeを見ていたら気持ち悪くなってしまったのでこの辺で終了します。

2.4 来週の予定

以下の事をする予定です。

  • Landscapeの凸凹を直します。
  • 後、Rockのテカリも直します。
  • Macro VarianceとDistance Blendingの実装部分をMaterial Function化
  • Hex Gridの実装が出来る様にする
  • サイズを変えたLandscapeも検討する
  • Nodeの線をWarpさせるNodeがあったはず。それを探す。

その上で、Landscapeをもう一回作成し直すかどうか考えます。

<追記>

Nodeの線をWarpさせるNodeの名前はNamed Rerouteでした。

3.Niagaraの勉強

今週もCGHOW氏のNiagaraを勉強します。

Sprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [7]を勉強する事にしました。

今週は勉強して来週、実装する事にします。

3.1 Sprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [7]を勉強する

まず軽く全部見ます。

見ました。

何とこのButterfly、Spriteで作成されていました。

更に蝶の羽根の向きや羽ばたく角度を調整するために、先週勉強した以下の機能を駆使していました。

先週は、Spriteの向きを地面と平行にするためだけにこの部分の設定を変更しましたが、今回のTutorialでは、蝶の飛ぶ向きと超の羽根の羽ばたく向きの二つを正しく調整する必要があります。

実際、かなり複雑な調整をしていました。

この部分の機能に関しては、全く理解していなくて先週もTutorialがそう言っているからと、何も理解しないでそのまま実装してしまいましたが、今週のTutorialではそうはいかなそうです。

今週はこのTutorialを通じてSpriteの向きをどうやって管理するのかをしっかり勉強する事にします。

このTutorialでは最初、以下に示した矢印のTextureを使用して蝶の飛ぶ向きと超の羽根の羽ばたく向きの二つを調整しています。

このImageはMedi Bangで作成する事にします。

以下にTutorialが使用した蝶のImageを示しますが、

これはNetで仕入れる事にします。

それでは具体的な手順を以下にまとめます。

CGHOW氏はYouTubeの動画を章毎に区切っていませんので、こっちで勝手に章を作成して区切ってしまいます。

<Intro>

特にまとめる内容はないですが、このTutorialが

  • Spriteだけで作成
  • Emitterを一つしか使っていない
  • 4年前にUE4で作成したTutorialをUE5で作り直したTutorialである

事について述べています。

<Materialの作成>

このEffectに使用するためのMaterialの作成方法についての解説です。

NiagaraがAnimationの部分を全部担当してくれるのでMaterialは超Simpleです。

ただしCGHOW氏、途中でMaterialの実装が間違っている事に気が付いてある箇所を直します。

この間違いがMaterialを結構しっかりと理解してないと直し方が理解出来ない部分なので、そこが勉強になります。

その辺をしっかりまとめます。

まず以下の様に組みます。

まあ、単純に矢印を表示するMaterialです。

敢えて述べる部分があると言えばEmissive Colorを選択したため影は付きません。

そんだけです。

ところがこの実装、以下に示した様に真っ白の結果しか表示しません。

うーん。

何で?

Lerpノードの機能を勘違いしていたのかな?と

少ししっかり考えてみますが、Alphaに入ってきた値を0~1に分布しているだけです。

Rの値を取っていますので、赤い部分が1 それ以外が0だから、黒字に白の矢印が表示されるんじゃないの?

と思います。

はい。

ここが間違っています。このImage、白字に赤なんです。

だからRのImageを見ると以下の様に真っ白になっています。つまり全部1です。

その代りGBのImageは以下の様に

矢印の部分だけ黒くなっています。

はい。

単純ですが、CGHOW氏でも混乱していましたし、最初見た時は私もこのImageは特殊な方法で作成したのかな。とか思っていました。

結局CGHOW氏は以下のような方法で問題を回避していました。

私は最初から黒字に白の矢印を作成する事にします。

矢印を上向きにするために以下の実装を追加します。

なんで-0.5じゃなくて0.5をRotation CenterにSetするのかとか、Rotation Angleの0.25が何で90度と同じなのかとかは、散々Materialの勉強でやったのでここでは繰り返しません。

<矢印のMaterialを使用したNiagaraの作成>

<<Niagara Systemの準備>>

いつも通りにFountainを追加したNiagara Systemを作成します。

要らないModuleを消しています。

Particle Spawn SectionのShape Location Module、Add Velocity Moduleを消しました。

Particle Update SectionのGravity Force Module、Drag Module、そしてScale Color Moduleも消しました。

更にEmitter Update Sectionの

Spawn Rate Moduleを消してSpawn Burst Instantaneous Moduleを追加しました。

TutorialによるとしばらくはParticle一個だけ必要だからこれで良いそうです。

<<矢印のMaterialをSpriteに使用する>>

まずSpriteのSizeを以下の方法で大きくします。

Particle Spawn SectionのInitialize Particle Moduleの

Mass Modeを

Unsetにセットし、更にSprite Size ModeをUniformにセットして

Uniform Sprite Sizeを100にします。

ここでMass Modeの設定を敢えて変える理由が分かりませんね。SpriteのSizeを変更するだけだったら要らないと思います。

そして矢印のMaterialを以下の方法でSpriteにセットします。

Render SectionにあるSprite Renderer Moduleの

Materialに先程作成したMaterialである

M_Butterflyをセットします。

これで終わりかと思ったら、

Particle Spawn SectionのInitialize Particle ModuleのSprite Rotation Modeの値を

Unsetにセットしました。

これは何が目的なのか分かりません。

Color ModeのColorに

赤をセットします。

これで矢印の色が

赤くなりました。

<<矢印を2つに増やす>>

この矢印のImageは後でButterflyの片方の羽根に代わります。

ので矢印のImageを2枚にする必要があります。

以下の方法で実装します。

Render SectionのSprite Renderer ModuleをDuplicateします。

何だ。

今回のTutorialはEmitter一個で2つの別な種類のSpriteを操ります。と言っていたので、内心一体どうやっているんだろう?と思ったんですが、単にSprite Renderer Moduleを追加しただけでした。

2番目のSprite Renderer ModuleのDefault Pivot in U...の値を

変更する事で以下に示した様に

2枚のSpriteのImageが表示されるようになりました。

<<2つ目の矢印をGreenにする>>

2つ目の矢印がどっちなのかを区別しやすいようにするために色をGreenに変更します。

まずSpriteの色は以下に示した

Sprite Renderer ModuleのColor Binding

にセットされている変数の値で決まっています。

なので別な色を保持する新しいParameterを作成してここにセットすれば色を変える事が出来ます。

まず新しいParameterを作成するためにParticle Spawn SectionにSet Parameter Moduleを追加します。

Set ParameterのAttributeを見ると以下の様になっています。

+のIconを押して新しいParameterを作成します。

+のIconを押すと以下のBoxが表示されるので

新しく作成するParameterのタイプを選択します。

今回は色の情報を保持するTypeのParameterを作成したいのでLinear Colorを追加します。

すると以下のようなParameterが作成されます。

New Linear Parameterという名前のParameterが出来ました。

この名前はいつでも変更出来るそうです。

このParameterのName Spaceは[PARTICLE]になっていますが、これも後で変更出来るんでしょうか?

New Linear Parameterの色を

緑に変更しました。

Render SectionにあるSprite Renderer Moduleの内の一個を選択して

Color Bindingの設定を

[PARTICLE] New Linear Colorに変更します。

結果です。

片方の矢印が緑色になりました。

<<緑の矢印のSpriteのFacingを変更する>>

Spriteは板の上に絵を貼っているだけです。そしてその板は常にCameraを向いています。

その板の向きを変更します。

まずRender Sectionの緑の矢印を作成しているSprite Renderer Moduleの

AlignmentとFacing Modeを

Custom AlignmentとCustom Facing Vectorに変更します。

そしてParticle Spawn SectionのSet Particle Moduleに

新しいParameterを生成します。

今度のParameterのTypeは[PARTICLES] Sprite Facingです。

Sprite Facingが追加されると

以下に示した様に

矢印の向きが変わります。

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

X軸に対してSpriteの正面を向けています。

先程作成したParameterでX=1と指定したので

その通りの結果になっています。

<<赤の矢印のSpriteのFacingを変更する>>

今度は赤い色の矢印のSpriteの色を変更します。

Particle Spawn SectionのSet Parameters Moduleに

VectorタイプのParameterを作成します。

名前をFacing2にしてX=1にします。

またRender Sectionの赤い矢印を作成しているSprite Renderer Moduleを選択して

Sprite Facing Bindingに

先程作成した[PARTICLE] facing2をセットします。

結果です。

赤い矢印は全く動いていません。

Sprite Renderer Moduleの以下の設定を変更するのを忘れていました。

結果です。

赤の矢印のX軸にFacingするようになりました。

<<矢印のSpriteがFlapping(蝶が羽ばたくようにパタパタする事)するようにする>>

Particle Update SectionにSet Parameters Moduleを追加します。

今度はParticle Update Sectionです。

まあ今度は蝶がパタパタ羽ばたく状態を作成する訳ですから、Particle Update SectionでParameterの値を弄る訳です。

ここで先程作成した[PARTICLE] Sprite Facingをセットします。

そして以下の様に設定を変更します。

すると以下の様に回転しました。

蝶の羽根がパタパタするような角度ではないですね。

Tutorialではここからこの問題を直し始めます。

Tutorialでは本当に色々やって最初から作り直したりしていました。

その結果直ったんですが、その原因が何だったのか見ている方はよく分からないで終わってしまいました。

恐らくですが、以下に示したSprite Renderer ModuleのAlignmentの値を

Velocity Alignedに変更したら直りました。

これは実装する時に試すしかないですね。

そしてParticle Update SectionのSet Parameters ModuleのSprite FacingのYawの値を

Sineに変更して更に値を変更します。

これ順当に推測するとPeriodで羽ばたく時間を設定し、Scaleで羽ばたく大きさを設定しています。

この辺も実装する時に確認します。

すると矢印のSpriteがパタパタと動くようになりました。

Screenshotでは分かりませんがパタパタ動いています。

Tutorialでは新しく作り直しているので、この後、緑の矢印のSpriteを作成しています。

結果です。

蝶が羽ばたく時の様に左右のSpriteの上下が同じTimingで起きているのではなく、左のSpriteが上がるときは右のSpriteが下がっています。

これを直すのにTutorialはまたグダグダやっています。

<<Spriteの羽ばたきを蝶のようにする>>

うまくまとめられるか分かりませんが、頑張ってみます。

Particle Spawn SectionにSet Parametersを追加します。

あれ、これまだ追加してなかったの?

後、Sprite Facing and Alignment Moduleが追加されています。

うーん。

何か見逃したか。

まあ良いです。実装する時考えましょう。

このSet ParametersでVectorタイプのParameterを作成します。

名前はTestになっています。

Particle Update SectionのSet Parameterに

先程作成したParameterであるTestを追加します。

更にそのTestの設定をFacing2と同じにします。

これYawにSineをセットしないとFacing2と同じにならないんですがTutorialではそこに気が付かないでどんどん先に進んでいます。

途中で気が付いて直しました。

しかし結果は変わりません。

この後TutorialではSineをCosineに変更したりしていますが直りません。

そしてRender SectionのSprite Renderer Moduleの

Sprite Facing Bindingを見て先程作成した[PARTILCE] Test1をここにセットしていなかった事に気が付きます。

直しました。

その後、Particle Update SectionのSet ParameterのTestの設定を以下の様に調整して

蝶が羽ばたくようになりました。

<<Offsetの調整>>

矢印のSpriteが蝶々が羽ばたくようにパタパタと動くようになりましたが、回転の中心が少しだけずれています。

これを直すそうです。

Particle Update SectionのSet Parameterを一端切ります。

すると以下の様になります。

この時点でこの2つは真っすぐ並んでないといけません。

しかし横から見ると少しだけずれています。

これを調整します。

Particle Spawn Sectionにある Set Particle Moduleの

値を少しだけ調整します。

Tutorialではこれで真っすぐになったと言っているんですが、私にはこの調整の結果が一寸曲がって見えます。

更に赤い矢印の設定も変更します。

Particle Spawn SectionにあるSprite Facing and Alignment Moduleの

Sprite Facingの値も変更します。

ああ、成程、これなら理解出来ます。

両方のPivotの位置を調整したんです。

結果です。

一直線になりました。

Particle Update SectionのSet ParameterをEnableに戻します。

きれいに羽ばたくようになりました。

このScreenshotでは見えませんが綺麗に羽ばたいています。

<<この矢印のEffectが飛び回るようにする>>

Particle Update SectionにCurl Noise Force Moduleを追加します。

これ追加しただけでSpriteは飛び回るじゃん。

Curl Noise Force Moduleの設定を以下のように変更しました。

結果です。

何と蝶々の羽根が捻じれてしまいました。

Particle Update SectionのSet Particle Moduleの

Sprite FacingとTestの値を以下の様に

変更します。

歪みなく矢印が飛び回っています。

<<沢山の矢印のEffectを生成する>>

今度は今まで一個だったEffectを沢山生成します。

これは簡単で今まで何回もやったやり方と同じです。

まずEmitter Update SectionのSpawn Burst Instantaneous Moduleを消してSpawn Rate Moduleを追加します。

次にParticle Spawn SectionにShape Location Moduleを追加します。

Shape Location Moduleの設定は以下の様になっていました。

Tutorialではこの部分が速すぎて、どこかのParameterを変更したのか分かりません。

まあ大体合ってたら、この辺は普通に動くのであんまり気にしなくてもいいと思います。

更にSpawn Rateの値を変更します。

結果です。

<<矢印のSpriteのSizeを調整する>>

Particle Spawn SectionのInitialize Particle Moduleの

Sprite Size ModeをRandom UniformにセットしてMinとMaxの値を以下の様に変更しました。

結果です。

うーん。綺麗になりました。

でも蝶々の大きさって一定でこの設定だと最大4倍の大きさの違う蝶々が存在する事になります。これってどうなんでしょう。

<<蝶の画像に変える>>

まずMaterialから作成します。

Main NodeのBlend ModeをMaskedに変更し

蝶のImageを以下の様に繋げます。

今度は蝶の羽根は半分だけ必要なので

Texture Sampleの設定をShard: Clampに変更して

以下の実装を足します。

結果です。

このMaterialを両方のSpriteに使用すると

こうなります。

羽根が一方しかないです。

この後TutorialではNiagaraの値を調整して両方の羽根を表示するようにするんですが、これってMaterialを2つ作成して羽根の向きを変えた方が簡単だと思います。

一応、以下にTutorialのやり方をまとめておきます。

Emitter Update SectionのSpawn RateをDisableしてSpawn Burst Instantaneous ModuleをEnableします。

当然、Shape Location ModuleはDisableします。

するとEffect一個だけ表示されるようになります。

結果です。

まあ、こうなってるはずです。

これをNiagaraから直します。

Sprite Renderer ModuleのUV Scale Binding

を変更します。

うーん。

このやり方は私は好きではないですけど勉強にはなりますね。

UV Scaleなんてどんな機能なのか全く知りません。

Particle Update Sectionに新しいVector 2DタイプのParameterを追加します。

Particle Update Sectionに追加するのか!Particle Spawn Sectionの方が断然良い気がしますが。

まあ様子を見ましょう。

このParameterの名前をMy UV Scaleに変更しました。

更に値を以下の様にします。

そしてSprite Renderer ModuleのUV Scale Bindingに戻ります。

結果です。

DisableしたModuleをEnableします。

結果です。

<<微調整>>

Clampの問題があると言っていますが、私には分かりません。

MaterialのTexture SampleノードのSample Sourceの設定をShared : Wrapに変更しました。

結果です。

余計な羽根が付いてきました。

以下の実装でそれを消します。

Stepノードってあの公式のSiteが見つからないやつでしょう。私のBlogの2021-11-14にその機能がまとめてあります。

読み直したらStepノードは以下のような機能でした。

簡単に言うと

  • X>Y->1
  • X<Y->0

となります。

はい。

最初の半分は白、残りの半分は黒くなる訳です。

後は簡単です。

この値を蝶の羽のTextureに掛けると後ろ半分は0を掛けた事になるので消える訳です。

結果です。

<<蝶の羽ばたく時間を調整する>>

Particle Spawn SectionのSet Parameter Moduleに

Float型の新しいParameterを追加します。

名前はSpeedとしました。

次にParticle Update SectionのSet Parameter Moduleの

Sprite Facingの

Periodにこの値をセットします。

これだと片方の羽根だけ羽ばたく速度が変わってしますのでTestの方も同じようにします。

そしてまたParticle Spawn SectionのSet Parameter Moduleに戻って

Speedの設定を以下の様に変更します。

うーん。

納得。

これだとそれぞれの蝶によって羽ばたく速度は変化しますが、同じ蝶はいつも同じ速度で羽ばたく事になります。

結果です。

3.2 Sprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [7]を勉強した感想

Tutorialを全部書き出して整理しましたが、途中のSpriteの回転の部分に不明な部分があります。何をやっているのか分かりません。

この部分を解明しないと実装するのは難しそうです。

このTutorial1400回しか再生されていません。いいね!も64個でした。

この中にきちんと実装出来た人いるんでしょうか?

まだ誰も再現出来ていない気がします。

もし来週、綺麗に実装出来たら私が世界で初めて実装出来た事になるんじゃないでしょうか?

4.Materialの勉強

4.1 Rock Shader - Advanced Materials - Episode 3 [1]のTextureを作成し直します

Rock Shader - Advanced Materials - Episode 3 [1]のDetail Textureの作成をやり直します。

まずTextureの内容を整理します。

<Base Color>

Base ColorのAlpha ChannelにはRoughnessのDataが入っています。

先々週作成したColorのAlphaには、以下のImageを入れていたのですが、

RoughnessのDataはColorのDataと同じくRockの形状に左右されないImageである必要がありました。

これを直す必要があります。

2023-01-30のBlogを見ると

T_Rock_Basalt_DをDuplicateしたT_Rock_Basalt_D_meをColorとして使用しているようです。

このT_Rock_BasaltのRoughnessのDataを使用する事にしましょう。

<Normal Map + Ambient Occlusion>

これはそのままです。先々週のままで問題ないはずです。

<Macro DetailとMicro Detail>

Blue ChannelにRoughnessを追加し、Alpha ChannelにColorに掛けるGray Scaleを追加する必要があります。

2023-01-30のBlogを見ると

Macro Detail用にT_Cracked_Nordic_Coastal_Rocks_uknhaapmw_1K_N、

Micro Detail用にT_Lichen_Covered_Rock_ujlkbfclw_1K_Nを使用しています。

前回はこのNormal Mapだけを使用しましたが今回は

Blue ChannelにRoughnessを移し、Alpha ChannelにColorのGray Scaleをセットします。

もう一回Rock用のTextureを作成します。

<Base Color>

T_Rock_Basalt_DにはRoughnessのDataが無い事が分かりました。

T_Rock_Basalt_DをGray Scaleに変換してRoughnessのImageにしてしまいましょう。

出来ました。

UE5にImportしたImageを下に示します。

RGBのImageです。

AlphaのImageです。

ほぼ同じです。

Grayscaleに変換した後、特別に色を濃くしたり薄くしたりはしていません。

後、今回はColorの色を薄くする事はしていません。

Normal Map + Ambient Occlusion

これは先々週に作成したTextureをそのまま使用します。

<Macro Detail>

T_Cracked_Nordic_Coastal_Rocks_uknhaapmw_1Kを使用して

Blue ChannelにRoughnessを追加し、Alpha ChannelにColorに掛けるGray Scaleを追加します。

しました。

UE5にImportしたImageを示します。

RGのImageです。

これがNormal Mapになります。

BのImageです。

これがRoughnessになります。

AlphaのImageです。

これでColorの色に変化を追加します。

<Micro Detail>

Micro Detailも同様に行います。

T_Lichen_Covered_Rock_ujlkbfclw_1Kを使用します。

出来ました。

GIMPはもう飽きました。最低限の使用方法だけ覚えておきます。

UE5にImportしたImageを表示します。

RGBです。

RGのImageです。

Normal Mapに使用します。

BのImageです。

Roughnessに使用します。

AlphaのImageです。

Colorの色に変化を追加するために使用します。

今度こそ、Rock用のRock Shader - Advanced Materials - Episode 3 [1]のTextureが完成したはずです。

4.2 Rock Shader - Advanced Materials - Episode 3 [1]をもう一回実装します

今度こそRock Shader - Advanced Materials - Episode 3 [1]を実装します。

もうBen Cloward先生のAdvanced Material seriesは14回まで行っています。

これを追いつくのは至難の業になってしまいました。

出来る所からコツコツやっていくしかありません。

Textureの確認から行っていきます。

Diffuse用のTextureです。

Compression Settingsです。

通常のTextureに使用されるDXT1/5になっています。

SRGBです。

Color用のTextureなのでsRGBがEnableになっています。

Normal Map+Roughness用のTextureです。

Compression SettingはBC7に変更しました。

Tutorialの設定がそうなっているからです。

元はColor用のTextureと同じDXT1/5になっていました。正直DXT1/5の方が良い気がしますが、この2つがどう違うのか分かりません。

そしてsRGBはDisableしています。

これはNormal MapとRoughnessに使用されるのでsRGBは要りません。

最後にFlip Green ChannelをEnableにしました。

これはTutorialの設定とは違いますが、元々のNormal MapのGの値がInvertしたままなのでEnableする必要があります。

Macro Detail用のTextureです。

これもCompression SettingはBC7に変更しました。

Tutorialと足並みを揃えるためです。

sRGBはDisable

Flip Green ChannelをEnableにしています。

Mico Detail用のTextureはMacro Detailと全く同じ設定にしました。

それではMaterialを作成します。

先週作成したMaterialがありますが、最初から作った方が速く完成できそうなので最初からやります。

TextureをImportしました。

Color Textureを以下の様に実装しました。

Rockのサイズが変化してもTextureのサイズはそのままになる実装です。

Normal Mapも以下の様に実装しました。

こっちはRockのサイズが大きくなったらTextureのサイズが小さくなります。

Tutorialではここで一端確認しています。

ので私も結果を見てみます。

信じられない位白いです。

仕方ないのでPowerを追加してContrastを2倍にしました。

元々のSM_Rockと比較しました。

Detailが全然違います。ただこれは後の実装を追加したら変わる可能性もあります。

今の段階では近づくとぼやっとしています。

サイズの違うRockを結合してみました。

全く違和感なく結合出来ました。

TextureのサイズはRockのサイズに関わらず同じ大きさを保っているようです。

SM_Rockを3倍にして元のSM_Rockと結合してみました。

Textureのサイズの違いがはっきり見て取れます。

色々な確認が出来たのでDetailを追加する事にします。

Macro Detailの実装です。

Rockのサイズを10倍にしてNormalを見てみます。

確かにDetailがあります。

でも正直言ってこれがMacro Detailのおかげなのか分かりません。

色々弄って分かりました。

以下に示した岩全体に横線が入っているように見えます。

これがMacro DetailのNormalでした。

RoughnessとColorの値も追加しました。

Roughnessの値をOne Minusして追加するのはよく分からないです。そのまま追加すべきだと思います。

Colorに関しては元々どんなImageが入っているのかすら不明なのでBlend Overlayノードの結果がどうなるのか全く予測もつきません。

RoughnessのImageです。

小さな草のImageが見えます。

これからMacro DetailのRoughnessが追加されているのが分かります。

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

同じ実装をMicro Detailにします。

結果です。

その前にUVをつなぐのを忘れていました。

結果です。

岩に凄い近づいてみました。

確かに表面がぼやける事なく細かい模様が見えます。

でも前の状態をあんまり覚えていないので本当にMicro Detailが効いているのか不明です。

以下の様に10倍のサイズにしてSM_Rockと比較してみました。

ものすごく接近してみました。

右側のSM_RockはTextureの映像がぼやけていますが、左側のTextureは細部まではっきりと見る事が出来ます。

Micro Detailが効いている事が確認出来ました。

最後に微調整して以下のようになりました。

左が今、作成しているMaterialを使用したRockで、右はSM_Rockです。

一見するとSM_Rockの方が良い感じがします。

Detail用のTextureは距離によって使い分けた方が良い気がします。

この遠距離でもMicro DetailのTextureが効いているため岩が灰色に見えます。

Distance Blendingノードが使用出来ないか検討すべきだと思いました。

Tutorialでは以下に示した様に10倍の大きさの違いがあっても岩を結合した時の違和感は全くないですが、

私のは以下に示した様につなぎ目から

2つの岩を合成した事が一発でばれてしまいます。

岩全体を黒くしてみました。

これでもつなぎ目は見えますが、前よりはましになりました。

以下にSM_Rockで同様の事をした結果を示します。

こっちはTextureのサイズが全く違っているのと10倍にした時にTextureがピンボケしている事から次元の違うつなぎ目のずれが存在していました。

それなりには成果が出ている事が確認出来ました。

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

5.戦闘システムの続きを作成する

今週もEffectの追加をやっていきます。

5.1 電撃攻撃系のEffectを探す

氷攻撃、炎攻撃と来たら今度は雷攻撃です。

このEffectを探してみます。

ありました。

NS_Mage_LIghtning_Boltです。

こんなEffectです。

しかもこのEffect、Spawn Burst Instantaneous Moduleを使用しています。

早速試してみます。

Preview画面です。

雷が落ちる位置を以下の場所に調整しました。

実際のPlay画面です。

上手くScreenshotを取る事が出来ませんが雷撃が当たってかなり良い感じのEffectです。

決めました。

  • グーー>氷攻撃
  • チョキー>雷撃攻撃
  • パーー>炎攻撃

の3つのEffectを使用する事にします。

出来ました。

Testします。

普通に動いています。

Screenshotを取るTimingが難しいのでScreenshotは無しにします。

Fireballだけが攻撃距離が長すぎて相手を貫いて更に奥にいる魔術師まで攻撃しているように見えます。

この辺は後で調整する事にします。

5.2 Packagingを試す

Packagingするのに20分以上かかりました。UEのVersionを5.1.1にUpdateしたからでしょうか?

Packagingは普通に出来ました。

サイズ的には前回のPackagingとそんなに変わらないですね。

Playしてみます。

Effectを使用している時のScreenshotは取れませんでしたが、普通に発動していました。

問題なしです。

5.3 亡霊族の攻撃にEffectを追加する

以下のNS_Thorn_2が良い感じです。

こんなEffectです。

亡霊族のAnimationに追加してみます。

Level BPのAttack Animation()関数を見ると以下の3つのMonsterがいます。

最初の亡霊呪術師に使用しているAnimationは以下のAnim_Spellです。

これをDuplicateしてAnim_Spell_Iceと名付けました。

それでは以下のTimelineにAnim_Spellを追加します。

やり方を忘れてしまいました。

先週のBlogを見て復習します。

出来ました。

こんな感じです。

たまたまタイミングがあって非常に綺麗なScreenshotが取れました。

次の亡霊族のMonsterである亡霊剣士のAnimationにもこのEffectを追加してみます。

調べると亡霊剣士は以下のAnimationを使用している事が分かりました。

Duplicateして名前をAnim_Attack_Iceにしました。

これに先程のIceの攻撃を追加しました。

Previewの結果です。

まあいい感じです。

最後の亡霊族のMonsterである亡霊魔人のAnimationにもこのEffectを追加します。

調べると以下のAnimationを使用している事が分かりました。

Duplicateします。名前をAnim_Attack_Right_Iceにしました。

開くと何故か手だけのAnimationになっていました。

うーん。

良くは無いですが直し方が分からない。

これにNiagaraのIceのAnimationを追加します。

PreviewのScreenshotです。

これらのAnimationをLevel BPのAttack Animation()関数の亡霊族の攻撃Animationを設定するNodeにセットしました。

実際にPlayして確認します。

W_OpponentSummonDecide Widget

Stage 1に登場するMonsterの設定を変えて

亡霊族が登場するようにしました。

これでTestします。

うまい具合に三体別々のMonsterが登場しました。

Screenshotはこれ一個しか上手く取れませんでしたが、三体とも綺麗なEffectが発動していました。

ただしIceの位置がもう少し手前の方が良いかもしれません。

直します。

亡霊族の攻撃Animationである

  • Anim_Spell_Ice、
  • Anim_Attack_Right_Ice
  • Anim_Attack_Ice

Niagara のLocation Offsetの設定を以下の様に変更しました。

結果です。

IceがMonsterの丁度真ん中で発動しています。

5.4 亡霊族用の他のEffectを探す

亡霊族の使用する魔法がIceだけなのは寂しすぎます。ほかのEffectを探す事にします。

一個目は以下の

NS_AOE_Meteor_1です。

大迫力で隕石が落ちてきます。

試しに亡霊族のMonsterの攻撃Animationに使用してみました。

大迫力です。

次の候補です。

NS_ky_crossです。

Preview画面です。

亡霊族のMonsterの攻撃Animationに使用してみました。

Play画面です。

かなりの大迫力です。

5.5 3つのEffectを亡霊族のMonsterのAnimationに付ける

それでは以下の3つのEffectを

亡霊族のMonsterにセットします。

妖精族の時と同じで

  • グーー>氷攻撃
  • チョキー>雷撃攻撃(光攻撃)
  • パーー>炎攻撃

にします。

出来ました。

亡霊呪術師が氷攻撃をしています。

亡霊魔人が隕石(火)魔法の攻撃をしています。

これはピッタリのタイミングではScreenshotは取れませんでした。

隕石が落ちて来るのが少し遅い気がします。

亡霊剣士が光魔法を使用しています。

剣を持っていないのに亡霊剣士との名前は変ですね。

しかしふさわしい名前は思いつかないので、後で直す事にします。

隕石(火)の位置とTimingを直しました。

かなり迫力ある攻撃になりました。

取りあえずはこれで完成とします。

5.6 ゾンビ族の攻撃にEffectを追加する

今週は亡霊族のEffectを追加するのが目的でしたが、これが簡単に終わったので次のゾンビ族の攻撃Effectを追加する事にしました。

ゾンビ族はHPは高いですが、魔法は苦手です。

なので攻撃Effectも弱めにします。

ゾンビ戦士用のEffectです。

NS_ky_burstを使用します。

一応、氷属性の攻撃になるので青い光を選びました。

攻撃用のAnimation SequenceをDuplicateして以下にしめしたSkeleton_Grunt_Slam_Iceを作成しました。

ここにNiagaraのEffectに追加しました。

Previewです。

よさげな感じです。

マイルドな魔法が発動している感じです。

次はゾンビ弓士の攻撃Effectを追加します。

色々探したんですがこれくらいしか合うのがありませんでした。

NS_ArrowAttackです。

こんなImageです。

Skeleton_Crossbowman_AttackをDuplicateしてSkeleton_Crossbowman_Attack_Iceを作成しました。

ここにNS_ArrowAttackを追加しました。

こんな感じになりました。

実際のPlay画面です。

これ自体はいい感じなんですが、この矢なかなか消えません。

以下に示した様に

魔法の矢が隣のMonsterが攻撃を開始しても残っています。

一寸だけNiagaraを改造してみます。

まずNS_ArrowAttackをDuplicateしてNS_ArrowAttack_Meを作成しました。

付属のAssetの実装を改良する時は絶対にDuplicateしてそのDuplicateしたAssetを改造する。

絶対守らないといけない鉄則です。

中を見ると2つのEmitterで構成されています。

NE_Basic_Mesh Emitterの

Particle Spawn SectionにあるInitialize Particle Moduleの

Lifetimeを2秒にしました。

結果です。

2秒たったら矢が消えました。

が屋の後ろの羽根の部分が消えません。

もう一方のEmitterであるNE_SimpleBurstの

Emitter Update SectionでSpawn Rate Moduleが使用されていました。

これはSpawn Rate Moduleの代わりにSpawn Burst Instantaneous Moduleを使用すれば良いのでは?と思ったら、何と使用していないSpawn Burst Instantaneous Module既にありました。

Spawn Burst Instantaneous Moduleを使用すると

矢の羽根の部分も消えるようになりました。

このNiagaraを代わりに使用してみます。

Skeleton_Crossbowman_Attack_Iceの

Niagara Particle Systemの

Niagara Systemに

今作成したNS_ArrowAttack_Meをセットします。

テストします。

矢が消えるようになりました。

もう少し早く消えても良いかもしれませんが、とりあえずはこれでOKとします。

最後にゾンビ戦士の攻撃に追加するEffectを考えます。

NS_AOE_Attack_1を使用する事にしました。

こんな感じです。

ゾンビ剣士の攻撃用のAnimationであるSkeleton_Swordman_Default_AttackをDuplicateしたSkeleton_Swordman_Default_Attack_Iceを使用します。

Niagaraを追加しました。

以下の様になりました。

Play画面です。

あんまり目立たないEffectですが、それがゾンビ族の魔法が下手な感じが出ています。

最後に確認のためにゾンビ族と何回か戦闘をしてみました。

良い感じにEffectが発動しています。

ただし最後のゾンビ剣士のEffectはマイルド過ぎるかもしれません。

これは後で考える事にします。

試しに自分でPlayしてみました。

Stage 9まで行けたので凄い興奮してずっと戦っていました。そして負けました。

Effectに気が回るどころじゃなかったです。

まあ、でもBugみたいな気になる部分は無かったです。

自分で言うのもあれですが、このGameはそれなりには面白い気がします。

完成したら売れそうな気がします。

6.Gaeaの勉強

6.1 先週の勉強のまとめ

先週はどんなTerrainの作成に対しても共通する理想的なNodeのつなぎ方を発見しました。

以下にその理想的なNodeのつなぎ方を示します。

ここで大切なのは、それぞれのStepで使用出来るNodeは限られている事です。

例えば、最初に配置出来るNodeはGeo Primitiveにある4つのNodeのどれかです。

Terrainの表面を仕上げるために使用出来るNodeはLookDevにある一部のNodeだけです。

これを発見した事でどのNodeをどこで使用すべきかの指針を立てる事が出来る様になりました。

最終的にはこれらは以下に示した今までの大きな手順のStep 1に統合される予定です。

更に先週はLookDevにあるすべてのNodeを検証して

  • 役立たず
  • 溝を追加
  • 大きくTerrainの形状を変化させるがTerrainの表面を仕上げる目的には合致している。更にNodeの名称と機能が一致している
  • Terrainの形状はほとんど変化させない。しかし細部ははっきりと変化させる
  • Terrainの形状はほとんど変化させない。細部の変化も微妙でよく分からない
  • どのNodeを使用したら良いのか不明な時に使用

の6つのGroupに分類しました。

6.2 今週の勉強

今週は何をしますか。

Andrea Cantelli氏のGaea Tutorial for Beginners #5 | Creating the shape of our first terrain [2]の続きを勉強しますか。

このTutorialを見るとErosionの前まで勉強しています。

そうだ。思い出しました。先週もErosionの調整方法はまだ分からない。と述べていました。

今週はここで

  • Erosionの追加方法
  • Erosion GroupのNodeについて調査

の2つをする事にします。

6.3 Gaea Tutorial for Beginners #5 | Creating the shape of our first terrain [2]の続きを勉強

まず軽く全部見ます。

見ました。

何と、Erosionノードを使用していますが、全然Erosionと関係ない事しています。

簡単に言うと、Terrainの形状が退屈だからとTerrain全体の形状を大きく変化させるNodeを繋いでTerrain自体の形状を変形させてしまいました。

これは私の手順表で言うと以下に示した

2の部分にあたる作業です。

でその後で、Erosionで表面を調整するのかと思ったらあんまりしないで終わってしまいました。

しかし参考になる情報もかなり紹介されています。

例えば以下の部分の設定が

実は以下に示したNodeのAdjustments Groupと同じ機能だったとかです。

これは後で検討します。

この部分さえ理解出来ればGaeaはほとんど理解したも同然になります。

一応、Erosionで何をやっているのかを以下にまとめます。

Erosionの前までは以下の様な実装になっています。

これにSurfaceノードを追加します。

Surfaceは厳密に言ったらErosionではありません。

単にTerrainの表面をRealに仕上げただけです。

SurfaceのParameterについて解説しています。

この辺のParameterに関してはまた後でまとめる事にするので今回はPassしておきます。

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

以下にViewのScreenshotを示しますが

Erosion(堆積)が確認出来ます。

分かりやすくするために即興で以下のTerrainを作成しました。

こんな感じになっています。

ここにErosionを追加します。

地形の表面が崩れてその崩れた土が下の方に積もっているのが分かります。

これがErosionです。

TutorialではここからErosionについての細かい解説が始まるかと思ったら、Terrainの形状が退屈だからと

Swirlノードを2個つなげて以下に示した様に

Terrainの形状を全く変えてしまいました。

これは私のTerrain作成手順の

2の部分に当たる作業と似ています。が敢えてここでやる必要はないと思います。そして肝心のErosionについての講義が無くなってしまったのも残念です。

しかしここでSwirlノードを選択して

SwirlノードのParameterの一番下にある以下の部分の機能が

実はAdjustments GroupのNodeと同じである事を説明しています。

凄い。

凄いですが、Andrea Cantelli氏が間違っている可能性もあります。一応確認しておきます。

ErosionノードのAutoLevelをEnableします。

以下のTerrainが

以下の様に変化しました。

ErosionノードのAuto LevelをDisableして

今度はAdjustment GroupにあるAutoLevelノードを追加します。

結果です。

全く同じ結果になっていますね。

確認取れました。

ただ全部のNodeがある訳ではなさそうです。LogとかEqに対応するNodeは見つかりませんでした。

もしかするとどれかのNode内にある機能が対応しているのかもしれませんが、分かりません。

大分、Gaeaの機能について理解して来ました。

TutorialはもうErosionの作成はすっかり忘れてTerrainの形状を破壊する事に集中しています。

次にWarpノードを追加しています。

ここからErosionノードのParameterの解説になります。

今回はNodeのParameterの勉強は主ではないですが、ここは重要なので一応以下にまとめておきます。

全部のParameterが大切ですが、特に以下のParameterが大切と言っています。

一応、私のVersionでも同じParameterがある事を確認しました。

次に大切なのが以下のScaleとFlowだそうです。

ただ具体的にどう重要なのかは解説していません。

次のDowncuttingは

Erosionを構成するための川の流れとその川の堆積物の設定を決定するそうです。

うーん。

重要じゃないこっちのParameterの機能の解説はするのね。

この後、Tutorialでは最初に一番大切だと言った以下の3つのParameterの機能について解説しています。

が、何を言っているのか全く聞き取れません。

Captionも聞き取れてないのかへんな単語が所々に入っています。しかしCaptionを見たら何が言いたいのかはある程度理解出来ました。

まずDurationですが、Terrainがどれだけ古いかを指定しているみたいです。

つまり古ければ古いほどErosionが起きている時間(Duration)が長くなる訳です。

次のRock Softnessですが、これは文字通り岩の固さで、岩が固ければErosionは起きにくいとかそういう事を指定しているそうです。

最後のStrengthですが、これも文字通りの意味でErosionの強さを指定しているそうです。

この辺はTutorialで聞くより実際に自分でParameterを弄って確認した方が良い気がします。

TutorialではこれらのParameterを安易にIncreaseするとその計算に凄い時間を取られると述べています。

後は特に重要な事はしていません。

6.4 Erosion GroupにあるNodeについて

Tutorialではこれ以上Erosionについての解説をしてないので自分で調べる事にします。

Erosion Groupには以下の15個のNodeがあります。

これらの機能の違いや効果などを簡単に把握しておきます。

<Alluvium>

まずAlluviumの一般的な意味ですが、Google検索では以下の様に出て来ました。

要は、川によって運ばれた堆積物と言う事です。

もう少し詳しい解説を読むと、だた川で運ばれた堆積物と言うだけじゃなくて、その間に粉々になっている必要があるそうです。つまり石はダメで砂はOKだそうです。

Gaeaには以下の解説がありました。

使用してみます。

これが

こうなりました。

別に川の底から堆積物が溜まった感じはしませんね。

Erosionノードを使用した場合です。

うーん。

確かに堆積物の積もり方は全然違います。

これは使い分けはかなり難しいですね。

<Breaker>

これはどんな意味か解説を最初に見てしまいましょう。

ふーん。

こっちは水の流れで削られた方を再現しているんですね。

確かに大きな亀裂が追加されました。

<Buildup>

解説です。

亀裂を隠すって事ですかね。

もっと亀裂から流される代謝物が逆に流されないでそこにずっととどまって膨らんでいると言う意味かもしれませんね。

実際の結果を見てみましょう。

ほとんど変化していません。

このNodeは要らないですね。

<Convector>

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

Thermal ErosionがどんなErosionなのか気になります。

要するに氷によって作成されたErosionという事ですね。

Convectorというから何か熱い方の意味かと思っていました。冷たい氷の影響で形成されるErosionの一種でした。

これが

Convectorを使用すると以下の様になりました。

TerraceとSlopを作成すると言いますがそんなにはっきりと見えるほど段々になってはいませんね。

<Thermal>

順番は違いますがThermal Erosionについて勉強したのでこれを先にやる事にしました。

TalusとDebrisだそうです。

Talusって何でしょう?

調べました。

崖などから落ちてくる岩や石が、長年に渡って堆積してできた坂。だそうです。別名Screeと言うそうです。

Talusは特にこの坂を形成している岩の破片や石を指す事もあるそうです。

確かに崖のしたに大量の堆積物が溜まっています。

先程のConvectorとは全然形状が違います。

雪山と言うか寒い地方の山を再現する時は、このThermalやConvectorノードを使用してErosionを形成した方が良いのかもしれません。

<Crumble>

Crumbleと言う英単語自体を知りません。

調べます。

粉々になると言う意味でした。

この意味なら知っていました。

もっとGeology的な意味があるのかと思った。

崖とTerraceの境目がはっきりしたと言う感じです。

あんまりEdgeが粉々になって下に落ち堆積物になったようには見えません。

<Deposits>

Depositsです。

Alluviumノードの強化版だそうです。

もう山全体の土の量より堆積物の方が多い気がします。

こういうのは控えめに追加するのが良い気がするんですが、実際の山はどうなんでしょう?

<Fluvial>

Fluvialとは川によって運ばれた堆積物の事を言うそうです。

だんたんGeologyの専門用語が分かるようになって来ました。

Gaeaの説明です。

Erosionを使用した後で使用すると言いと書かれています。

以下のErosionノードの後で使用してみます。

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

Screenshotでは分かりにくいですが、細かい溝が増えました。

下層部分も見ましたが、堆積物が目に見えて分かるほど増えてはいませんでした。

<Hydro>

Hydroの解説です。

結果です。

水の浸食を追加する機能だそうですが、Terrainの傷が少なくなって丸くなっています。

水の浸食を追加したならもっとTerrainの傷が増えるべきだと思うんですがどうなんでしょう?

Deposits(堆積物)はほとんど出来ていません。

<HydroFix>

以下の説明がついていました。

これはErosionを作成するためのNodeではなくて水が流れる溝をつなげる機能だそうです。

このNodeを水に関係したErosionを作成する前に使用するといい結果が出るそうです。

使用した結果です。

そんなに変化があったのか不明です。

<Micro Erosion>

以下の解説です。

Erosionを使った後に使用するNodeみたいです。

Erosionノードの後で使用してみました。

Erosionノードでぼやけた代謝物と岩の境目がはっきりしました。

このNodeはかなり使い勝手が良い気がします。

Erosionの最後には絶対このNodeでTerrain表面を整える事にします。

<Sediment>

あれ、DepositsとSedimentが同じ物だと思っていました。

Sedimentは堆積物そのものを指します、Depositsは堆積物が堆積する様を表しています。

うーん。でもこの場合は?

これを読むと別に川は関係なくTerrain全体に堆積物を追加するみたいです。

確かにしています。

<Stratify>

StratifyとはStrataを整えると言う意味だそうです。つまり地層を追加すると言う意味です。

ここでもそういう意味で使用されていますね。

使用してみました。

すっごい。地層だらけになりました。

でもこのNodeはErosionとしてTerrainの最後の表面の仕上げに使用するものではなさそうです。

<Wizard>

Gaeaの解説を見ます。

Erosionノードの簡易版って事でしょうか?

使用した結果です。

うん。Erosionノードにどれを使用すべきか分からない時はこれも候補に入れる事にします。

これでErosionにある15個のNodeを全部調査しました。

来週、共通する特徴からこれらの15を何個かのSub Groupに分けて分類します。

7.Houdiniの勉強

今週もFOUNDATIONS | OVERVIEW [3]の続きを勉強します。

7.1 Working with Nodeの続きをやる

先週はGeometry LayerのOutputノードについて勉強したところで終わりました。

今週はその続きからやります。

Iについてです。

これを選択すると以下のBoxが開き

そのNodeに関係した情報が表示されます。

Network Paneの右上の以下のIconをClickして

Network Paneを画面いっぱいに表示させます。

ここでもY+MouseでLineを切断出来ます。

切断したNodeはJ+Mouseで繋ぐ事も出来ます。

Sphere1ノードとBoolean1ノードの間にNull2ノードを追加しました。

普通なら一回Sphere1とBoolean1との間のLineを切って繋ぐと思いますが、以下の方法でいきなり追加する事が出来ます。

Sphere1ノードの赤で囲った丸を右Clickします。

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

ここにNullと打ち込みます。

すると以下の様にNullノードが線に繋がった状態で追加されます。

Null2がある状態で更にNullを追加したので以下の様になりました。

このNull3をMouseで掴んでWiggle(小刻みに揺する)と

線から外せます。

ふえー。驚きです。

今度は線から外れたNullを他の線の間に置きます。

Box1とBoolean1との線の間に置きました。

するとその線の間にNull3が入り込みました。

凄い。

CursorをNodeに重ねた状態でAlt+左ClickでそのNodeの複製が作れます。

Null3にMouseを重ねた状態でAlt+左Clickをした結果、Null4が出来ました。

今度はCursorをNodeに重ねた状態でAlt + Ctrl + Shift+左Clickします。

Sphere1の上でAlt+Ctrl+Shift+左Clickをしました。

今度作成されたSphere2はSphere1のReference Copyだそうです。

うーん。

Alt+Ctrl+Shift+左Clickはかなり大変です。

線の上でAltを押しながら左Clickすると以下のようなDotを追加出来ます。

UEで言うところのRe Routeですね。

Tutorialだと適当に並んでいる5つのNodeを選択した状態でAを押すと全部真っすぐ並び直します。

私のProjectでAを押しても何も起きません。

もう一つの方法としてLayoutからAlign Nodes Verticallyを選択します。

こっちは出来ました。

以下の様に選択したNodeが真っすぐになりました。

更にこの後で、Distribute Nodes Verticallyを選択すると

Nodeが綺麗に並びます。

この辺はUEのBlueprintと全く同じです。

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

右上にある以下のNodeのParameterを表示するBoxの表示をEnable、Disableします。

今度はZを押すと右下に以下のBoxが表示されます。

Nodeを選択した状態でこのBoxの中のどれかを押すと

以下に示した様にそのNodeの形状が

Box内の選択した形状に変化します。

この機能、私は絶対使用しないとは思いますが、一応記録しておきます。

Cを押すと今度は以下に示したColor Boxが表示されます。

Nodeを選択した状態で色を押すと

Nodeの色が変わります。

こっちの方がいずれ使いそうです。

こんな細かい機能の実装をさせられたProgrammerは可哀そうですね。

以下に示したNodeの情報を表示するBoxにはCommentを書き込める箇所があります。

コメント書き込めます。と書いてみました。

更にShow Comment in NetworkにCheckを入れると

以下に示した様に

Nodeの脇に書き込んだCommentが表示されます。

以下に示したNetwork Paneの右上にある黄色いIconをClickすると

以下に示したSticky Noteが表示されます。

当然、Sticky Noteにはコメントを書き込む事が出来ます。

黄色のIconの左のIconです。

選択しているNodesをBoxに入れます。

このBoxはNetwork Boxと言うそうです。

UEのCommentと同じですね。

Network Boxは名前を追加したり

―のIconをClickする事でBoxのSizeを小さくする事が出来ます。

次は以下の茶色のIconについてです。

このIconはSubnetと書かれています。

以下の様に2つのNodeが選択された状態で

Subnetを押すと以下に示したような一個のNodeに変化します。

このNode内を見ると

先程のNodeが内部に収められています。

UEでいう関数化かMacro化と同じ機能です。

Lを押すと自動でNodeを整頓してくれるそうです。

NodeをバラバラにおいてLを押したら以下の様になりました。

ToolからShow Tool Paletteを選択すると

以下のBoxを表示します。

ここからNodeを選択、追加する事も可能です。

ここで突然、Tutorialが終わりました。

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

これを消す方法を早く知りたい。

7.2 Parametersを勉強する

今週は、先週と違ってまだかなりの時間が残っているので次のTutorialも勉強します。

今度はParameterについてです。

まずTranslateの位置でMouseのMiddle Buttonを押すと以下のBoxが表示され移動する単位を選ぶ事が出来ます。

今度は2つのObjectの位置を同じParameterで管理する方法です。

まず右Clickして以下のBoxを表示させCopy ParameterでParameterをCopyします。

このParameterの値をShareしたObjectを選択してそのTranslateを選択して右Clickします。

そして以下のPaste Relative Referencesを選択します。

すると以下の様にTranslateの値に以下のようなCodeが書き込まれます。

すると以下の2つのObjectの元を動かすとCopyされた方のObjectも一緒に動きます。

このCodeの先にマイナスをつけると今度は逆向きに動きます。

0.2を掛けると移動距離が0.2倍になります。

RotateのYのBoxで右Clickして以下のBoxを表示して

ReferenceのScene Data...を選択します。

ここからもう一方のObjectのRotate[Y]の値を選択して

Acceptを押します。

このやり方でも2つのObjectのParameterの値をShareする事が出来ます。

今回はRotationが同じになります。

このやり方の場合は、Codeは表示されないみたいです。

今度はKey Frameだそうです。

Kを押す事で以下のKey Frameに位置や角度を記憶させておく事が出来ます。

設定したKeyを消したいんですがやり方が分かりません。

Objectを選択してそのParameterの値の上で右Clickすると以下のBoxが表示されるので

Delete Channelsを選択します。

するとBoxの色が緑から黒に代わって

Keyでの指定から解放されます。

今度はLock Parameterを選択します。

するとこれらの値を変更する事が出来なくなります。

次はMotionFXだそうです。

Motion FXそしてNoiseを選択して以下のBoxを表示します。

色々弄ってみましたがこれの使い方は分かりませんでした。

頭が働かなくなっているのかもしれません。

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

8.Volumetric Cloudの勉強

8.1 YouTubeでTutorialを作成する目的の整理

最近、ホリエモンの動画を見て知ったんですが、世の中のかなりの人が、実は本に書かれている内容は理解出来ないそうです。

本を読むのが飯を食うより好きだった私にはにわかには信じられない内容でしたが、話を聞いているうちにかなりの真実な気がしてきました。

確かに本を読んで本の内容を理解するには、日本語を理解出来る以上に本の文法や本が書かれた前提条件などの本の読み方を知っておく必要があります。

私の場合、星新一ショートショートを読んで、本の読み方を学びました。

今の世代はなろう系とか異世界系とかのライトノベルを読んで、本の読み方を学んでいたんです。

なろう系とかの本で、本の内容が全部、その本の題に書かれているのがありますが、これだって本の読み方を習う人達にとっては重要なヒントになります。

そうやって読書家になる人は、最初に本の読み方を学んでいたんです。

そしてそういう経験をしてこなかった層は、本の読み方を学ぶ事が出来ずに、全く本が読めない大人になっていたんです。

例えば数学や英語(読むだけ)は学校の成績によってその人がどれくらい出来るのか、大体はっきりしています。

しかし本が読めるかどうかは学校では全く試験しません。ので読書家だった私は世の中の人は私と同じくらい本を読んで理解出来ていると勝手に信じていました。

非常に驚きですが、私のこの認識は間違っていました。

本が読めない人達は、本そのものは読めても、実際は書かれている内容や作者の言いたい事を理解していなかったんです。

私の場合、普段、全く本を読まない人達と話をすると、話が全然かみ合いません。

政治や宗教的な立場の違いとか、意見の食い違いとかではなく、話そのものがかみ合わないです。なんというかChatGPTと会話しているみたいな感覚になります。

この原因もついでに分かりました。

相手は本に書かれている情報を全く理解出来ないので、その本の情報を理解した事を前提にしゃべっている私の話も全然理解出来てなかったんです。

それで適当に相槌を打っていただけだったので、話そのものがかみ合わなかったんです。

ホリエモンの話によると本の内容が理解出来ない、本を読むことが出来ない人達も、YouTubeで説明すると本に書かれているような複雑な内容が理解出来る様になるんだそうです。

これも衝撃的でした。

話言葉だったら、本を読めない人でも本に書かれているような複雑な内容が理解出来るんだそうです。

目から鱗です。

ここからが私が言いたいPointです。

Volumetric CloudのTutorialをBlogで作成しても、それを理解出来る人は知性の高い人達、つまり本を読んで理解する事が出来る読書家だけです。

しかしYouTubeで解説する事が出来れば、それ以外の本を読んで理解する事が出来ない層も理解出来るようになります。

更に映像で説明するので、Editorの細かい名称とか、操作の仕方も見て理解出来ます。

つまり、Blogで説明するよりも10倍、20倍の人が理解出来る様になるんです。

今、日本では特にGameの作り方を勉強したい。Unreal Engineの使い方を学びたい。という欲求が一部のGamerやCreatorの間でかなり高まっているみたいです。

しかし実際にUnreal Engineを使用して商業LevelのGameを完成させられるのは一万人に一人ぐらいでしょう。

それ以外の9999人は途中で躓いて涙の挫折を味わう事になります。

私もUE 4.24で作成していたRPGはPackagingしたら戦闘システムが発動しないというBugともうみんなUE5に移行してしまったと言う理由でお蔵入りになってしまいました。

これがYouTubeのTutorialがあれば10倍分かり易くなって1000人に一人はGameを完成させられるようになる可能性はあります。

しかしこれからそういう人達のために作成されるであろうUnreal EngineによるTutorialの多くは、素人でも半年でGameが作れる的な詐欺まがいの情報商材的な内容になるでしょう。

何といっても買う人達がどれが正しいのかの判断が付かないある意味本物の素人達ですから。

その彼らに本物の情報を届けたい訳です。

それはVolumetric Cloudについてだけじゃなくて、UE全般についてもです。

例えばUEを使いこなすための前提として、英語が出来る事、数学が出来る事、そしてProgrammingが出来る事、の3つは最小限の前提ですよ。というまあ当たり前の事実だけど誰も言いたくない情報もそこでは発信したいと思っています。

この辺を目標にしたTutorialの作成を目指しています。

8.2 Volumetric CloudのTutorialを作成するに当たってこれから勉強しないといけない事や分かっていない事のまとめ

Volumetric CloudのTutorialを作成するにあたって内容を整理していたら訳分からん事やこれから勉強しないといけない事がある事が判明しました。

それらを以下にまとめて整理しておきます。

  • Open VDBについて
  • Dynamic Volumetric Skyを既に持っていた件
  • UE5のThird Person TemplateのVolumetric Cloud

<Open VDB>

先週、紹介したOpen VDBですが

これ無料なのにかなり良いPluginみたいです。

これの使用方法について全く知りません。

やはりYouTubeでTutorialを作成するとなると、Volumetric Cloudの使い方を理解すると言うよりももっと手っ取り早く、本物っぽい雲の作成方法が知りたい。と言う要求が大きいと思います。

それに対する解答としてこのOpen VDBはどうなのか?

という事です。

それに対する解答をある程度答えられるようにした方が良い気がします。

のでOpen VDBについても少しだけ勉強する事にしました。

<Dynamic Volumetric Skyを既に持っていた件>

これ去年の月毎の無料サンプルで配られた時に貰っていました。

持っているので色々試してみようと思います。

<UE5のThird Person TemplateのVolumetric Cloud>

いつもNiagaraやMaterialの作成に使用しているProjectを開くと

以下に示した雲が表示されます。

これが結構、綺麗なんです。

しかもMaterialにMI_VolumetricCloud_02_Profiles_PaintClouds_Morningを使用していますが

この元になっているMaterialであるM_VolumetricCloud_02_Profiles_PaintClouds_Morning

の実装を見ると

以下に示したような単なる黒のTextureが使用されていて

雲が形成出来るはずがない。実装になっています。

しかし現実には雲が出来ている。

これが凄く謎なんです。

もしThirdPersonのTemplateの空がこれだったらこれを最初から使用すれば綺麗な雲が形成出来る事になります。

だったらここだけ勉強すれば良い事になってしまいます。

まずThird Person Templateの新しいProjectを作成してDefaultのLevelのVolumetric Cloudを確認してみます。

新しいProjectを作成して確認したらm_SimpleVolumetricCloud_Inst、つまりm_SimpleVolumetricCloudを使用していました。

Emptyから作成した場合と一緒でした。

何でMaterialやNiagara作成用のProjectの空だけ違ったんでしょうか?

謎ですね。

それは兎も角、MI_VolumetricCloud_02_Profiles_PaintClouds_Morningを使用すると何で雲を形成する事が出来るのかについても検証する必要があります。

8.3 z方面の雲の形状の決定方法についての解説を書き直す

先週、書いた説明は以下の問題がありました。

今週は正規化(Normalization)を説明しないで、m_SimpleVolumetricCloudにおける雲の作成方法を説明するために以下の条件を追加します。

  • Voxelのサイズを2x 2 x 2にします。
  • 色も0(黒)と1(白)だけにします。

まず先にImage用の画像だけ作成します。

2 x 2 x 2のVoxelです。

Voxelの値を決定するために使用する2つのTextureです。

Voxelの座標を説明するための図です。

これらを使用してもう一回、m_SimpleVolumetricCloudにおける雲の作成方法を説明します。

以下に説明を書き直します。

UE5を開くとVolumetric CloudというAssetがあります。

このAssetが空に広がる雲を作成しています。

このVolumetric CloudのParameterを見ると以下に示した

Materialとう項目があり、そこにはm_SimpleVolumetricCloud_InstというMaterial Instanceがセットされているのが分かります。

このMaterial Instanceの親Materialがm_SimpleVolumetricCloudになります。

m_SimpleVolumetricCloudを開くと以下の実装があり、

この部分にある2つのTextureがVolumetric Cloudの形状、特にZ方向の形状を決定しています。

2023-01-15のBlogでこの①のTextureのGの値と②のTextureがZ方面の雲の形状を決定していると述べましたが、それはこの部分の実装を解説してそう述べました。

今週はこの2つのTextureがどうやってVolumetric Cloudの形状、特にZ方向の形状を決定しているのかについて簡単に説明します。

まず2023-02-01のBlogで説明しましたが、Volume Renderingでは、以下に示したように

空間をBoxで区切り、そのBox一つ一つに色と透明度を指定します。

当然ですが、Volumetric Cloudもこのやり方で描かれていますのでBoxの色と透明度を一つ一つ指定する必要があります。(専門用語ではこのBoxの事をVoxelと言います。2DのPixelと対比して3DのVoxelと呼んでいます。)

本来、このBoxは128x128x128みたいな膨大な数のBoxで構成されていますが、今回は理解し易くするために以下に示した2 x 2 x 2のBoxで説明します。

こうすることで正規化(Normalization)の概念を知らない人に対してでもこの2つのTextureがどうやってVolumetric Cloudの形状、特にZ方向の形状を決定しているのかを説明する事が出来るからです。

ただし正規化(Normalization)を使用しないで説明するためには更に幾つかの改良する必要があります。

まずTexture①で使用されているTextureのG CannelのImageを

から以下のTextureに

変更します。

2x2 Pixelしかない非常に小さいTextureです。

更に使用されている色は白と黒の2色だけです。

黒はRGBAで(0,0,0,1)、白はRGBAで(1,1,1,1)ですが、ここでは黒は0,白は1とします。実際にはRの値しか使用しないので、これでも大体は有っています。

赤で書かれた数字は座標です。左上が原点になります。

同様にTexture②で使用されている以下のTextureを

以下のTextureに変更します。

ここでも使用されている色は白と黒の2つになります。当然、ここでも黒は0,白は1とします。

座標も前のTextureと同じで左上が0になります。

最後にVolumetric Cloudの座標を決定します。

Boxを上から見た場合です。

左上を原点にしてXとYの座標を決定しました。

次にZの座標を決定します。

Boxを前後左右のどれかから見た場合です。

以下に示した様に

zの値は下から上に上がるよう決定しました。

この図ではXYの原点と違う場所が原点になっているように見えますが、原点の位置はXYと同じにします。

これで正規化(Normalization)の概念を知らない人に対してでもm_SimpleVolumetricCloudの2つのTextureがどうやってVolumetric Cloudの形状、特にZ方向の形状を決定しているのかの説明が出来る条件が整いました。

ではこれから以下の8個のBox全ての色を決めていきます。

まずMaterialにこのBox(0, 0, 0)の色を決定しろと命令が来ます。

Texture①がこのBox(0, 0, 0)のXYの値である(0, 0)をUV値として受けて

以下のTextureから

白を返します。白は1ですので、実際は1を返します。

次にこの1の値と以下に示したCould Sample Attributesノードからの返し値である高さの値、つまりZの値、この場合は0でUV値を作成します。

この場合は(1, 0)となります。

このUV値(1, 0)が次のTexture②に送られます。

以下にTexture②を示します。

ここで(1, 0)の座標を見ると色は黒になっています。黒は0です。

はい。

Box(0, 0, 0)のAlpha値は0に決まりました。

これを16個全部のBoxに対して行っていきます。

以上です。

8.4 もう一回内容の問題点を検証する

今回は、細かいケアレスミスはあるかもしれませんが、全体としてはOKな内容だと思います。

Volumetric Cloudの座標の話が分かりにくいのと、

それぞれのBoxの色を決定するのと雲の形状を決定する事の関連がこの説明では分かりにくいかもしれません。

透明度の0と1で雲の形状を決定する訳ですが、その辺の説明も追加する必要があるかもしれません。

後は、この説明はあくまでも大体合っているというLevelの説明で実際の計算はMaterialの実装を見てもらう必要がある事も追加で説明しておいた方が良いかもしれません。

しかし、この事を理解していないでMaterialの実装を読んでも、計算方法は理解したけどそれが何を計算しているのかは全然分からないと言う事態になるので、この説明自体は大変重要ではあります。

これ以上、簡単に説明しないと理解出来ない人は、それ以前のMaterialの変更方法やVolumetric Cloudの操作方法そのものが理解出来ないと思われますので、これ以上簡単に説明する必要はないと思います。

8.5 PluginであるVolumetricの使用方法について解説する

これは来週やります。

それよりも以下の

  • Open VDBについて
  • Dynamic Volumetric Skyを既に持っていた件
  • MI_VolumetricCloud_02_Profiles_PaintClouds_Morningが普通に雲を形成している件について

について今週は検証する事にします。

8.6 MI_VolumetricCloud_02_Profiles_PaintClouds_Morningが普通に雲を形成している件について

まずこれがほかのProjectでも同じなのか確認します。

むー。

雲が生成されています。

しかし同じM_VolumetricCloud_02_Profiles_PaintClouds_Morningが親MaterialであるMI_VolumetricCloud_02_Profiles_PaintClouds_Morning1とMI_VolumetricCloud_02_Profiles_PaintClouds_Morning_BaseShape

は雲が一つも表示されません。

となるとMI_VolumetricCloud_02_Profiles_PaintClouds_Morningの設定に雲を表示する秘密があるはずです。

これを解明します。

まずこれらのPluginのAssetはEngineに属しているので間違って変更したらEngine全部のAssetがおかしくなってしまいます。

M_VolumetricCloud_02_Profiles_PaintClouds_MorningとMI_VolumetricCloud_02_Profiles_PaintClouds_MorningをDuplicateしてそれをProjectに移動させました。

更にM_VolumetricCloud_02_Profiles_PaintClouds_MorningからMaterial Instanceを作成しました。

これだと名前が訳分からないので、

M_VolumetricCloud_02_Profiles_PaintClouds_MorningをM_CloudMe、そこから生成したMaterial InstanceをMI_CloudMeに変更しました。

MI_CloudMeをVolumetric Cloudにセットしてみます。

雲は一個も生成されていません。

ここからMI_VolumetricCloud_02_Profiles_PaintClouds_Morningの設定と比較してどの値で雲を生成しているのかを解明します。

Flowmap1の値を変更しました。

結果です。

ああ、雲が出来ています。

更に詳しく見ると以下のDetailの値を大きくすると

大量の雲が発生しました。

そして逆にDetailの値を小さくすると

雲が無くなりました。

うーん。

成程。

今度はこのDetail Parameterを実装から見てみます。

M_CloudMeを開きDetail Parameterを探します。

ありました。

この計算結果が最終的に何の値になっているのかを調べます。

Conservative Densityに繋がっていました。

はい。雲の形状を決定するRGBAのAの値を決定するConservative Densityです。

うーん。

実はConservative Densityと以下に示したMainノードのExtinction

は両方、雲の形状を決定するためのInputですが違いが分かりません。

それは兎も角、何でDetailの計算結果が0にならないのか調べます。

遡って実装を見てみるとFlowmaps_3Dノードに繋がります。

このNodeに0の値をInputすると0を返すとは思えませんが、それぞれのInputの値がどうなっているのかを調べました。

Noise Flowmaps Speed Parameterと掛け算しているNodeの値が0のような気がします。

もしそうならNoise Flowmaps Speed Parameterの値はどう変化しても0になるので影響はないはずです。

一寸試してみます。

雲のどこが変化するのかは不明ですので、どこに注目して変化を確認すれば良いのか今一分からないですが、変化してないように見えます。

Scaleの値を変更するだけで

雲の大きさが全然変化します。

凄い。

これは、一寸予定を変更してこの機能を研究する必要があるんじゃないでしょうか。

まず雲の形状の変化がかなり激しいです。

これを直すParameterを探します。

雲の形状は以下のFlowmaps_3Dノードで決まっているので

このVelocityの値に影響を及ぼすParameterを探します。

以下の部分のParameterが怪しいです

Storm Fake Advection Density Parameterが雲の形状の変化を管理してそうです。

このParameterの値を変更してみます。

値をDefault値である4から下げました。

結果です。

雲の変化が穏やかになりました。

となるとFake Advection Dirノードは雲の移動する方向を指定するParameterですね。

試しにFake Advection Dirノードの値を以下の様に変更してみます。

結果です。

雲が横に流れるようになりました。

凄い。

他のMaterialもDetail値を変更したら雲が見えるんでしょうか?

M_VolumetricCloud_02_Profiles_PaintClouds_Smallの実装を見ると

Flowmaps_3DノードのVolume Textureに

が使用されています。

これもDetailの値を変更したら雲が見えそうです。

試してみます。

Copyして更にMaterial Instanceも作成しました。

Volumetric CloudにMaterial Instanceをセットして

Material InstanceのDetailの値を変更したら

巨大な雲が現れました。

これは凄い。

M_VolumetricCloud_02_Profiles_Softですが、これはDetailの計算結果を使用する以下に示したAddの①が

どう計算しても0になります。

ただしDetail2の計算結果を使用するAdd②の方は0以外の値になりそうです。

試してみます。

M_VolumetricCloud_02_Profiles_SoftのInstanceを作成してVolumetric CloudのMaterialにセットしました。

雲一つない空です。

Detailの値を50位まで上げましたが何も変化ないです。

Detail2の値を以下の様に上げたら

以下の様に大量の雲が突然現れました。

これは、来週、Volumetricにある以下のMaterialを全部試験し直す事にします。

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

9.DirectXの勉強

9.1 C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [4]のVersion Fileの勉強

Olympus Mons Tutorials氏のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [4]のVersion Fileを勉強します。

これ短いんですが、まあ良いです。

今週のDirectX 12の勉強は軽めにします。

まず一回全部見ます。

見ました。

ResourceにあるVersionを開いてその値を調整しているだけでした。

まあ、Versionの管理をしておかないと後で面倒にはなりますね。

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

Resource ViewのBlank Projectから

以下に示したAdd Resourceを開きます。

この中のVersionを選びNewを押します。

すると以下のようなTabが開きます。

Company Nameを変更します。

File Descriptionを変更します。

Product Nameも変更します。

以上でした。

こんなのすぐに出来ます。

ここでやってしまいます。

Visual Studioを開いたらResource Viewが閉じています。

どうやってResource Viewを開くのか忘れてしまいました。

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

以下に示した様に

しっかりとResource Viewの開き方が書いてありました。

BlankProject.rcをDouble Clickしました。

以下に示した様にResource Viewが表示されました。

ここからAdd Resourceの開き方が分からないと思ったら、このやり方も先週のBlogに書いてありました。

BlankProject.rcを右Clickして以下のBoxを表示させ

Add Resourceを押します。

Add Resource Boxが開きました。

Versionを選択してNewを押します。

以下に示したTabが開きました。

Tutorialと全く同じです。

Company Nameを変えました。

特に良い名前も思いつかないのTutorialと同じにします。

Spellの確認してたらTutorialの方がOlympus Mons Tororialになってました。

File Descriptionの値も変更します。

こっちもTutorialと全く同じにしました。

最後にProduct Nameを変更します。

これもTutorialと全く同じにしました。

Saveします。

以上です。

5分は言い過ぎですが、本当に一寸しかやっていません。

まあ良いです。今週から他の本ではDirectX 12の勉強に入りますのでそっちに集中するためにも、今週のC++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [4]の勉強は短くても良いです。

9.2 DirectX 12の魔導書」の3.3.2 DirectX D12の初期化を勉強します

私のProjectを開いたら「3.3.2 DirectX D12の初期化」の最初の部分だけ実装されていました。

調べたら2023-01-22のBlogで勉強していました。

読み直すとD3D12CreateDevice()関数を勉強していてよく分からなくなってそこで勉強を終了したみたいです。

よく分からないと言いつつもD3D12CreateDevice()関数が

Display Adapterを作成しているという事は分かりました。

この辺から復習します。

本を読み直します。

まず分かったのはD3D12CreateDevice()関数はID3D12Deviceを作成するための関数だという事です。

それで肝心のID3D12Deviceですが、なんの説明も無かったです。

うーん。

公式のDocumentを探しますか。

ID3D12Device interface (d3d12.h)[8]がありました。

ここに詳しく解説されていました。

  • Command Allocators
  • Command Lists
  • Command Queues
  • Fences
  • Resources
  • Pipeline State Objects
  • Heaps
  • Root Signatures
  • Samplers

を作成するための仮想的なAdapterと言っています。

ここで言うAdaptorの定義は映像出力に変換する装置という意味に捉えておくべきと2023-01-22のBlogで述べていますが、映像に変換するために上記のものを作成するのがID3D12Deviceと言う事ですね。

こっちの説明の方が分かりやすいですね。

一応、これで納得しました。

そしてそのID3D12Deviceを初期化するのに必要なのがD3D12CreateDevice()関数です。

D3D12CreateDevice()関数は以下に示した

Parameterがあり、それぞれのParameterについて詳しい説明が「DirectX 12の魔導書」に書かれています。

最初のParameterである“IUnknown *pAdapter”については2023-01-22のBlogでもそれなりに勉強していました。

うん。これは「DirectX 12の魔導書」の説明の方が何倍も分かりやすいですね。

もう一回この部分の説明を読み直しました。

うーん。分かりやすい。

このParameterにNullptrをセットしておくと自動でVideo Cardが選択されるそうです。

次のParameterですが“D3D_FEATURE_LEVEL MinimumFeatureLevel”です。

これも2023-01-22のBlogでそれなりに勉強していて、そのまとめを更にまとめたのを以下に示します。

DirectXにはLevelがあってVideo Cardによって使用出来るDirectXのLevelが決まっている。と言う前提がまずあります。

どのLevelを使用するのかをここで指定するそうです。

でもこの説明だと例えば古いVideo Cardであんまり最新のLevelのDirectXは使用出来ないやつに、ここで最新のLevelを指定したらErrorになってしまうって事になりますよね。

うーん。

この解釈で合っているのか?

何か不安です。

もう一回、本の説明を読んで確認しておきますか。

書いてありました。

指定したLevelにDriverが対応してない場合は、この関数は失敗すると。

この関数とはD3D12CreateDevice()関数の事でしょうから、やっぱりErrorになるって事ですね。

となるとこの解釈で合っているという事になりますね。

三番目のParameterです。

Rffiid riid

です。

2023-01-22のBlogではこのParameterの機能はよく分からないと書いていました。

DirectX 12の魔導書」の説明によると受け取りたいObjectの型を識別するためのIDを保持するための変数だそうです。

いやこれは2023-01-22のBlogでも理解しています。

2023-01-22のBlogで分からないのは、以下に示した公式の説明との関連です。

うーん。

今これを読むと、このParameterに返されるIDはID3D12DeviceのIDのようです。

最後のParameterです。

2023-01-22のBlogの説明を読むと、途中までは有っていたのに、何故か最後で大混乱して訳分からない事書いていますね。

このParameterに

をぶち込むという解釈で良いはずです。

確認のために「DirectX 12の魔導書」の説明も読み直してみます。

あ。分かった

何で2023-01-22のBlogでこのParameterについて混乱したのかが分かりました。

DirectX 12の魔導書」ではIID_PPV_ARGSというMacroを代わりに使用しています。これ本をよく読むと三番目のParameterと四番目のParameterの両方を代用するMacroと書かれています。

だからここに本来なら四番目にパスされる_dev変数がパスされている訳です。

しかしこれ、本をよく読んで理解してないと、三番目のParameterに_dev変数をパスしているように見えます。

それで2023-01-22のBlogではこの部分を混乱して間違って理解してしまったみたいです。

一応、確認のために公式のIID_PPV_ARGS macro (combaseapi.h) [10]も読んでおきます。

ああ。分かりました。

三番目のParameterにはこのDeviceのIDが返されるんじゃなくて、このDeviceのIDを入れないといけなかったんです。

このDeviceのIDなんか知る訳ないじゃないですか。

それを勝手に調べて、更にそのIDからそのDeviceへのPointerまで返してくれるのがこのIID_PPV_ARGSだったんです。だから自動的に四番目のParameterも使用する必要が無くなった訳です。

この解釈であっているはずです。

ここでお終いにすると2023-01-22のBlogと同じところで終わった事になります。

まあ仕方ないです。

今回復習した事でD3D12CreateDevice()関数のParameterについての理解が深まった。という事で納得しましょう。

9.3 HLSLシェーダーの魔導書を勉強する

この本、最近全く読んでいないので読むだけ読んでおきます。

「2.3.4 頂点シェーダー」まで読んだら、ここからSample Code内に書き込んでProgrammingしていくみたいです。

うーん。

そういう勉強方法だったのか!

どうしよう。

一応、書き込んでみますか。

実行してみます。

うーん。

こんなErrorが表示されました。

試しにSample CodeのSample02_02を開いて実装しました。

普通に三角形が描かれています。

もしこのError Messageが言うようにdxcompiler.dllが無いからCodeを実行できないとしたらこの三角形も描かれないはずです。

Sample02_02のSample.fxを見ると以下に示した様に

vsOut.pos = In.posが書かれています。

この問題は来週考える事にします。

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

9.4 「Direct3D 12 ゲームグラフィック実践ガイド」の「2.3 Direct X 12の初期化処理」を勉強します

以下のHeaderをIncludeします。

更にLibraryを追加します。

2023-01-22のBlogで勉強した「DirectX 12の魔導書」の「3.2.2 Direct3Dの初期化」と全く同じです。

次を見ます。

ああ。こんなに沢山の変数を追加しないといけないの?

2023-01-22のBlogで勉強した「DirectX 12の魔導書」の「3.2.2 Direct3Dの初期化」で宣言した変数は以下の3つだけです。

でもIDXGIFactory6は無いですね。

SwapChainも3と4で違っています。

ここは一寸待って、今の私でもわかるDeviceの初期化の部分だけ見る事にします。

D3D12CreateDevice()関数を探します。

一寸先にありました。

最初のParameterはnullptrを使用していますね。

これでVideo Cardを指定している訳です。

次のParameterです。ここはDirectXのLevelを指定しています。D3D_FEATURE_LEVEL_11_0が使用されています。

三番目のParameterです。

IID_PPV_ARGS()が使用されています。「DirectX 12の魔導書」と全く一緒です。

この部分は理解出来ました。

この部分の本の解説を読んでみます。

Direct3D 12 ゲームグラフィック実践ガイド」の「2.3.1 デバイスの生成」を読んでみます。

ResourceやPipeline State ObjectなどのDirectX 12に必要なObjectを生成するのにこのDeviceが必要と書かれていました。

これは分かりやすい説明です。

その後、それぞれのParameterの説明がありました。

それなりに詳しく書かれていますが、いきなりこれを読んで理解出来るかと聞かれると出来ないと思います。

もうそれぞれのParameterの機能を理解した私が読む分には全部書かれている事の意味を理解する事が出来ます。

先を読むと、IID_PPV_ARGS()を使用しない場合の実装方法が紹介されていました。

DirectX 12の魔導書」でも一寸だけこのやり方は書かれていましたが、こうやって実装まで示してくれると非常に分かりやすいです。

特に四番目のParameterの書き方とか、例が無かったら絶対分からないです。

今週はここまでにして、大量の変数を実際に打ち込むのは来週やります。

10.まとめと感想

今週はVolumetric CloudのVolumetric PluginのMaterialの雲を表示する方法が判明すると言う一寸、予定外の事件が起きました。

これはVolumetric Cloudの予定を一寸変更する必要が出て来ました。

まあ、でもこれはいい方にブレたので、まあ良いです。

11.参照(Reference)

[1] Ben Cloward. (2022b, October 13). Rock Shader - Advanced Materials - Episode 3 [Video]. YouTube. https://www.youtube.com/watch?v=Q2XI8cuSBMk

[2] Andrea Cantelli. (2020d, June 2). Gaea Tutorial for Beginners #5 | Creating the shape of our first terrain. YouTube. https://www.youtube.com/watch?v=swAL_i4jPO4

[3] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[4] OlympusMonsTutorials. (2021, March 3). C++ DirectX 12 Game Engine - [S01E02] - Refining Our Window [Video]. YouTube. https://www.youtube.com/watch?v=rWylZKi8QbM

[5] Cloward, B. [Ben Cloward]. (2022, June 2). Hex Grid Normal Tiling - Shader Graph Basics - Episode 48 [Video]. YouTube. https://www.youtube.com/watch?v=BBRmZ1dZCro

[6] Unreal Sensei. (2020, August 7). How to INSTANTLY TEXTURE your landscapes in UE4 - Unreal Engine tutorial [Video]. YouTube. https://www.youtube.com/watch?v=mP8eHwVEA0o

[7] CGHOW. (2022b, December 27). Sprite Based Animated Butterflies in UE 5.1 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=U1uLVV979xE

[8] S. (2023, February 10). ID3D12Device (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nn-d3d12-id3d12device

[10] S. (2021, April 2). IID_PPV_ARGS macro (combaseapi.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-iid_ppv_args