UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する。アニメレンダリングについて8

<前文>

<バイデン政権が320億ドルの学生ローンの免除を決定した件>

私は、バイデン政権が誕生した時、学生ローンの免除こそが今のアメリカに必要な政策で、それをしないバイデン政権は2~3年の内に国民の支持を失う。と予測しました。

しかし私の予測に反してバイデン政権は320億ドルの学生ローンの免除を決定しました。320億ドルと書くと日本人にはどのくらいの金額かピンと来ませんが1ドル136円で計算したら、約4.38兆円です。これを免除したんですから金額的には凄いです。

今週はこれについて書きます。

しかし時事問題について書いてもBlogに貼る時には、1~2週間後なので、既に話題性が無くなってしまうのでもう少しだけ恒常性のある話をします。

先週、前文に一寸だけ書いたBind とProtectですが、これ実は思っていたより深い話だったので、それにFocusしつつ、320億ドルの学生ローンの免除が与える影響について深堀したいと思います。

後、競争原理の原則の観点からも320億ドルの学生ローンの免除が与える影響について深堀したいと思います。

まず金額は凄いんですが、これ良く記事を読むとITTというほとんど詐欺みたいな大学が有って、その大学を卒業するとEngineerとして働けると言う宣伝にのってその大学にローンを組んで沢山のアメリカ人が通ったそうです。

しかし実態はその大学はアメリカの大学の基準をクリアしておらず、その大学で取った単位は全く認められず、卒業してもEngineerとしての仕事を得る事は全く出来なかったそうです。

この辺はあんまり良く分からないんですが、その大学がどうも全米にあってその被害者の数が物凄く多いみたいなんです。

それでその被害者を救済するために320億ドルの学生ローンの免除を組んだそうです。

この辺がどの程度、正しい情報なのか今の時点ではあんまり良く分からないんですが、一応これが正しい前提で話を進めます。

これ、一見凄い国民のためを思った政策のように見えますが、Engineerとして就職出来ないんじゃ、結局学生ローンを借りた人は借金を返す事は出来ません。ので最終的には自己破産するしかないです。そう言う人達の借金を免除する事は一見優しい事に見えますが、結局返ってこないお金をあきらめただけとも言います。

更に、そんなアメリカの基準で大学と認められない大学に通う学生に、国がローンとしてお金を貸したと言うのは、見方を変えれば国が詐欺の片棒を担いでいたわけです。

それを止めたからと言ってそんなにスゴイ事なんでしょうか?

もう一つ言いたい事があります。

それはバイデン政権が誕生した時、学生ローンの免除こそが今のアメリカに必要な政策である。と言ったのは先週話したBindとProtectの欺瞞性を見抜く能力が大学教育を受けている間に身に付くからです。

もう一度、Bind とProtectの関係について分かり易くここでまとめます。

法律を決めたり、施行したりすると全員がそれに従う必要がありBind(束縛)を負担する必要があります。ただしその結果、Protect(保護)の恩恵も受けとる事が出来ます。

分かり易い例が信号です。

みんなが赤信号では止まる。青信号では進む。を守るBind(束縛)を負担する必要が生まれます。その結果、青信号で交差点を渡っても安全であると言うProtect(保護)も受けとる事が出来る訳です。

ではこの法律は公平なのかと言うと、そうではないんだそうです。

信号機が、上流階級の人が交差点に来た時は常に青になる。と設定すると、上流階級の人達はProtect(保護)の恩恵だけを受けて、赤信号で止まるというBind(束縛)を負担する必要が無くなります。逆に一般国民は赤信号で止まる。というBind(束縛)だけを負担して、青信号で安全に渡ると言うProtect(保護)の恩恵を受ける事が出来なくなります。

これがBindとProtectの欺瞞性だそうです。

つまり法律が良い法律なのか悪い法律なのかを見定める為には、その法律が施行された時のBind(束縛)とProtect(保護)を見定めてその負担とその結果得られる利益が平等であるかどうかが大切になってくるんだそうです。

この立場から今回の320億ドルの学生ローンの免除を見ると、ウーン。と言わざるを得ません。

Law Schoolには沢山の学生ローンを抱えながら通う生徒がいます。彼らは法律の専門家ですから。上記のBindとProtectの欺瞞性を見抜くのは簡単でしょう。しかし彼らの借金は免除しないみたいです。となるとそういう借金しながらLawyerになった人達は借金を返すために、トランプ元大統領のような大金を支払う人のために働くしか選択肢が無くなります。

となると彼らは、BindとProtectの欺瞞性を見抜いてその是正のために働くのではなく、逆にもっと上流階級が得になるようなBindとProtectの欺瞞性を助長するために働かざる得なくなります。

これ、私が言っていた学生ローンの免除とは一寸違う事をしている気がしますね。

更に、競争原理の原則の観点からも語りたいと思います。

競争原理の原則は、結果だけ求めてその結果に相応しい報酬を払う。誰が達成したとか、どんな方法で達成したのか、については問わない。結果だけで判断する。を導入してみんなに公平な競争を約束している限り、資源がなくてもどんな辺境でもその国は発展すると言う原則です。

これは、別にどこかの本に書かれている訳ではないですが、井沢元彦氏の逆説の日本史の言霊思想位の真実をついていると思われるので、いつも使用しています。

因みに、以下の話を聞いた時、思い付きました。

アメリカ南部の奴隷を使って生産した綿ってとても生産性が悪く、これだったら普通に給料を払って農家毎に競争させた方がもっと綿を生産出来たそうです。

これって奴隷たちは別に綿を沢山生産したからと言って得になる訳ではないからです。だから頑張らない事に頑張る訳です。

これって今の日本とそっくりです。

頑張らない事に頑張る。

例えば、この前有ったキャンプ場の行方不明事件、警察官が3000人位動員されたらしいですが、見つかりませんでした。その後、捜査していない場所から遺体が発見されたみたいですが、なんでそんな無能なんでしょうか?

それは、この動員された警察官たちは別にここで頑張って行方不明の子を見つけたとしても何も得るものがないからです。

昔のアメリカの南部の奴隷といっしょなんです。頑張っても無駄だから頑張らないんです。

これを3000人の人達の前で行方不明の子を見つけたら一千万円上げます。やり方は問いません。自由にやって下さい。ってやったら直ぐに行方不明の子は見つかったはずです。

しかしそれはやらない。

競争原理の原則が働くと上流階級の人達も競争せざる得ないからです。競争したら、上流階級の人も負ける事になるからです。

しかし余りにも競争原理を無くすと、誰も頑張らなくなって国が弱くなり戦争に負けて上流階級の人達も最後には滅ぶ事になります。

アメリカの南部の奴隷主達も南北戦争でボロクソに負けて死んだか、生き残っても子孫代々、奴隷を使っていた恥すべき人達というレッテルを永遠に貼られる羽目になってしまいました。

この競争原理の原則の観点から、今回の320億ドルの学生ローンの免除を見ると、やっぱりLaw SchoolやMedical Schoolに通う学生のLoanを免除して初めて競争原理の原則が働く事になると考えられます。

ので、この点から見てもあんまり評価は出来ません。

まあ、そうは言っても、320億ドルの学生ローンの免除はする訳ですから、それなりには凄いかもしれませんね。

この辺の評価は後でもっと情報が出てから検証し直してみようと思います。

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

<本文>

1.今週の勉強について

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

  • Niagara: CGHOW氏のTutorialをやる
  • Materialの勉強
  • RPGEventの作成
  • Open Worldの検証
  • Gaeaの勉強
  • 雪山のMapの作成
  • UI Designの勉強
  • Anime Renderingの勉強

2.Niagara: CGHOW氏のTutorialをやる

今週はScratch Padの勉強としてUE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [1]をやります。

それだけだと短いのでその他にFlip Fluid in UE5 Niagara Tutorial | Download Files [2]も勉強します。

血が流れるVFXの作成は非常に興味があります。私のPCではSmoothには動かないかもしれませんが試してみます。

2.1 UE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [1]を勉強する

まず軽く見たんですが、短い。4分しかないTutorialでした。

これだけだと一寸短いので更にもう一つやる事にします。

最初、このTutorialでは何をやっているのか不明だったんですが、全部見たら分かりました。

以下の様な球の表面にSpriteを生成するとします。

Level上で球のサイズを変更すると

Particleの生成される数は同じなのでスカスカになります。

これを球のScaleに応じて生成されるSpriteの数を調整したい訳です。

球が大きい時は沢山のSpriteを生成します。

球が小さい時は少しのSpriteを生成します。

今回はこれを実装するためのScratch Padを作成します。

いつものようにFountain Emitterを追加したNSを作成します。

要らないModuleを消して以下の様にしました。

結果です。

球の表面にSpriteが生成されています。

何もないLevelを作成してその中にこのNSを配置しました。

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

生成されるSpriteの数は同じなので球の隙間が広がります。

生成されるSpriteの数を調節する事でこの隙間をどんなサイズの球でも同じにします。

まずEmitter Update Sectionに新しいScratch Pad Moduleを作成します。

Emitter Update SectionにScratch Pad Moduleを作成するのは多分初めてですね。

Scratch Padの名前をSpawn Countにしました。

Map Get ノードに新しいVectorを追加しました。

更にMap Set ノードの+に繋げて以下のParameterを作成しました。

Applyを押します。

そしてこのSpawn Countノードの

Input New Vectorに球のサイズを表すOwner Scaleを接続します。

勿論、Spawn Count内のMap Getから直接このOwner Scale を呼び出す事も可能です。

以下の様にSpawn Countの実装を変更しました。

生成されるSpriteの数を決定するSpawn Burst Instantaneous Moduleの

Spawn Countは以下に示した様にIntで指定するので、

Map SetノードのEmitter My SpawnもIntに変更しました。

上記の実装だと球のサイズの数しかSpriteを生成出来ないのでMultiplierを追加しました。

Spawn CountのMultiplierに200をセットします。

更にEmitter Update SectionのSpawn Count Moduleの

Spawn Countに先程作成したEmitter My Spawnをセットします。

結果です。

Scaleを2倍にしました。

結果です。

うーん。そんなに変わっていない気がします。

良く分からないのでScaleを10倍にしてみました。

結果です。

比較のために同じ距離から撮影したScale1倍の結果です。

うーん。正直良く分かりません。

5倍にしてみました。

お。これだと10倍のScaleと比較して球の大きさは半分ですが、Sprite同士の隙間は10倍のScaleと同じ位ですね。

<Name Space Ownerについて>

このTutorialを勉強してName Space OwnerってLevel上に配置されているNSの値をModule内で得る事が出来るName Spaceなのでしょうか?

調べます。

ParametersからOwnerをPickupしました。

これ見るとVelocityとかSystem Local To WorldみたいなLevel上に配置されているNSの値とは関係ないParameterがありますね。

Level上に配置されているNSには以下のCast Shadowがありますが、

このParameterの値をScratch Pad内で得るためにMap Get ノードを調べましたが

Owner Name Spaceを見ても関連するParameterは見つかりませんでした。

UE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [1]の感想>

このTutorialだけでは量が少なすぎます。

次のScratch PadのTutorialも勉強する事にします。

2.2 UE5 Niagara #ScratchPad Module #4 | LODs [3]を勉強する

Scratch PadにおけるLODの設定方法について勉強するみたいです。

これはCameraからの距離を保持するParameterがどれなのかを勉強すると言い換えても良いと思います。

軽く見ました。

TutorialではCameraからの距離によってParticleが消える例と、Particleの色が変化する例の実装方法を解説していました。

それでは実装してみます。

まずいつものようにNSを作成してFountain Emitterを追加し、Emitter内の要らないModuleを消します。

Emitter Update SectionのEmitter State Moduleの

Scalability ModeにSelfをセットします。

このScalability Modeって何を管理しているのかと思ってCursorを乗せてみたら以下の説明が表示されました。

これ、このParameterの機能を解説してないじゃん。

その直ぐ下のEnable Distance CullingにCursorを乗せると以下のBoxが表示されました。

これにCheckを入れるとEmitterのCullingがCameraからの距離に応じて出来るようになります。更にSleepしたり起こしたり瞬間的にKillしたりも出来るようになります。

と書かれています。

他のParameterも全部Checkしましたが、全部そのParameterの機能についての解説が書かれていました。

何でScalability Modeだけ解説が書かれていないの?

公式のDocumentであるEmitter Update Group [4] を見ると以下の解説が載っていました。

うん。まあ想像していた以上の解説は無かったですが、それでもScalability Modeの機能についてしっかり解説しています。

Scalability Mode にCursorを乗せた時にこの解説が現れないのは、このParameterの機能の紹介を書くべき人がサボったんでしょう。

こういうのは早く直してほしいです。

Scalability ModeにSelfをセットすると以下に示した様にScratch Padを使用しなくてもCameraの距離に応じてSpriteの生成を調節出来るそうです。

しかし今回はScratch Padを使用してCameraからの距離を調節する方法を勉強するのでこの部分の機能は使用しないそうです。

元に戻しました。

Emitter Update SectionのSpawn Rate Moduleの

Spawn Rateの値を500にセットしました。

1秒間に500個のParticleを生成します。

カメラから遠くに移動させます。

この場合も1秒間に500個のSpriteを生成しています。

今度は逆にCameraに近づけました。

この場合も1秒間に500個のSpriteを生成しています。

それではLODを実装するためのScratch Padを追加します。

Particle Spawn SectionにScratch Moduleを追加しました。

まずMap GetノードにInput New Camera Queryを追加します。

Camera Queryを使うのか!

昔、一回位使用した事があります。

Get Camera Properties CPU/GPUノードを繋げます。

これでWorld 座標軸におけるCamera の位置が判明します。

更にMap GetノードにParticle Positionを追加します。

これでWorld 座標軸におけるParticleの位置がPassされました。

Subtractノードを利用してParticleとカメラの差を求めます。

その差をLengthノードを使用する事で距離に変換します。

これでCameraとParticleの距離が判明しました。

今度は指定したLODの距離より遠いのかどうかを判断する実装を追加します。

まずGreater ThanノードでCameraとParticleの距離と指定した値を比較します。

このGreater ThanノードのBにはMap Getノードに新しく追加したInput Rangeと繋げます。

これで比較する値はNSから指定する事が出来ます。

そしてGreater Thanノードの結果をSelectノードに接続します。

SelectノードはBooleanを返してBooleanを受け取るので以下の設定になります。

うん?

これだったら要らないんじゃ。

更に前のTutorialでは敢えてTrueなら1、Falseなら0を返していました。このやり方とはどう違うんでしょうか?

この結果をMap Setノードの新しく作成したParameterであるParticle If Particle Farにセットします。

因みにParticle If Particle FarはBool型です。

これで指定したLODの距離より遠いのかどうかを判断する実装は完成です。

Applyを押します。

NSに戻ります。

Particle Spawn SectionにKill Particleノードを追加します。

Kill ParticlesにParticle If Particle Farをセットします。

更にParticle Spawn Sectionにある先程作成したScratch Moduleの

Rangeに100をセットします。

すると以下の結果になります。

Spriteの位置をCameraから遠くに移動させます。

Spriteが消えました。

今度はSpriteの色をCameraからの距離によって変更します。

まずScratch ModuleをInitialize Particle Moduleより前に持ってきます。

これでParameter、Particle If Particle FarがInitialize Particle Module内で使用出来るようになりました。

Initialize Particle ModuleのColorに以下の設定をセットします。

ColorにMake Custom Linear Color from Boolをセットします。

Boolに先程のParticle If Particle Farをセットします。

結果です。

緑色になりました。

Spriteをカメラから放します。

赤くなりました。

今度は赤から緑に突然切り替わるのではなく、徐々に色が切り替わるようにします。

まず先程のScratch Padに戻って

Normalize Distance Rangeノードを追加します。

このNormalize Distance Rangeノードを以下の様にセットします。

TutorialだとStart PositionにMap GetノードのParticle Position、End PositionにGet Camera Properties CPU/GPUのCamera Position Worldを繋いでいます。

これって逆だと思うんで、そこは逆にしました。

そしてこのNormalize Distance RangeノードのNormalized Rangeの値をMap Setノードに繋げました。

Applyを押してNSに戻ります。

まずParticle Spawn SectionのInitialize Particleノードの

Colorに以下の設定を追加します。

今度はColorにLerp Linear Colorsを使用します。

Lerp Factorに先程、Scratch Pad内で作成したNormalize Rangeノードを使用します。

結果です。

黄色いです。

Cameraに近づけます。

ここまで近づけてやっと赤くなりました。

今度はカメラから遠ざけます。

緑色になりました。

更に同様の設定をSprite Attributeに行う事で、

SpriteのSizeをCameraからの距離に応じて変化させる事も出来ます。

Cameraに近い時です。

Spriteの色が黄色(カメラとSpriteの距離が250cmの時)

Spriteの色が緑色の時です。(カメラとSpriteの距離が500cm以上の時)

です。

以上でした。

UE5 Niagara #ScratchPad Module #4 | LODs [3]を勉強した感想>

うーん。結構勉強になりました。

特に勉強になったのはCameraの位置を知る事が出来るGet Camera Propertiesノードの存在です。

このNode一回ぐらい過去に使用した経験があります。が全くその存在自体を忘れていました。

Normalize Distance Rangeノードもほとんど初めて使用しました。

でもこのNodeはその場で計算してしまえばよいですね。

あんまり覚えておく必要はないかもしれません。

後、このNodeはNormalize した長さだけ計算して最初と最後の位置は関係ないみたいですね。

Tutorialのでも近い処で赤く、遠いところで緑になっていましたから。

2.3 Flip Fluid in UE5 Niagara Tutorial | Download Files [2]を見る

正直、今週のNiagaraの勉強はもう十分だと思っていますが、最初にこれもやると言ってしまったので、見るだけ見る事にします。

実装は来週やります。

まず軽く全部見ました。Flip Fluidの使用方法についての解説でした。

兎に角、凄いです。圧巻でした。

これは勉強するしかないです。

まず、Tutorialの手順を以下にまとめます。

新しいLevelを作成して以下のCharacterを追加しています。

このCharacterは持っていませんので代わりのCharacterで代用します。

このPluginを使用する必要があるそうです。

はい。

NSにTemplateを追加する時ですが、いつもと違いNew system from a template or behavior exampleを選択し

そして以下に示したGrid 3D FLIP Hoseを選択します。

このNSを開くと以下の様になっているそうです。

Preview画面です。

Emitter画面です。

Emitterは2つあるそうです。

うーん。自分で確認したい。

でもやりたい気持ちを抑えて熟成させるのも大切です。今週のNiagaraの勉強は既に十分やりました。ここは抑えて見るだけにします。

ここからFlip Fluidに使用されているModuleのParameterの解説に入ります。

まずUser Parameterです。

User ParameterのShow BoundsにCheckを入れます。

すると以下に示した様にPreview画面にBoundsが表示されます。

次に最初のEmitterに行きます。

Emitter Summaryを選択します。

Collusionの欄に以下の項目があります。

Open Boundary Upが選択されています。

更にOpen Boundary Rightを選択します。

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

これは右側のBoundaryの壁が開き、液体がそのまま流れています。

ので以下の様にセットすると液体は地面と衝突しますが貯まる事はなくなります。

こんな結果になります。

今度はParticles Spawn SectionのSet Particle Velocity Moduleを

消します。

結果です。

液体が真下落ちる様になりました。

次にParticles Spawn SectionのSphere Location Moduleを外します。

そして代わりにStatic Mesh Location Moduleを追加します。

Sample Static Mesh Moduleの

Preview MeshとDefault Meshに先程のCharacterをセットします。

このCharacterのSizeは今のBoundaryの設定よりも大きいのでBoundaryの設定を直す必要があります。

またUser Parameterに戻ります。

World Grid Extentsの値を変更します。

以下の値に変更しました。

あ。

これは私のPCでは動かない気がしてきました。

Previewの画面でも以下の様に凄い事になっています。

そしたら何と、今作成したNSをLevel上に配置してしまいました。

うーん。確かにこれでもStatic Meshなら有なのか?

今度は液体の色を変えます。

今度は最初のEmitterのRender SectionのMesh Renderer Moduleを選択します。

すると以下のMaterialを使用しているのが分かります。

このMaterialをCopyしたのを代わりに加工します。

Base Colorを赤にします。

Opacityを1にします。

Metallicは0.2にします。

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

もうBoundaryを表示する事はないので、User Parameterの

Show BoundsのCheckを外します。

以下のParameterの値についての解説がありました。

Num Cells Max…の値を上げるとResolutionが高くなるそうです。

次にRender Moduleの3つのParameterについてです。

Render Grid Resolution…についてです。

これはRenderのResolutionの大きさを決めるParameterだそうです。

SDF Particle Size Multについてです。

これの説明が非常に分かり易かったです。

液体の表現ですが、Particle同士が近かったらMergeします。

この近さとはParticleのサイズに負っているそうです。

以下の様にParticleのサイズが大きかったらMerge出来る距離も大きくなります。

このParameterはParticleのサイズを変える事でParticle同士がMerge出来る距離を決定しているそうです。

最後のParameterはSDF Smoothing Radiusです。

この値を上げるとSmoothさが追加されるそうですが、Tutorialに表示された結果を見る限り変わってない様に見えます。

今度はこの液体がCharacterと衝突するようにします。

まずLevel上のNSを選択します。

そしてそのNSのDetail欄にあるStatic Mesh CollisionのTagにColliderと書きます。

今度はCharacterを選択してそのDetailのTagにColliderをセットします。

すると以下に示した様にCollideするようになります。

以上でした。

Flip Fluid in UE5 Niagara Tutorial | Download Files [2]を見た感想>

思っていたより3倍位、知らない内容がありました。

今週は敢えて、Tutorialを見るだけにして実装は来週に回したのは正解でした。実装する前に理解する必要がある内容が結構あります。

一週間掛けて、この内容を消化して、来週の実装を行いたいと思います。

3.Materialの勉強

3.1 先週の続き

先週、Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [6] を実装しました。その中で以下の2つの理論が良く分からなかったです。

  • 定常の滴の計算
  • SRGBを外した時の設定

これらについてもう一回考えてみる事にします。

<定常の滴の計算>

以下のPowerの計算が良く分からなかったんです。

普通、Powerを掛けると以下の様になります。

-1~0の間は、偶数と奇数で結果が異なるので今は無視します。0~1の間の場合、

Powerの値が1以上の場合は黒さが強調され、0~1未満の場合は白さが強調される結果になります。

つまり先週の例で言うと、Power(x, 10)を計算しているのだから、黒さが強調されるはずなんです。

しかし実際は結構白いんです。

以下の様に試しにFloorを繋げた場合、

こんな結果になります。

更に、この後でSaturateノードを繋げますが、その結果を見ても

Floorを使用した場合より遥かに白いです。

この理由が分かりません。

この謎を検証します。

0未満の値は邪魔なので以下に示した様にSaturateノードを追加します。

あ。直ぐに理解出来ました。

Power(10)してSaturateした場合、0~1の間の値はそのまま残ります。

Floorした場合は、0~1の間の値は全部0になります。

これならFloorの方が黒くて当たり前です。

うーん。

当たり前なのか?

以下にPowerする前のSaturateの時の結果を示します。

白、黒、そして灰色しかありません。

これにPowerをしても灰色の部分が黒くなるだけじゃないでしょうか?

Power(x, 10)の結果です。

やっぱりその通りです。

この結果はFloorと全く同じであるはずなんです。

Floorの結果です。

白い部分が少ない。

あ、分かりました。

白い部分でも1じゃなくて0.9997みたいな部分もあったんです。そういう部分がFloorでは0に切り捨てられているんです。

だからFloorの方が白い部分が少なくなります。

逆にこれPower(x, 10)の黒い部分も本当の0ではなくて、0.0111みたいな値なんでしょうね。

だから0.9以上は白、0.9以下は黒にするNodeを使用すればもっと綺麗にこの値を出せると思います。

そうだ!

Roundノードを使用してみます。

結果です。

比較のためにPower(10)をしてさらにSaturateした値を以下に示します。

今度はほぼ同じ結果になりました。

あ。

このPower(x,10)の何が謎なのかがはっきりとわかりました。

今まで、私が勉強したMaterialの実装はPowerノードを使用する場合は、Power(x, y)のXの値は必ず0~1の間だったんです。だからPowerを使用すると必ず以下の様にContrastが強調される結果になったんです。

ところが、今回Powerノードを使用した箇所は、Power(x, y)の値は-1~1の間だったので Powerを使用する目的が分からず困惑したのが最初の謎です。

次に-1,0、1の3つの値だけが存在している所にPower(x,10)を掛ける意味があるのか?この意味も分かりませんでした。2番目の謎です。

更に、この計算だったらFloorノードを使用しても同じ結果になるはずなのにならなかった。これが3番目の謎です。

この3つの謎が解けないまま先週のMaterialの勉強は終わりにしてしまったんです。

今、この3つの謎はほぼ完全に解けたのでそれをここにまとめます。

まず、三番目の謎であるFloorノードを使用しても同じ結果になるはずなのにならなかった理由ですが、-1,0、1の3つの値だけが存在していると思っていたら実際には-0.995とか0.98とかのある程度の幅のある値だったんです。

これは私の推測ですが、元のTextureを作成した時に黒とか白とか灰色で塗った時に僅かにずれが有ったんだと思います。

それでFloorの時とPowerの計算の結果が変わってしまったんです。

もしTextureの段階で、0、124、255の3つの値だけでキッチリ作成されていたらFloor とPower+Saturateの計算結果は0~1の範囲は全く同じになったんです。

そしてこれが分かると次の2つの謎も同時に解けます。

次の謎の-1,0、1の3つの値だけが存在している所にPower(x, 10)を掛ける意味があるのか?ですが-1、0、1の3つの値だけが存在しているんじゃなかったんです。だからPower(x, 10)を掛ける必要が出て来ます。

もしFloorを使ってしまうと、0.98とかが0になってしまうのでPower(x, 10)とSaturateを使って0.98とかの値も白く残るようにしつつ0.5前後の灰色の値も黒くしたんです。

そして最初の謎である-1~1の間の値に Powerを使用する目的は、-1の値を+1に変換する事です。

でもそれなら別に10でなくても2でも4でも良い訳です。しかし2や4でPowerをしてしまうと2番目の目的を果たす事が出来ません。ので敢えてPower(x, 10)にした訳です。

そして最初の謎に繋がる何故-1の値を+1にする必要があるのかについてこれから検証します。

まずPower(x, 10)を計算する前です。

黒い部分があります。ここに注目して下さい。

Power(x, 10)を計算した後です。

なんと黒い部分は黒のままです。

ここでPower(x, 10)の解説です。

つまりxの値が0以下の場合はClampして0として計算します。と解説されています。

えー。です。

これじゃ今まで考えて来た事が全部ひっくり返ってしまうじゃないですか。

これは疲れた。

この問題は来週また考える事にします。

<SRGBを外した時の設定>

先週、TextureのsRGBを外したらTexture Sample ノードがErrorを表示しました。

以下の方法でErrorを直しましたが、意味を理解していません。

この辺を勉強して理解する事にします。

どのサイトがはっきりと書いている訳ではないですが、複数のサイトを読んでいるとsRGBとLinear RGBには以下の関係が成り立っているみたいです。

と言う訳でsRGBのCheckを外したらLinearになるのはあってそうです。

これ以上の資料が見つからないです。

3.2 Stylized Materials Packの実装を見る

今週は、正直もうMaterialの勉強に疲れてしまってしまってこれ以上やりたくないです。

のでBen Cloward先生のTutorialの勉強は一端やめて、Stylized Materials Packの実装でも読む事にします。

Fresnel Function ノードです。

これは後回しにして、結果だけ確認します。

真っ黒ですね。

One Minusノードを追加しています。

当然、真っ白です。

次はPowerノードを使用しています。

いやいや、こんなPowerノードの使い方ある?

それともPowerノードにはまだ色々な使用方法があるとでも言うんでしょうか?

今週はもうPowerノードを見るのは嫌です。

ので以下の事をする事にしました。

3.3 Stylized Materials Packと同じようなMaterialを自作してみる

以下のMaterialがFresnel Functionを使用している事さえ分かったら同じ様なMaterial、自作出来そうです。

ので今週は、元のCodeは見ないで自作してみる事にしました。

まずは以下の様にしました。

FresnelはFresnel FunctionではなくFresnelノードを使用しました。Inputの値は適当です。

Saturateした後の結果です。

これにLerpノードで黒い部分は白を、白い部分は以下のTextureを使用するようにしました。

結果です。

うーん。いけそう。

値を微調整しました。

もっと中央は白くして線が見えない様にします。

かすれた線が長すぎる気がします。

単純にFresnelの結果を2倍にして1を引きました。

結果です。

かなり良い感じがします。

今度は黒い線をもっと濃くします。

Lerpの後にPowerノードを追加しました。

結果です。

かなり良いですね。

これに輪郭線も追加してみます。

いつも勉強しているPPLineDrawingをPost Processで追加しました。

Edge Line以外で輪郭線を出して、Crease Lineは以下の様に値を変更して作成しました。

うーん。

線が薄い部分があるのとまだ線が太すぎるのを調整出来たらこれでOKでしょう。

色々な角度から見てみます。

灰色の部分は汚く見えますね。

後、手書きに比べると書き込みが足りない気がします。

サイズによってはこれでも良い気がします。

LODによって書き込み量を調節する必要がありますね。

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

4.RPGEventの作成

4.1  先週、実装したEventのBug出し

Eventの表示そのものには問題はありませんでした。

ただしStart 画面からMap1に移動した時にSub Levelが生成されるまで3秒位かかりました。

この部分は直す必要があります。

と言うかMap1のLandscapeは全部直したいです。

後、ずっと直せなかったStart 画面のPortionの影を表示出来る様にしました。

因みに直す前の状態です。

そしたら以下の警告が表示されるようになりました。

うーん。

これの直し方でも調べますか?

公式のForumsのObject has overlapping UVs [5] に直し方が書かれていました。

これ読んだら、どうも今直したMaterialの事が問題じゃないみたいです。

調べたら机の上のおいてある水晶玉がこのErrorの元でした。

はい。

公式のForumsのObject has overlapping UVs [5] に載っている直し方はまた後で勉強するとして今回は以下の方法で直しました。

Errorは消えました。

これだけだと少ないのでもう少し何かやります。

Spot lightを更に一個追加して点滅させてみました。

キャラクターが見えます。

Characterが消えました。

実装方法は以下の様にしました。

何の工夫もないです。

4.2 来週の予定

Eventを完了した時に表示されるWidgetを作成します。

そのWidgetを武器を手に入れた時に表示出来る様にしたらEventは完成です。

5.Open Worldの検証

5.1 先週の復習

先々週までの勉強で一応、World Machine やGaeaなどの3nd PartyのSoftwareで作成した一枚、1009x1009のHeight Map並びにMaskを複数枚使用して4x4 km^2程度のOpen World(しかも解像度が1pixel = 1m である)を作成する方法を解明する事が出来ました。

ので次のStepとして、これからは以下の事について勉強するとまとめました。

そして先週は今まで勉強したNaniteの復習をしました。

復習の結果、以下の事が分かりました。

Naniteは2021-12-13から2022-02-06頃までの約3カ月もの間、勉強していましたが、その大半を公式のDocumentであるNanite Virtualized Geometry [7]を読む事に費やしていました。

このDocumentはそれなりに大事な事を解説していましたが、かなりAdvanceな内容を含んでいたりしてNaniteを始めて勉強する人が読むべき内容でない部分がかなりありました。

それを最初に一生懸命読んだんですから、凄い時間を使った割には、望ましい成果を得る事は出来ませんでした。

それで、そのDocumentを読んだ後は、Naniteの簡単なTutorialをやる事にしました。一個だけやっています。

以上がNiagaraに関して勉強した事でした。

その結果、もっとNaniteのTutorialをやってNaniteそのものになじむのが大切であると考え、今週は以下の事をやる事になりました。

更に、Naniteのような最新の技術はやり方が頻繁に変わるので、最新のTutorialで勉強する事にしました。

5.2 NaniteのTutorialを探す

まずYouTubeで検索しました。

一番最初のRyan Laley氏の Unreal Engine 5 Tutorial - Create Nanite Meshes [8] は前回、勉強したやつです。

次のUpside Down氏のUnreal Engine 5 Tutorial-Naniteは3カ月前に作成されたかなり最近のTutorialです。だたUpside Down氏のTutorialはまだ一回も勉強した事ないのでどんなLevelのTutorialなのか、それ以前に信頼に足るTutorialなのかも分かりません。

その後にJSFILMZ氏のTutorialがずらっと並んでいます。JSFILMZ氏はNaniteに特化したTutorialを作成する人なんでしょうか?

これは要確認です。

JSFILMZ氏の以下のTutorialを見たんですが、5.1ではFoliageがNaniteでSupportされているそうです。

5.1っていつReleaseされたんですか!

それすら知らなかったです。これは後で見る事にします。

この後もJSFILMZ氏のTutorialを見たんですが、Naniteだけで11本動画を上げていました。

5.3 JSFILMZ氏のNaniteに関するTutorialを簡単にまとめる

JSFILMZ氏のTutorialを見ればNaniteの初期から現在までの進化が一発で分かるはずです。

これを見て現在のNaniteまでの変化を勉強します。

unreal engine 5 how to enable nanite [9]

JSFILMZ氏のNaniteに関しての一番最初のTutorialです。

JSFILMZ氏は名前の通りFilmを作成するのが目的みたいです。そのためにUnreal Engine 5 を使用しています。そのせいなのかRTX3090 を使用しています。動画中では解説していませんが他のPartsも最高品質なのでしょう。

そういう意味では勉強したからと言ってそのまま使用出来る訳ではない技術が多々あるかもしれません。

ここではNaniteの使用方法について解説しています。

NaniteというかUE5が公開されて直ぐに作られたNaniteのTutorialで、最新の情報を教授してくれている感があります。

Unreal Engine 5 How to Nanite Skeletal Mesh [10]

Unreal Engine 5のデモが公開された時に、Skeletal MeshはNaniteで動かないはずなのに、このデモでは動いているんじゃないか?と言う意見があったんですが、そのやり方を示してます。

Skewed Meshに対してNaniteが使用出来ないので自然とSkeletal Meshに対してはNaniteの使用は出来ない場合がほとんどです。

このUnreal Engine 5のデモに使用されたSkeletal MeshはSkewed MeshではないのでNaniteが使用出来る訳です。

ただし、じゃこのModelで良いからSkeletal MeshにNaniteを使用するやり方を教えて下さい。と思う人達もいるので、その要求に対してのTutorialですね。

unreal engine 5 gameplay with nanite [11]

ここでは実際にNaniteを使用して作成されたLevel内でGame PlayをしてNaniteを試していました。

Tutorialとは一寸違うので省いても良かったんですが、実際に見たらかなり勉強になりました。

Decalが使用されている箇所にNaniteが効いていないのを、実際のGame Playから発見して、UE5からそれを確認したりしています。

あ。そうやってNaniteが効いていないのが分かるのか、とかそうやってNaniteが効いているのかどうかを確認するのかなど、かなり役に立つ情報が得られます。

unreal engine 5 burned forest nanite tutorial [12]

これは以下の有料のEnvironmentをNaniteにしてみた話でした。

途中まで見ましたが結構勉強になります。

このEnvironmentはWorld Partitionは使用しているんでしょうか?

World Partitionを使用しているのならこのTutorialを勉強したらWorld Partition + Naniteが出来る様になりそうです。

Realistic Arid Landscape with Nanite Unreal Engine 5 [13]

以下のLandscapeの紹介でした。

実際の地形を撮影して作成されているそうです。

うーん。確かにTextureに使用している写真は高品質ですが、このLandscapeは一寸ショボくない?

しかもWorld Partitionも使用してない小さなLandscapeだそうです。

Naniteに関しては何も勉強する事は無かったです。

Unreal Engine 5 Nanite Trees [14]

やっとここから最新のNaniteに関する話です。木にはNaniteが効かないと言う話ですが、どうなっているのでしょうか?

5.1の話ですね。

凄い。確かにTreeにNaniteが効いています。

更に凄いのが以下の質感を保っている事です。

凄いです。

Unreal Engine 5 Nanite Grass [15]

前の動画の続きみたいな感じで、今度は草を試しています。

凄いんですがこの草、動きが無いです。

これ設定のせいなのかまだ風でなびく草はNaniteで作成出来ないのか不明です。

後、これはRTX3060 で作成しているそうです。

RTX3060でもこれ位できるのなら、次に買うPCはRTX3060でも良い気がして来ました。

Unreal Engine 5 Nanite High Poly Trees [16]

現実にはあり得ない位、木を密集させてNaniteを試しています。

確かに凄いですが、このテストを行う目的が今一分からないです。

Naniteが効いていればこんなに木を生成してもPCがCrashする事はないというDemonstration的なものでしょうか?

Unreal Engine 5 Nanite Foliage with Wind [17]

基本的は前の草と同じなんですが、こっちは風になびいています。

Unreal 5.1 New Features Nanite Foliage [18]

やっと一番最新の動画に来ました。

5.1がGitでReleaseされたので、今までのFoliageにおけるNiagaraの動画をまとめてもう一回説明した動画みたいですね。

Naniteとは関係ないですが、この人もFoliageが正しく発音出来なくてすみません。って言っていました。Foliageってそんなに特別な単語なんでしょうか?

こっちはGameよりFilm撮影についての解説でした。ただしそれはそれで勉強になったし、かなり面白かったです。

<JSFILMZ氏のNaniteに関するTutorialを全部、見た感想など>

Naniteの情報が最新の情報に更新出来ました。

5.1になったら木や草もNaniteが使用出来る様になるみたいです。

後はNaniteに関する基本的な操作、MeshからNaniteに変更するとか、Level上からNaniteが本当に効いているのかを確認する方法とかが、何故大事なのか、動画を見てると良く分かりました。

Naniteの設定方法などについては一年前からあんまり変わっていないみたいです。

来週は、Naniteの基礎的な復習から勉強し直そうと思います。

まずはQuixelから岩などをStatic MeshとしてDownloadしてNaniteに変換したり、直接NaniteとしてDownloadしたりしてLevel上にNaniteととして配置する方法などを確認する所から勉強し直したいと思います。

6.Gaeaの勉強

今週もHow To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [19]のTutorialの続きを勉強します。

6.1 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [19]の続きを見る

先々週、水の追加の辺りで訳わからなくなったので、先週は分かる所まで自分で実装してみました。

その結果、

となって結果的に、水の追加のやり方も理解出来ました。

ので今週はその続きから勉強します。

丁度、ここからStep 2が始まりました。

Step 2ではTexturingを行います。

今週はこのStep 2を勉強します。

Lakeノードの後にFXノードを追加しました。

FTと名付けました。

これはTexturingのみに必要なNodeでUnreal に使用するためにExportする場合は、Lakesノードの手前のRiversノードからExportする必要があるそうです。

その理由はLakesノードの後だと以下の様な湖の箇所が平らになってExportされてしまうからだそうです。

この説明をKlaus氏は何回もしていたと思いますが、私がはっきりと認識出来たのは今回が初めてでした。

しかも川の設定をどうするかによっては更にその前のSnowfallノードからExportすべきだそうです。

Water Systemを使用して川を追加する場合は、SnowfallノードからExportすべきなんでしょうか?

Final Output Before Riverと名付けていました。

Riverノードの後でもExportしました。

Final Output After Riverと名付けていました。

FTにOutputを付けました。

LakesノードにもOutput、Lakesを追加しました。

LakesノードとRiversノードをCombineノードで繋げています。

これは何をしているのか分かりません。

解説を聞いたら分かりました。Depthのデータを集めているんだそうです。湖と川の深さのDataを集めています。

Combineノードの設定です。

Maxで混合しています。これだと標高が高い方が選択されると言う事でしょうか?

山に比べて川や湖の深さは取るに足らない大きさなので以下に示した様に何も見えません。

のでLVを使用します。

結果です。

川が見える様になりました。

こういう知っているけど直ぐには使いこなせないTechniqueってどうやったら使用出来る様になるんでしょうか?

ここでCommentが注入されていました。

LakesノードとCombineノードは以下の様に繋ぐ必要があるそうです。

前のLakesノードとCombineノードの繋ぎ方は間違えていたそうです。

うーん。

これLakeノードからCombineノードに繋いだ時に、前のTutorialでLakeノードにはDepthがないから云々って話を聞いた事を思い出していたんです。思い出していたんですがそれをCommentに書くほどの自信がなくてそのままにして次に進んでいました。

今、やっぱりそうだったのかと思いました。

ここで後々のためにRiverやLakeノードのFXノードを作成しておいても良いそうです。

こっちは三番目のOutputからFXを作成していますね。

いや、これは録画した時だからこれも間違っているはずです。

本当は2番目のOutputからFXを作成しないといけないはずです。

RiverノードのOutputはそのままで良いはずです。

RiverノードのOutputですがSnowfallノードのoutputとCombineノードで混合しています。

これは何に使用するんでしょうか?

Combineノードの設定はSubtractです。

雪が被った川の部分は川から消すんでしょうか?

これは実装する時に確認します。

と思って先に進んだら、解説で雪が被った川の部分は川から消す。と言っていました。

当たっていました。

今度はその結果とLakeの結果をCombineしました。

そしてこのCombineノードの名前をCombine_waterに変更しました。

このNodeの名前が変更出来るのは覚えていますが、このNodeの名前を変更するMeritって何なんでしょう?

前にGaeaからExportしたpng fileは名前がみんな同じだったのでUEでImportする時にえらい困りました。

ここでNodeの名前を変更しておくとPng Fileにした時に名前が変わるんでしょうか?

最後にこのNodeにPortを追加しました。

あ、

このPortを選択する時、どのNodeのPortかを聞いているはずです。

その時にこの名前の変更が役に立つのかもしれません。

SnowfallノードにもPortを追加しました。

今度はErosionノードにもFXノードを追加しました。

これは必要は無いですが、後でもっと細かいDetailを追加する時にあったら便利だから作成したそうです。

成程。

別にFXノードの数に制限がある訳ではないので、自分の気が済むだけ、何個でも作っておけば良い訳です。

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

成程。

計算Costの面から言ってもFXノードを沢山作っても問題ない訳です。

TutorialでFXノードを沢山作っておく利点をもう一個説明していますが、この意味が分かりません。

これは後で実装した時にもう一回、考えます。

新しいGraphを作成します。

Portalsを呼び出します。

やっぱりここでCombine Waterって表示されていました。

これがさっきCombineノードの名前を変更した理由だったんですね。

FTを選択してFXノードと接続しました。

Textureノードを繋げました。

さーて。

ここから分からなくなって来ました。Textureノードの使い方は全く覚えていません。

イキナリTipが表示されました。

ふーん。です。

具体的なやり方はこれからこのTutorialで教えてくれるのでしょうか?

ここでTextureノードにPortalを追加しました。

このTextureノードの結果をあらゆる所で使用するからだそうです。

それがTipで言っていた複数のTextureノードを使用するな。って事でしょうか?

はい。SatMapノードを繋げました。

まずSatMapノードで色付けをするんですね。

こんな色になりました。

あ。

思い出しました。

TextureノードはSatMapノードで色付けをするために必要なTextureを作成するんでした。

うーん。

前の勉強の成果も出ていますね。

草の追加に別のSatMapノードも追加しました。

当然、LibraryからはGreenを選択しています。

こんな結果です。

うーん。

でもこれどうやって草と岩の部分を分けるんでしょう。

はい。Combineノードでした。

CombineノードはUEのLerpノードのような機能もあります。のでCombineノードを使えば2つのSatMapノードの結果を指定した方法で混合出来ます。

前のGraphで作成したFXやPortのどれを使用するのかと思ったら、以下に示した様にFXにSlopノードを繋げてそれを使用しました。

結果です。

うーん。

凄い。

ここでTutorialは緑の色が気に入らないと色々なExampleを試しています。

ここでTipの登場です。

ふーん。です。

どうせ私はUEでMaterialは別に作成します。

まあ、Gaeaでの色の作成は参考程度にする予定ですので、そんなに真剣に選ぶ気はあんまりないです。

今度はWaterを追加します。

新たに又、Combineノードを追加します。

そのCombineノードの三番目のInput(UEのLerpノードのAlphaに当たる)にCombine Water Portを繋げます。

これは先が読めました。

このCombineノードのBのInputには先程のTextureにWaterのSatMapノードを繋げた結果が来ます。

さっきのCombine Waterノードの部分ですが、やっぱりLakesノードのOutputが間違っていました。

Tutorialではここで直しています。

あれ、何か予測したのと全然違う事をしています。

まずLakesノードにDepthのPortを作成しました。

それをFXノードで受け取ってCLUTerノードに繋げています。

ああ。

そう言えば前もこんな方法で作成していました。

CLUTerノードの色を決定しています。

うーん。でもこれを先程のCombineに繋いだらどうなるんでしょう。

湖のある部分だけしか色がつかない気がしますが。

繋いでいますね。

結果です。

うーん。なんで川まで色がついているの?

あ、分かりました。

LakesノードはRiversノードの後に繋がっているからです。

今度はCombineノードにPinを付けて

CLUTerノードの色を変更します。

結果です。

私から見るとそんなに変わってない気がするんですが、航空写真とかを頻繁に見る人からすると全然違うんでしょうか?良く分かりません。

今度はSnowを追加します。

もうやり方把握しました。

と思ったら、今度はSnowfallのPortをCombineノードのBに繋げています。

何で?

Combineノードの設定をMaxに変更しました。

結果です。

うん?何でこうなるの?

これは全く分かりません。

今週はここで終わりにしましょう。来週考える事にします。

7.雪山のMapの作成

Volumetric Cloudの勉強の続きをやっていきます。UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の続きを勉強します。

多分、先週の勉強で実装のほとんどの部分の理解が完了したはずです。

残りの実装を読んで、今週で全部理解してこのTutorialの勉強を終わりにしたいです。

7.1 UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の続きを勉強する

ここは簡単に言えば3D Textureの実装について勉強する部分です。

3D Textureに関しては2022-08-01のBlogで既に一回勉強しています。

更に2022-07-12のBlogUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20] を最初に勉強した時のまとめをしています。

これらを読み直すと、この部分の実装は既に勉強した内容で、今回特に新たに勉強すべき部分はありません。

一応、復習のために以下に簡単に解説します。

まず3d TextureのUVWをパスするためにWorld Positionノードを使用します。

ただし、UEのUnitはcmで雲はKmが基準です。

単位を統一するために1 km = 1 x 10^5 cm なので10^5で割ります。

UEはLevel上のDetailの数字が小数点6桁以下の場合、0と扱う為、この計算はLevel上のDetailで行う事は出来ません。ここでやる必要があります。

次のAddノードは時間による雲の変化を追加するためのものです。

今回は無視します。

Texture SampleノードのUVsに繋ぎます。

使用しているTextureが3D TextureなのでUVW値がパスされます。

その結果から1を引きます。

雲なので色がある訳ではないのでRのみの値を使用しています。

1を引くのは全部の値を-1~0の間にして、Cloud Texture Maskの値から引くためです。

どれ位の濃度でCloud Texture Maskの値から引くのかをParameterを掛けて決めています。

以上でした。

うん。これでUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の実装は理解しました。

7.2 今までのVolumetric Cloudの復習をします

なんかゴチャゴチャしてVolumetric Cloudを勉強する目的とかが曖昧になって来ているので一回整理するつもりで今まで勉強した内容をここに簡単にまとめます。

それでこれからどうするのかを決定します。

2022-06-26

この時はまだVolumetric Cloudが何なのか全く理解していません。

まだこの時は空一面に雲を作成する方法を模索していて、その一つの手段としてVolumetric Cloudが役に立つのではないのか?との期待からVolumetric Cloudを一寸勉強してみようとなりました。

Unreal Engine 5 Beginner Tutorial | Sky And Clouds [21]を勉強しています。

ここでVolumetric CloudはMaterialを使用する事を初めて知りました。

Unreal Engine 5 Beginner Tutorial | Sky And Clouds [21]は結構良いTutorialみたいです。

と書かれていました。

更に、まとめを読み返しましたが、今見てもかなり有用な情報が沢山あるTutorialでした。

2022-07-12

この週は、Volumetric CloudのMaterialについて初めて集中的に勉強をする事を決めた週でした。

World of Level Design社のUE4: Analysis of Volumetric Clouds and How to Use Them [22]とUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20] を勉強しています。

細かい点ですが

これ知ってショック受けていました。

<<UE4: Analysis of Volumetric Clouds and How to Use Them [22]のまとめ>>

ここで手動で雲をPaintする方法がある事だけ紹介されていますが、

その具体的なやり方は載ってなかったです。

このやり方は今でも分からないです。

後、地味に大切なEmpty なLevelから一個ずつ関連するActorを追加して空を作成する方法がまとめられているのがこのBlogでした。

<<UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]のまとめ>>

これは今日既にまとめているのでSkipします。

2022-07-18

Ben Cloward 先生のVolumetric Clouds - Building Worlds In Unreal - Episode 32 [23]を勉強しています。

こっちはVolumetric Cloudのコストの計測方法などに関するTutorialです。

正直、これは又勉強し直さないと理解出来ない部分が多々あります。のでここではまとめません。

2022-07-25

Ben Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]を勉強しています。

この週は単にTutorialの内容をまとめただけです。実装はしていません。

Volumetric Cloudの実装を3つのPartsから説明していますが、同じく3つのPartsで説明しているUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]とは全然違うように見えると書いています。

2022-08-01

ここで、Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]の実装をしていたら、想像していたのと全く違う結果になって混乱が始まったんです。

でも今見ると、本当に想像していたのと違う結果に成ったのかどうかは、視点を雲のはるか上に移して確認しないと分からないんです。それで実際は想像していた通りだったんです。

でもそれが確認出来る為には、Volumetric Cloudの勉強をやり直す必要がありました。

2022-08-08

ここでVolumetric Cloudに使用するMaterialの最低限の実装について検討しています。

その途中で、UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]に最低限のVolumetric Cloudに使用するMaterialが作成されていた事に気が付きます。

そこでUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]をもう一回勉強し直す事にしました。

後、雲の上から見るとVolumetric Cloudの全体の形状の確認が出来る事も発見しました。

2022-08-14

ここではUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]の3つのPartsの内の2つ

Cloud Volume DetailとFalloff Functionの実装を勉強していました。

あれ?

Cloud Texture Maskについての勉強をしていると思っていたんですが?

まあCloud Texture MaskとCloud Volume Detailは使用しているTextureが2次元と3次元の違いしかないので同じと言えば同じですし。

2022-08-22

先週の勉強です。

Volumetric Advanced Outputについて勉強しています。

<Volumetric Cloudの復習まとめ>

全体の流れと言うか、何が元々疑問だったのかが分かりました。

まず、このVolumetric Cloudの勉強を始めた目的です。

雪山の作成で、雪が降っているのにも関わらず、空全体を雲で覆う事が出来なかったんです。それでVolumetric Cloudを空に追加する事で、空全体を雲で覆う事は出来ないのかと調べたのが最初の目的でした。

Volumetric Cloudを調べている途中で、これは4.26からしか使用出来ない事が判明しました。

この時点で本当はVolumetric Cloudの検証は終り。になるはずですが、同時にVolumetric CloudはUE5でも注目されている技術で、勉強して必ず特になる技術である事も判明しました。しかもVolumetric Cloudを自作するためにはVolumetric Cloud用のMaterialを作成する必要がある事が判明しました。

のでVolumetric Cloudの勉強は継続する事にしました。

この時点で目的が変化しました。それまでの目的は、空全体を雲で覆う事でしたが、ここからの目的はVolumetric Cloud用のMaterialを自作出来る様に成る事になりました。

Volumetric Cloudに使用するMaterialを自作出来る様に成るためには、今あるVolumetric Cloud用のMaterialの仕組みを理解する必要があります。

ので、以下に示したTutorialを勉強しました。

そしてVolumetric Cloud用のMaterialに必要な最低限の実装を作成しました。

所が、それが上手く行かなかったんです。

それでTutorialを見直していたらUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]に、最低限のVolumetric Cloud用のMaterialの実装が既に紹介されていたんです。

それであれ?UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]は既に勉強したはずなのに、あんまり理解していなかったのか?となってもう一回勉強し直しました。

これがVolumetric Cloudの勉強の最初からの流れです。

7.3 これからVolumetric Cloudをどう勉強するのか?

はい。

取りあえずは先週からの続きで、Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24] を勉強します。これの実装を全部理解します。

ここが大切なんですが、UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [20]で理解した内容が既に身に付いている訳で、その知識と対比させながら勉強する事で、前回Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]を勉強した時よりもより深く理解する事が目的になります。

これをする事で、Volumetric Cloud用のMaterialの作成に対してより深い理解が出来るようになるはずです。

次にUnreal Engine 5 Beginner Tutorial | Sky And Clouds [21]ももう一回復習します。このTutorialの存在、すっかり忘れていたんですが、結構良いTutorialです。

その後で、Pluginで提供されている他のVolumetric Cloud用のMaterialの実装についても勉強します。

これが終わったら、

これを調べます。

そしてBen Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [24]をもう一回勉強し直します。

この時点で、かなりVolumetric Cloud用のMaterialの作成方法は理解が進んでいると思われるので、自分で一個作ってみようと思います。

Donut状の雲とか、ピンク色の雲とかでも自作してみます。

今週のVolumetric Cloudの勉強は以上です。

8.UI Designの勉強

今週は、今まで作成したWidgetのDesignをImproveします。

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

以下のWidgetは字がはみ出していました。

後で直します。

以上です。

9.Anime Renderingの勉強

9.1  今回の予定

今回、初めてのAnime Renderingの勉強として、10回程度ここで勉強する予定です。以下に勉強する予定の内容を書いておきます。

それではそれぞれの勉強をして行きます。

9.2 PPLineDrawingの検証

PPLineDrawingはUnreal Engineでイケてるイラストを描くためのノウハウ大放出! | UE4 Manga Anime Illustration Dive Online [27] で紹介されています。

今週はNormal Based Outlineの実装について勉強します。

以下の部分は先週勉強したDepth Based Outlineの実装と同じです。

そう言えばMaterialの所でToon Shadingの復習をしていたらBlur Sample Offsetsを使用していました。

このNodeを使用した場合、見た目は綺麗に整理出来るけど、

を追加する事が出来ないですね。

それぞれのやり方は一長一短がある訳ですね。

このMaskの意味は分かりませんね。

Scene TextureのOutput、Colorの値はVector3で何もしなくてもRGBになっているはずです。

比較対象のPixelからSubtractしています。

Crease Lineでは比較対象のPixelの値とDot Productしていました。

この辺の数学的な正しさってどこで勉強出来るんでしょうか?

Vectorの差を計算する時に、この場合は単に引き算をすれば良い。この場合はDot Productで計算する必要がある。みたいな。

その結果をClampしています。

Clampする上下の値は以下のInputで決定しています。

全部の値を足します。

この計算方法、前回の時も話しましたが、PositiveとNegativeの場合の差を打ち消し合って値は本当の差より小さくなってしまう時が有る気がしています。

後、4で割らないのも気になります。

最後の工程です。

ここで初めてAbsを使用して絶対値にして、その後でそれぞれの値を足しています。

むー。

差分の計算方法については少し考察したいと思います。

9.3 差分の計算方法についての考察

PPLineDrawingを勉強して正しい差分の計算方法とは何ぞや。という疑問が沸いて来ました。それについて考察します。

まずアニメ風のRenderingをするためには、輪郭線を抽出する事が絶対必要です。

しかしComputerは人間と違い曖昧な規準で輪郭を抽出する事が出来ません。Computerで輪郭線を抽出すると、アニメや漫画の線画とはかなり違う線を抽出します。しかもその抽出された線は、絵として観た場合、かなりショボい線になってしまいます。

PPLineDrawingでは、(私の推測ですが)その対策として色々な方法で輪郭線を抽出する方法を提供する事で、人間の曖昧な輪郭線抽出の基準を再現した訳です。

なので、正しい輪郭線の抽出とは、人間の曖昧な輪郭線抽出をより正確に再現する事が出来る事なんです。

これを前提にして差分の正しい計算方法を考える必要があると思います。

World Normalの差分を計算する時、Dot Productで計算するのか?単に引くのか?4つの差分の合計や平均はどう計算するのか?はその結果表示される輪郭線が、人間の持つ曖昧な輪郭線抽出の基準に近ければ近い程正しい計算方法になると私は考えます。

それに加えて以下の点も考慮する必要があるのかな。と考えています。

<数学的な正しさ>

計算科学、もしくは統計学電磁気学などではひょっとしたら正しい差分の計算方法、というか正しいVectorの計算方法って確立してるかもしれません。もしそうならそれに従うって計算した方が結果に一貫性が出るはずです。

<Parameterの値との一貫性>

個人的な意見ですが、Designerの人がMaterial InstanceからParameterの値を弄って輪郭線の補正をする時に、どのParameterを弄ると線がどういう変化をするのかに一貫性を持たせられる設計が大切と思っています。

予測不可能な変化をするParameterがあると現場のArtistの人達は混乱するだけだからです。

今日勉強したPPLineDrawingのNormal Based Outlineに関して言えば、以下のParameterがClampする差分の最大値と最小値を決定しています。

これはProgrammerの観点から言えば、非常に整合性があります。

しかしCodeを読めないDesignerの人がこのParameterを弄った場合、その結果に一貫性を見出すのは非常に難しいと思われます。

この辺を考慮して差分の計算方法を考えてみるのは価値があると思っています。

9.4 差分に対する考察

差分を計算するのに元にしているのはScene Depth とWorld Normal です。

私はこれに加えて、Custom Depthを使用したらどうかと思っています。がもっと単純に色の違いを比較したらどうでしょうか?

Basic Colorって以下に示した様にかなり輪郭線に一致しています。

輪郭線の抽出用のPost Process Materialを作成する時には、これも考慮します。

9.5 公式のDocumentStylized Rendering[25]の勉強

今週は先週やり残りした2番目のMaterialの実装を勉強しようと思ったんですが、

このInstanceの親Materialを見たら、先週勉強したMaterialと同じでした。

今週は、Foliageに使用されている以下のStatic Meshから

一番目立っている以下のStatic Meshに使用されているMaterialの実装を見る事にします。

Material以前に不思議なのは、このStatic Mesh常にCameraに向かって正対している事です。

これどうやっているんでしょう。

Materialを見て行きます。

使用しているMaterial Instanceを遡って親Materialを見つけました。

中を見て行きます。

PreviewのImageです。

実装です。

あらー。

もう答えを見つけてしまいました。

それでは実装を見て行きます。

まずMain Nodeです。

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

Blend ModeがTranslucentなのは分かります。

Two Sideになっているですが、ひょっとしてこのMaterial、Spriteみたく板に貼っているんでしょうか?

Emissive Colorから見て行きます。

Debug Modeの時は赤単色ですね。

その先にはColorize from mask channelsがありました。

この中身を見て行きます。

まずAlpha Color Blendを使用しない場合ですが、

Main Colorでお終いです。

Alpha Color Blendを使用する場合は、まずLerpノードが来ます。

Aの先は複雑なので最後にみます。

Bですが、

単なる黒で影を表しています。

Alphaですが、One Minusが来て

ここのTexture SampleノードのGに繋がっています。

このTextureのGを見ると

こんな感じです。

Aの先ですが、以下の様になっています。

このLerpノードのAlphaですが、Texture Sampleノードの

Rに繋がっています。

RのTextureはこんな感じです。

これだと先だけHigh Light色がつく感じでしょうか?

影が良く分からないですね。

因みにこのTexture、sRGBにCheckは付いていないですね。

次のOpacityを見ていきます。

Debug ModeのTrueは1ですね。

Falseの方を見て行きます。

Use Texture for Opacity ONLYノードがありました。

Trueの方はColorize from mask channelsで使用したTexture SampleのGに繋がっていました。

Falseの方を追っていきます。

Use Shadowノードに繋がっていました。

当然、簡単なFalseから見て行きます。

Control Opacity fade out rangeに繋がっていました。

最初の部分ですが

これはある距離を超えたら黒くなると言う意味ですね。

その結果と何かを掛けています。

Texture SampleのGでした。

こいつです。

距離が近い時は白をかけるので結果は変わらず、遠い時は黒を掛けるので黒くなって消えると言う事ですね。

Use ShadowノードのTrueの方ですが、

Use mask to create fake shadowに繋がっていました。

これを読んでいきます。

最初のMultiplyノードですが、

Texture SampleノードのGと繋がっていました。

次のNodeです。

この結果とTexture SampleノードのBが繋がっていました。

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

全体的にぼやっとしていますね。

この結果をMultiplyノードに繋いで、

もう一方には、先程計算した以下の結果がきて、

掛け算をしています。

黒い部分は0、白い部分はそのままになります。

書けた結果ですが、

確かに遠くに行くと白色が消えます。

今週はここまでにしてCameraに向かって対面する為の実装は来週、勉強します。

9.6 夏森轄(なつもりかつ)先生の Blender セルルック講座 ~ノード、輪郭線、法線転写、RGB分離~[26]

<法線転写(Normal Transfer)の続き>

今週は、先週作成したSuzanneの法線転写がない状態とある状態を比較して差を検証します。

たしかTutorialに法線転写の外し方が載っていたのでそれをまず勉強し直します。

ありました。

これの事ですね。

押しました。

うーん。これであっているの?

結果です。

Suzanneの顔の下半分にも光が当たっています。

法線転写がなくてもそんなに不自然な影は出来ていませんね。

思ったよりは影の境界線もSmoothです。

一応、これで法線転写も出来た事にして次に進みます。

<RGB分離>

ここでは影を身体、髪の毛、服と別々に入れて色を変える方法を勉強するそうです。

ただしこの方法はObjectを分離して別々にCell Look ノードを組めない場合のやり方だそうです。

これObjectを分離出来ると、UEにImportした時にCustom DepthをそれぞれのObjectに対して指定出来る(はず)なのでぜひそうしたいんですが、それが出来ない場合もあるってことなんでしょうね。

TutorialではTextureが一つにまとまっていてObjectが全て結合されたModelの場合はそれが出来ないと書かれていました。

このTextureの正しい配置自体が良く分かっていない私は、別々のObjectでも同じTexture上にUV展開した場合もTextureが一つにまとまっていると言うのか良く分かりません。

取りあえずやり方だけ勉強して細かい点はもっとBlenderに詳しくなってから理解する事にします。

RGB分離のやり方ですが、Textureを赤、緑、青と塗るそうです。

???

でも先程、Textureには既に色を塗ってしまったんですが、

これはBlenderではTextureを何枚も別に作成する方法が有るって事なんでしょうね。

Tutorialだと以下の様に塗っていました。

先にTutorialのやり方を全部見る事にします。

そしてShadingで先程作成したTextureを色マスクノードで呼び出し、RGB分離をします。そしてミックスNodeで以下に示した様に繋ぐそうです。

この結果を前に作成した実装の影の色を指定する箇所に繋ぐそうです。

こっちは法線転写と違って簡単そうです。

ちょっと自分でやってみます。

新しいProjectを作成してSuzanneを配置しました。

Textureを作成して以下の様にPaintしました。

Shading画面に移動します。

ここで作成したTextureを読み込む方法が分からなくて結構苦戦しました。

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

まず、作成したTextureをSaveします。

その方法ですが、Texture Paint画面で以下に示したImageを押すと開くBoxからSaveを選択します。

そしてShading画面に戻り、Image Textureノードを生成します。

生成したImage Textureに先程作成したTextureを読み込ませます。

そしてSeparate RGBノードを接続します。

以下の様にMixノードと繋ぎました。

Tutorialとは順番が違いますが、結果は同じはずです。

これ最初のMixノードのColor1にどんな色を追加すべきなんでしょうか?

取りあえず以下の様にセットしました。

結果です。

緑色が表示されないですね。

もう時間がないのでこの問題の検証は来週やります。

10.まとめと感想

今週は、MaterialでPowerノードのBaseが0~1でClampされているのを知らなくて全部考え直す必要がでてしまい、精神的な疲れが凄いです。

まあ、来週がんばります。

11.参照(Reference

[1] CGHOW. (2022a, June 9). UE5 Niagara #ScratchPad Module #3 | Spawn Count on Owner Scale [Video]. YouTube. https://www.youtube.com/watch?v=gWz4S0prECM

[2] CGHOW. (2022c, August 2). Flip Fluid in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=THVoI62WU8o

[3] CGHOW. (2022b, June 9). UE5 Niagara #ScratchPad Module #4 | LODs [Video]. YouTube. https://www.youtube.com/watch?v=mLxGuPUCh6g

[4] Epic Games. (n.d.-c. Emitter Update Group. Unreal Engine. Retrieved August 28, 2022, from https://docs.unrealengine.com/5.0/en-US/emitter-update-group-reference-for-niagara-effects-in-unreal-engine/

[5] Epic Games. (2022, March 11). Object has overlapping UVs. Unreal Engine Forums. Retrieved August 28, 2022, from https://forums.unrealengine.com/t/object-has-overlapping-uvs/8073

[6] Cloward, B. [Ben Cloward]. (2022, July 14). Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [Video]. YouTube. https://www.youtube.com/watch?v=Ftpf87brKWg

[7] Epic Games. (n.d.-b. Nanite Virtualized Geometry. Unreal Engine Documentation. Retrieved August 21, 2022, from https://docs.unrealengine.com/5.0/en-US/RenderingFeatures/Nanite/

[8] Laley, R. [Ryan Laley]. (2021, June 1). Unreal Engine 5 Tutorial - Create Nanite Meshes [Video]. YouTube. https://www.youtube.com/watch?v=YucYfUbazKY

[9] JSFILMZ. (2021a, May 26). unreal engine 5 how to enable nanite [Video]. YouTube. https://www.youtube.com/watch?v=wHp8e84je7U

[10] JSFILMZ. (2021b, May 29). Unreal Engine 5 How to Nanite Skeletal Mesh [Video]. YouTube. https://www.youtube.com/watch?v=0CVc2W2uoos

[11] JSFILMZ. (2021c, June 7). unreal engine 5 gameplay with nanite [Video]. YouTube. https://www.youtube.com/watch?v=K5FyZiPiRM8

[12] JSFILMZ. (2021d, July 16). unreal engine 5 burned forest nanite tutorial [Video]. YouTube. https://www.youtube.com/watch?v=qnPOdaWUxJI

[13] JSFILMZ. (2022a, May 1). Realistic Arid Landscape with Nanite Unreal Engine 5 [Video]. YouTube. https://www.youtube.com/watch?v=o1Arix9WLiY

[14] JSFILMZ. (2022b, June 6). Unreal Engine 5 Nanite Trees [Video]. YouTube. https://www.youtube.com/watch?v=lorFbw_dRqY

[15] JSFILMZ. (2022c, June 7). Unreal Engine 5 Nanite Grass [Video]. YouTube. https://www.youtube.com/watch?v=yKg6NxrWOgI

[16] JSFILMZ. (2022d, June 8). Unreal Engine 5 Nanite High Poly Trees [Video]. YouTube. https://www.youtube.com/watch?v=2krvh1uPSm0

[17] JSFILMZ. (2022e, June 15). Unreal Engine 5 Nanite Foliage with Wind [Video]. YouTube. https://www.youtube.com/watch?v=y2GSNmN77wY

[18] JSFILMZ. (2022f, August 21). Unreal 5.1 New Features Nanite Foliage [Video]. YouTube. https://www.youtube.com/watch?v=_oZF6bqXbjo

[19] Klaus. (2022, July 6). How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=ej2b-zWoYiM

[20] WorldofLevelDesign. (2021b, February 16). UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [Video]. YouTube. https://www.youtube.com/watch?v=aYxvN5cs-EU

[21] pinkpocketTV. (2022, January 14). Unreal Engine 5 Beginner Tutorial | Sky And Clouds [Video]. YouTube. https://www.youtube.com/watch?v=lYZoR3ZLD-o

[22] WorldofLevelDesign. (2021a, February 9). UE4: Analysis of Volumetric Clouds and How to Use Them [Video]. YouTube. https://www.youtube.com/watch?v=8XjEk-CP-kQ

[23] Cloward, B. [Ben Cloward]. (2021a, May 27). Volumetric Clouds - Building Worlds In Unreal - Episode 32 [Video]. YouTube. https://www.youtube.com/watch?v=dolfk2z4LDo

[24] Cloward, B. [Ben Cloward]. (2021b, June 3). Volumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [Video]. YouTube. https://www.youtube.com/watch?v=rEYojMx26T0

[25] Epic Games. (n.d.-a) Stylized Rendering. Unreal Engine Documentation. Retrieved June 19, 2022, from https://docs.unrealengine.com/4.27/en-US/Resources/Showcases/Stylized/

[26] 夏森轄(なつもり かつ). (2022, May 21). 【Blender】セルルック講座 ~ノード、輪郭線、法線転写、RGB分離~ [Video]. YouTube. https://www.youtube.com/watch?v=e1tFq5OoSY0

[27] Epic Games Japan. (2022, February 21). Unreal Engineでイケてるイラストを描くためのノウハウ大放出! | UE4 Manga Anime Illustration Dive Online [Video]. YouTube. https://www.youtube.com/watch?v=QuYIkSozV6w