UE4の勉強記録

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

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

<前文>

<トランプ元大統領の自宅が捜査された件に関する考察>

今、日本では自民党と旧統一教会の癒着の話題一色ですが、アメリカではFBIによるトランプ前大統領への家宅捜査の話題一色です。

大体、1~2週間前から書き留めておいた物をこの前文に貼っているのでFBIによるトランプ前大統領への家宅捜査の最新情報についてここで書いたとしても、このBlogを発表した時には話題遅れになってしまいます。

のでそういう事はあまりここには書かないで、時間の経過によって価値が無くならない話題についてまとめる事にします。

<<BindとProtect

トランプ前大統領はアメリカ合衆国憲法修正第5条は犯罪者だけが必要な権利で、無罪の人間には全く必要がないものと散々主張していましたが、このFBIの家宅捜査に関しては、アメリカ合衆国憲法修正第5条を根拠に黙秘を貫いています。

英語では、こういう自分の事を棚に上げて他人にだけ厳しい要求をする一貫性のない人をHypocriteと呼びます。

これに対してアメリカの左派言論界は、鬼の首を取ったような大騒ぎで「この件に関してトランプ前大統領は、Hypocriteでない可能性がありますのであまり攻撃しないで下さい。彼が実際に犯罪を犯している場合は、彼の言っている事と今やっている事に矛盾は生じません。」みたいな皮肉たっぷりのコメントで溢れています。

その中で非常に勉強になったコメントがありました。

それは法にはBind(拘束)とProtect(保護)の2面性があるという話です。

一端法律が制定されると皆がそれに従う必要があります。それがBind(拘束)です。しかし皆がそれを守る事によりProtect(保護)が生まれます。

例えば、赤信号は止まる。青信号は進むと言った単純なものでもみんながそれに従う、つまり赤信号は止まる。と言うBind(拘束)される事で、青信号の時は安全に交差点を渡れる。というProtect(保護)が生まれます。

このBind(拘束)とProtect(保護)は常に一体となっていなくていけないんですが、法律は作り方によっては幾らでもこの割合を変化させる事が出来るそうです。

例えば、先程の信号の例だと、特権階級の人が交差点を渡る時は、いつも青になるようにします。するとこの人達はProtect(保護)を受けるだけでその対価であるBind(拘束)を払わなくて済むわけです。

逆に、いつも赤信号になる人達も出るとします。するとこの人達は、交差点に来るために赤信号でずっと止まらなければならなくなります。つまりこの人達はBind(拘束)を払うだけでその対価であるProtect(保護)を受ける事が出来なくなります。

このBind(拘束)とProtect(保護)の問題は全ての法に存在する問題だそうで、我々のような立場が弱い庶民は法律の話になったら法律そのものについてよりもその法律の持つBind(拘束)とProtect(保護)が誰に負担を強いて誰に利益を提供しているのかに関心を持つべきなんだそうです。

そしてトランプ元大統領に代表されるアメリカ右派の連中は、常に自分達はProtect(保護)だけを得て、自分達以外はBind(拘束)だけを負担するように法律を制定、もしくは施行しているんだそうです。

こういう観点から良い法律と悪い法律を判断する考え方がある事は初めて知りました。

勉強になりました。

<<ロシアに核の秘密を売ったのか?>>

これも今、この記事を書いている段階では本当の事は分かりません。しかしもしそれが本当だとしても私は驚きません。

Fox Newsに代表されるアメリカ右派は、メキシコからの不法移民の時、不法にアメリカ国内に侵入した家族の乳飲み子を親から引き剥がしても何とも思わない連中です。そんな彼らがアメリカ国内の白人だけ大切に扱うわけないでしょう。彼らがアメリカ国内の白人に聞こえの良い事を言うのはそれが金や票になるからだけです。

Fox Newsに代表されるアメリカ右派の言論に踊らされた人達って結局は騙されているんですよ。

彼らは嘘ついている訳ですから、騙す対象であるアメリカ国内の白人に対して幾らでも気持ちの良い事を言える訳です。それを真に受けてそれこそ救世主の再来のように詐欺師を扱った訳ですから、その代償はとてつもない大きな何かを払わなくてならなくなるでしょう。

それがロシアに核の秘密を売った事だとしても私は驚きませんね。

<<悪いのは右派だけなの?>>

これも私は言いたい。左派の連中だってこの30年間、アメリカ右派の政治で得していたんです。特に白人で男性は。

今更、我々だけは別です。みたいな顔して出て来ても、はぁとしか思えないです。

お前らだって、先程の例で言えばメキシコからの不法移民の乳飲み子が親から引き剥がされて泣いているのを見て、ゲラゲラ笑ってたじゃん。

アメリカの国境が破壊されるって右翼の嘘を、嘘だと分かっていてもそのままにしていたじゃん。

アメリカに住んでいる白人がヨーロッパで迫害されて死ぬ思いでアメリカに逃げて来た時、先住民たちが「ここは俺たちの土地だからお前らヨーロッパに返れ。」て言ったのかって聞きたいです。

その先住民たちの子孫が、南米の独裁国からアメリカに逃げて来たら、アメリカに住んでいる白人全員で「ここは俺たちの土地だからお前ら南米に返れ。」って言って実行したじゃないですか。

今更、左派の連中が一寸だけ良い顔しても、はあ。としか思えません。

<<CNNだけ微妙に違うコメントをしている>>

トランプ元大統領の核兵器に関する機密書類を自宅に隠し持っていた言い訳ですが、大統領権限で機密を解除して持ち帰った。と言っています。

これ、CNN以外の左派のCommentでは、大統領に機密書類の解除をする権限はありません。しかもそれらの機密書類を持ち帰ったのって大統領でなくなった後ですよね。という意見が述べられていました。

ところが、CNNのCommentだけ機密文書を持ち帰ったのかどうかは問題じゃない。みたいな訳わかんない論理でトランプ元大統領の言い訳に反論していました。

CNNって左派の代表メディアみたいに思っていましたが、CNNって他の左派のメディアと比較してLevelが低いんじゃね。と思いました。

<<トランプ元大統領が家宅捜査された件を中々日本のメディアが報道しなかった件>>

CNNって他の左派メディアと比較してLevelが低い。と言う話をして思い出したんですが、日本のメディアも凄くLevelが低いんじゃと感じました。

元大統領を家宅捜査するためには、99%有罪で、しかもその証拠が自宅にある事が確実である場合にのみ可能だって、最初から散々アメリカのメディアが言っていました。つまり家宅捜査が入った時点でトランプ氏の有罪はほぼ確定しているんです。しかもそれが核兵器に関する機密文書だって言うんだから、これはアメリカの歴史始まって以来の大事件である事は間違いないんです。

下手したらアメリカの共和党が崩壊するかも知れない位の大ニュースなんです。

それなのにこのニュースが日本で報道されたのが家宅捜査が開始してから3日か4日後です。

日本の終わり方は半端じゃないと思いました。

トランプ元大統領の自宅が家宅捜査された件に関する私の意見をここにまとめてみました。

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

<本文>

1.今週の勉強について

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

  1. Niagara: CGHOW氏のTutorialをやる
  2. Materialの勉強
  3. RPGのEventの作成
  4. Open Worldの検証
  5. Gaeaの勉強
  6. 雪山のMapの作成
  7. UI Designの勉強
  8. Anime Renderingの勉強
  9. Niagara: CGHOW氏のTutorialをやる

2.Niagara: CGHOW氏のTutorialをやる

今週はUE5 Niagara #ScratchPad Module #2 | Custom Drag [1]を勉強します。

2.1 UE5 Niagara #ScratchPad Module #2 | Custom Drag [1]を勉強する

今回は、Scratch Pad内にサイズや色の違うParticleのみをDragする実装を作成するそうです。

こういう実際に使用出来る実装の作成も勉強になりますが、何かもっと根本的な内容のTutorialも欲しいと思っています。

個人の感想をここに書くと、このScratch Padって結局Niagaraそのものの実装を理解しないと分からないんですよ。

Niagaraの仕組みって以下のParametersに表示されているVariable(変数)に

指定された値をAssignする事で色々なVFXを実装しているんです。

このそれぞれのVariable(変数)が実際にどの機能に関係する値を保持しているのかを完全に把握する事は不可能ですが、例えばParticle ColorだったらParticleの色に関する情報を保持しているVariableだろうと推測は出来ます。

これを理解しておかないとScratch Padの実装になった時、何をしているのか全く理解出来なくなります。

しかし逆に言えば、この辺の説明を1分位付け加えるだけでTutorialはNiagaraの初学者にも格段に分かり易くなると思っています。

個人の感想は終わりにしてTutorialの続きを勉強します。

このScratch Padの実装のために新しいNiagara Systemを作成しました。

いつも通り、Fountain Emitterを追加します。

Particle Spawn SectionにあるInitialize Particle Moduleの

Sprite Size Modeを以下の様に実装して、2つの大きさのParticleを50:50の割合で生成します。

Uniform AOr BFloatはDynamic Inputの一種で、指定したAとBをDistribution Weightの値に応じて生成する機能を持っています。

以下に示したRandom Uniformと違い指定したAとBの値だけ生成します。

ここでParticle Update SectionにおけるDrag Moduleの

Dragの値を10に変更すると

以下の結果の様になります。

Screenshotでは分かりにくいですが、大きなParticleも小さなParticleも全く同じ様にDragされています。

これをScratch Padを用いてSizeに応じてDragの強さを変える実装を作成します。

まず以下に示した右端のボタンをClickしてShow Parameter ReadsとShow Parameter Writesを選択します。

その後でParticle Update SectionにあるDrag Moduleを選択して

このModuleで使用しているParameterを調べます。

Transient Physics DragとTransient Physics Rotational Dragの二つが使用されています。

このTransientというScopeがどこを指しているのかは良く分かっていません。Tutorialの解説を聞いて理解する事にします。

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

この位置で良いのかは分かりません。駄目な時は直します。

Scratch Padを開いてまず名前を変更します。

ここはDragに関する実装は作成しないで、Particleの大きさに関する実装を作成するそうです。

Map Get ノードにParticle Sprite Sizeを追加します。

でも、これってSpriteのSizeでParticleのサイズじゃないんじゃない?

コメントでも以下の様に言っています。

Tutorialを見るとお構いなしに続きを作成しています。

とりあえずTutorialに従って続きをやります。

Break Vector 2Dノードを追加しました。

このXの値をGreater Thanノードを使用してBと比較します。

BのTypeはFloatに変更しました。

そしてMap Getノードに繋ぐ事でScratch Pad ModuleからInput出来る様にしました。

この後の実装です。

このやり方は先週のTutorialでやった方法と一緒です。

Applyを押します。

Scratch Pad の実装は終わって、NSに戻って来ます。

まず今作成したScratch PadであるCustom Drag ModuleをDrag Moduleの上に移動させます。

そしてDrag ModuleのDragに以下の様な実装を追加します。

更にCustom Drag ModuleのMy Sizeに1.0をセットします。

結果です。

Sizeが1より大きいSpriteにはDragが10掛かっています。

Greater Thanなので1以上じゃないです。1より大きい値です。

これ英語だけや日本語だけで考えている時は絶対間違えないんですが、英語から日本語、もしくは日本語から英語に訳すときにGreater Thanを以上って言ってしまう時が多々あります。

Less Thanは未満と言う適切な言葉が有るんですが、Greater thanにそのままあたる言葉はないので訳すのが非常に面倒な言い回しです。

後、Scratch Pad Moduleの実装でInput ParameterをGet Map Module内に作成しましたが、

これがCustom Drag Moduleの

Selectionに表示されて

値をここで指定出来る事はTutorialで解説してほしかったです。

この後、Tutorialは色々調整して以下の様なVFXを作成しています。

が、あんまり本筋とは関係ないのでこれはSkipします。

以上でした。

2.2 もう少し何かを勉強する

これだけだと一寸短いのでもう少しだけ何かを勉強する事にします。

Niagara Systemの基礎の勉強に集中しすぎたので、今度はUE5のNSで最新の機能について勉強する事にします。

Content Exampleを見てたら、そう言えば昔、UE5に新しく追加されたSampleを一通り見たのを思い出しました。調べたら2022-04-18のBlogでCGHOW氏がUE5に新しく追加されたSampleを一通りReviewした UE5 Content Example | Niagara Fluids | Chaos Destruction [2]を勉強していました。

これを見直すと

  • Fluid Simulation
  • IK Rig
  • Chaos Destruction

の3つが紹介されています。

じゃ、これらのどれかを勉強しようかな。と思ったらFluid Simulationは私のPCでは計算出来なかったと書かれていました。

うーん。

じゃこれらは新しいPCを買ってから勉強します。

そう言えば先月新しいPCを買おうと思って値段を調べたら余りにも高くて買うのを止めたんですが、以下のPCの値段はどうなっているんでしょうか?

安い!

凄く安くなっています。

これは待って正解でした。

上記のUE5の最新のNSは新しいPCを買ってから勉強します。

それで色々なTutorialを見たんですがClouds in UE5 Niagara Tutorial | Download Files [3] を勉強する事にしました。

一番最初にCGHOW氏のTutorialを勉強した時、UE4でこれと全く同じEffectのTutorialを実装したはずです。

しかもその時、雲の色が光を当てても変わらず、そのやり方が分からないで断念した記憶があります。

調べたら2021-08-022021-08-09のBlogで勉強していました。

読み直すと結構、苦労しています。

まずこのTutorialで使用されているModuleと今のNSのModuleが全く違うので同じ機能を追加するために別なModuleを探して使用しています。

そしてとうとう怒りのコメント

しかも以下に書いたように、雲を光らせる事が出来なくて

最後に断念しています。

しかしこのTutorial、CGHOW氏のTutorial集の一番最初にあるのでほとんどの人がこれを最初に勉強すると思うんですが、

いきなりSub UVを使用しています。

これはNiagaraのVersionが古くて今のNiagaraでは再現出来ない事を除いても、初心者にはかなりLevelが高く挫折しやすいTutorialでしょう。

2.3 Clouds in UE5 Niagara Tutorial | Download Files [3] を勉強する

まず軽く全部見ました。

雲を光らせる部分ですが、何か所か今まで見た事がない設定を弄っていました。これをやったら雲が光るんだと思います。

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

まずNSを作成します。

Render SectionにあるSprite Renderer Moduleの

MaterialにM_Smoke_subUVをセットします。

これSub UVを使用しているのでもう少し丁寧な解説をしてほしかったんですがTutorialは凄い勢いで先に進んでしまいます。

今回は別にSub UVの復習をするのが目的ではないのでTutorialの同じペースで勉強します。

Sub Image Sizeを以下の様にセットします。

Particle Update SectionにSub UV Animation Moduleを追加します。

Sub UV Animation ModuleのEnd Flameが63になっているのを確認します。

この後、Velocity Moduleなどを弄って以下の様にしました。

この辺は重要じゃないので記録しません。

EmitterのPropertiesの

Local SpaceにCheckを入れました。

確かLocal SpaceにCheckを入れるとNSがLevel上で動いたときに生成されたParticleも一緒に動くはずです。

今回のVFXにこれが必要なのか疑問が残ります。

一応後でこれが無い場合との違いを確認します。

TutorialでやっているようにLevel上に配置します。

小さい。

大きくします。

まずParticle Spawn SectionにあるInitialize Particle Moduleの

Uniform Sprite Size MinとUniform Sprite Size Maxの値を以下の様にします。

あれ。これってSpriteのSizeを決めていたっけ?

ここはParticleのSizeだと思ったんですが。

調べて見たら、Particleのサイズを変えるようなParameterは存在しませんでした。私がParticleのサイズを調節してるParameterだと思っていたのはSpriteのSizeを調節するParameterでした。

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

Particle Spawn SectionにあるShape Location Moduleの

Box Sizeを以下の様にしました。

結果です。

更に雲の発生量を増やすためにPropertiesの

Sim TargetをGPUに変更します。

勿論、Fixed BoundsにCheckも入れます。

そしてEmitter Update SectionのSpawn Rate Moduleの

Spawn Rateに5000をセットします。

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

もうこれで完成でも良い感じです。

ただし以下に示した様に枠から少しはみ出しています。

これをUser Parameterを使用して直します。

Particle Spawn SectionのShape Location Moduleの

Box SizeにUser Box Sizeをセットします。

すると以下に示した様にLevel上に配置したNS_CloudのDetailにBox Sizeが表示されます。

以下の値にすると

大体ぴったりします。

Play中の画面です。

中々良い感じです。

しかし以下の様に突然雲が消える時があります。

これはPropertiesのFixed Boundsのせいです。

数字を増やします。

結果です。

確かに雲が消える事は無くなりましたが、角度によってはちらつきが出ます。

雲の移動が観察出来ないので、Particle Spawn SectionのAdd Velocity Moduleの

VelocityのMaximumの値を100にし、

かつParticle Update Sectionの

Curl Noise Force Moduleを追加して以下の設定にしました。

結果です。

PCが凄い音しています。

私のPCではこれは結構きついかもしれません。

Emitter Update SectionのSpawn Rate Moduleの

Spawn Rate を2000に落とします。

結果です。

これでやる事にします。

EmitterをDuplicateします。

2つ目のEmitterの設定を変更します。

Particle Spawn SectionのInitialize Particle Moduleの

Sprite Size を以下の様に大きくします。

更にParticle Update SectionのScale Color Moduleの

Scale Curveの値を0.2に下げました。

そしてParticle Spawn SectionのAdd Velocity Moduleの

Add Velocityの値を変更しました。

結果です。

この辺はあんまり真剣にやる事は無かったんですが一応、きちんとやりました。

この後、NS_CloudのCast Shadowにチェックを入れています。

うーん。

何をCheckしているのか分かりません。

この後、Tutorialでは3つ目のEmitterも作成しているのですが、私のPCが持たなそうなので、これはSkipします。

やっと次に光の追加をやります。

一つ目のEmitterをDuplicateします。

まずPropertiesのGPUをCPUに変更します。

GPUはLight RenderはSupportしていないからです。

あ。

これ忘れていた。

Render SectionにあるSprite Renderer Moduleを消してLight Renderer Moduleをセットします。

要らないModuleは全部消しました。

Particle Spawn SectionのInitialize Particle Moduleの

Color Modeの設定を以下の様にしています。

まず、Random Hue/Saturation/Valueを選択しています。

そしてColorのVの値を10,000にしています。

更に Hue Shift Rangeも-1~1にセットしています。

この辺の設定は良く分かりません。

Vの値を10,000にしたらRの値が10,000になっています。

またRender SectionのLight Rendererに戻って

Affect TranslucencyにCheckを入れます。

これってひょっとして。

調べたら以下の説明が表示されました。

やっぱり。

これにCheck入れたら半透明なモノにもこの光の影響が現れるって事でしょう。

はい。とうとう雲が光の反射光を受けて光りました。

一年間の謎が解けました!

Tutorialでは最後にSprite Renderで使用しているMaterialのLighting Modeを

から

に変更しています。

Surface Forward Shadingでは

となるそうです。

結果です。

凄いんですが、私のPCでは処理が追いつかずカクカクしています。

以上です。

2.4 Clouds in UE5 Niagara Tutorial | Download Files [3] を勉強して

一年間も謎のままだった雲の光らせ方がとうとう分かりました。

まず一つ目は、Light Rendererを使用しているEmitterのParticle Spawn Sectionの

Initialize Particle Moduleの設定を以下の様にする事です。

当然ですが、光が強くなければ雲を反射光で光らす事は出来ません。

次にLight Renderer Moduleの

Affect TranslucencyにCheckを入れる事です。

最後に雲の生成に使用しているMaterialのLighting Modeを

Surface Forward Shadingに変更します。

一年前に作成したCloudのNSを見つけました。

この実装に上記の3つを変更させた結果です。

雲が反射光で光っているのが確認出来ます。

出来ていますね。

3.Materialの勉強

先週、途中で止めたと思っていたんですが、一応全部終わらせていました。ので今週はBen Cloward先生の次のTutorialであるRain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [4] を勉強する事にします。

軽く全部見ました。

カメラに水滴が着いたEffectを作成しています。

Unityで理論を解説していました。

実装内容は以下の非常に簡単なMaterialですが、

以下の関数を自作していて

この関数の実装が物凄く複雑です。

しかもUnreal では作成方法だけ解説していてその実装のものになる理論はあまり解説されていません。Unityによる実装でも元の理論についての解説はあまりないのかもしれませんが、見て確認する必要はあります。

3.1 Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [4] を見る

Unityの実装から見ると実装そのものが理解出来ない可能性があるので、まずUnrealの実装を見て、実装そのものは理解した後で、Unityの実装を見る事でその実装の元にある論理を勉強する事にします。

UnrealにおけるWeather Screen Dropsの実装を見る>

ここは何故、そんな実装をやるのかとかその計算の裏にある理論はどうなっているのか。とかは考えずに淡々と実装方法だけ見て行きます。

まず以下のTexture Sampleノードを使用しています。

ここに使用されているTextureはDownload出来るそうです。後でしましょう。

そのTexture SampleノードのUVsの計算です。

Screen Resolution ノードは画面のPixel数を返すNodeのはずです。1920 x 1080みたいな数字か返ると思われます。

Component MaskノードでXとYの値を分離しています。1920と1080になったんでしょうか?

それをDivideノードで割っています。1920/1080 = 1.777…ですね。

これにAppend ノードで1を追加して(1.777, 1)のVectorにしています。

その値をTexCoord[0]ノードで掛けています。

うん。

分かりました。これってTextureのサイズが正方形なので画面に合わせて変形しているんです。

でもこの計算だと横長になりそうです。

その後のMultiplyノードはTextureのサイズを調整しているだけです。

Texture Sampleノードの後の実装です。

RGとAlphaの値でRGBのVectorを作成しています。2を掛けて1を引いているのは、値のRangeを0~1から-1~1に変更したからでしょう。Normal Mapにでも使用するのでしょうか?

続きです。

やっぱりそうでした。

でもその後でMaskしてRGだけパスするなら何で最初にAlphaの値を足したんでしょうか?

Rangeを-1~1に変換したBの値は以下の実装で使用していました。

そのためにBの値も一緒に計算したみたいです。

そのNormalの値ですがNormalとして出力する前にMultiplyノードである値を掛けています。

この値はTutorialの説明によればMaskの値だそうです。

このMaskの実装を追います。

まずTexture SampleのBの値からTimeノードの値を引いています。これは時間による変化を出すためです。

ただ引くのが良く分からないです。いずれnegativeな値になってしまうんじゃないでしょうか?

その後でFracノードに繋いでいます。

Fracノードの機能って何でしったけ?

忘れてしまいました。

公式のDocumentであるMath Material Expressions [5] によると

と言う事だそうです。

つまり0~1の間の値を返すみたいです。

そこに-1~1の間の値に変換されたBの値にSaturateした値を掛けています。-1~0はSaturateされて0になり、残り半分の0~1の値はそのままのはずです。

うーん。

これが何を計算しているのか不明です。

Tutorialに説明がありました。

-1~1の間の値に変換されたBは元々はTexture SampleのAlphaの値です。何とこのAlphaには時間によって変化する滴と定常な滴の2つがAlpha値の違いとして保存されているそうです。それが-1~1に変換された時に0以下の値のモノは定常な滴、0以上の値は時間によって変化する滴なんだそうです。

それでこの実装の意味が分かりました。Bの値が-1から0の間の滴は計算結果が0になり、全くTimeノードの影響を受けなくなります。

となるとここまでの計算では定常な滴の値が0として計算されてしまっています。

定常な滴の分を別に計算して足す必要があります。

それを以下の部分でやっています。

まず定常な滴は-1から0までの値としてBに保持されているので-1を掛けてPositiveにします。

PowerノードはContrastを付けるための調整です。

そしてSaturateノードで0から1の範囲に調整して、時間によって変化する滴の計算結果と合わせます。

最後にこの計算結果と前に計算したNormal Mapの結果を掛けます。

以上です。

うん。Unrealの解説を聞くだけで実装方法だけでなくその元になっている理論も全部理解出来ました。

実装してみます。

3.2 Rain On The Lens Post-Process Effect - Shader Graph Basics - Episode 53 [4] を実装する

テスト用にそれっぽいLevelを作成しました。

ここにGlobal Post Process Volumeを追加します。

そんなActorは無いです。

どうやら普通のPost Process Volumeの名前を変更しただけみたいです。Post Process Volumeを追加します。

Post Process VolumeのInfinite Extent (Unbound)にチェックを入れます。

そしてPost Process MaterialにMaterialをセットします。

セットしたMaterialがきちんと働いているのか確認するために以下の実装をしてみます。

結果です。

真っ黒になりました。

効いています。

それではまずMaterialの実装からやっていきます。

まずこれから実装するMaterial Functionを作成しました。

以下の様になりました。

それではMF_Weather_Screen_Dropの実装を作成します。

まずTextureをImportしました。

中身を確認します。

Rです。

Gです。

一見、Rと全く同じかと思いましたが、影の方向が違いますね。

後、sRGBにチェックが入っています。

RとGの値は後でNormal Mapとして使用するのですが、これそのままで良いんでしょうか?

Bです。

おお、これはかなり違いますね。

そしてAlphaです。

ああ、成程。

黒い点が定常な滴、白い点が動く滴になっています。

Textureを追加しました。

このTexture SampleノードのUVsの実装から作成します。

これが画面にどんな影響を及ぼすのかを一寸確認したいです。

まず比較のために以下の実装をしたMaterialをPost Processに使用します。

結果です。

横に拡大してみます。

画面のサイズが横に拡大するにつれて、滴も横に広がっています。

もはや滴には見えません。

今回の実装の場合です。

結果です。

横に拡張してみます。

滴のサイズは変化しません。

代わりにTextureの繰り返しが増えました。

まあ、想定していた通りですが、実際にその通りになると結構感動します。

ただこの計算方法だと画面が横に広がる場合は対応出来ますが、縦に広がる場合は滴が大きくなるだけですね。

まずTexture SampleノードのRGの値からNormal Mapを作成します。

うーん。

ここでもsRGBからRGBに変換していないので元からTextureのsRGBの設定がOffなのかもしれません。後でTutorialのUnityの時のTextureの設定を確認します。

次にこのNormal Mapに掛けるMaskの実装をします。

動的にサイズが変化する滴のMaskから作成します。

先程のTextureのBの値ですが、以下に示した様にそれぞれの滴によって0から1の間の値が振り分けられています。

この値にTimeノードの値を追加する事で滴の動きがバラバラになります。

それがこのBの値の役割でした。

まず、Timeによって変化する滴の値を実装しました。

次に定常な滴がここに表示されないように実装を追加します。

TextureのAlphaは以下に示した様に定常な滴は黒で表示しています。

これが上記の計算では0になっています。

0を掛ける事で動的に動いている滴から消える訳です。

確認のためにSaturate ノードの結果を見たら

真っ黒です。

何で?と調べたら

Texture SampleのAlphaの値をBではなくAに繋いでいました。

直しました。

Saturateノードの結果です。

ああ、成程。

この計算によって定常な滴だけではなく滴が無い部分も値が0になるんですね。

今度は定常な滴のMaskを作成します。

ここはまず-1を掛けた結果から見て行きましょう。

この白い点が定常な滴です。

残りは要らないので黒くします。

ここでTutorialの実装ではPowerしてSaturateしています。

が、白い部分以外を黒くするだけなら、Floorノードを使用した方が早い気がします。

ので試してみました。

結果です。

あれ、白い部分が凄く小さくなってしまいました。

あ、それでPowerノードを使用していたんです。

Powerノードの結果です。

うーん。Powerノードは0~1の間の値にはContrastを付けるはずです。

これ-1~0の間の値はどうなるんでしょうか?

計算してみました。

うーん。これじゃ動的な滴も追加されてしまいます。

動的な滴は最低限の大きさがある。って仮定しているのかもしれませんね。

しかしAddノードを見ると

動的に点滅している滴のMaskが白くなる瞬間がありません。

と思ったら録画した映像にはありました。

これは、訳わからん。

次に行きます。

Maskの計算結果をNormal Mapに掛けます。

滴が消えたり現れたりしています。

これでMF_Weather_Screen_Dropは完成です。

Materialに戻って繋いでみました。

結果です。

うーん。まあ画面に滴がついているように見えなくもないって感じです。

最後にTextureのsRGBの確認だけします。

やっぱりsRGBのCheckが外れています。

ここだけ直します。

Checkを外しました。

何とTexture SampleノードがErrorになってしまいました。

こんな説明がされています。

Texture SampleノードのSampler TypeをLinear Colorにしろ。と言っています。

しました。

Errorは消えましたが、このSampler TypeはNormalなんじゃないでしょうか?

うーん。Linear Colorでも良いんでしょうか?

良く分かりません。

結果です。

あれ?

明らかに滴感が増しています。前の結果と比較するとかなりマシになりました。

うーん。定常の滴の計算箇所と言い、最後のsRGBの設定と言い良く分からない箇所がありますが、これ以上頭が回転しないので今週のMaterialの勉強はここまでにします。

これらの問題は来週、頭がすっきりしてからもう一回考える事にします。

3.3 Stylized Materials Packを見る

Anime Renderingに関係しますが、以下のPackが非常に興味深いので一寸だけ見る事にします。

これです。

2022-05-02のBlogに書いていますが、Toon Renderingで以下の様に影を付けましたが、

本当は、

こういう影が付けたかったんです。

どうやって作成したんでしょうか?

Materialを見ると以下の実装がされています。

そんなに複雑な実装ではないですね。

Fresnelと

Texture Sampleの

合成で作成しています。

Texture Sampleに使用されているTextureは

単なる線ですね。

流石に今、この実装を読む気力はないので実際に読むのは来週以降になりますが、非常に興味深いです。

4. RPGEventの作成

4.1 Eventの表示

一週間考えたんですが、以下の形式でEventを表示する事にします。

Eventが開始された時は以下のポーズ画面を開いてEventボタンを押すと

現在開始しているEventを表示するようにします。

以下の様にしました。

イベントを押します。

透明な画面が被っているので何が何だか分かりません。

Event画面が開くときは、Pause画面を一端消して、

Event画面を閉じる時にもう一回Pause画面を開くようにしました。

結果です。

閉じるを押します。

Pause画面に戻ります。

このEvent画面がEvent毎に変わる様にします。

後これとは別に、Eventが開始した時にEventが開始された事を知らせるWidgetを表示したいです。

最初のEventの開始はMap1に着いた時にします。

本当は会話の途中でEventを開始したかったんですが、それをやると会話を虱潰しに当たる必要が生じてUserに全ての会話を聞く事を強要する事になります。

のでかなり強引ですがMap1に初めて来た時にEventを表示する事にします。

出来ました。

以下のCodeを追加してこのWidgetを最初にMap1に着いたときだけ表示するようにしました。

更にEvent Start Screen Widgetに以下の実装を追加してPause Menuから開いた時とMap1に着いたときのボタンの機能の違いに対応しました。

4.2 久しぶりにRPGの実装をいじった感想

Eventの実装を追加する事自体は簡単なんですが、今まで書いた膨大なCodeがどうなっているのかが分からなくなってしまっています。

この部分のCodeを変えたらどこに影響が出るのかが不明になってしまいました。時間が空きすぎました。

もう何か最初から作り直したい気分です。Map1のWorld Compositionも今見るとかなり変な作りになっています。

まあ、今はコツコツやって行って最後にまとめてこれだけに集中して仕上げればなんとかなりそうではあります。

10分位Playしてみましたが楽しく遊べる事は遊べました。

5. Open Worldの検証

5.1 これからの課題

先週の最後で、これからは以下の事を勉強すると書きました。

この中でLandscape用のMaterialの作成方法とFoliageを使用した草や木の追加方法についてはやり方は既に分かっています。

Water Systemを使用した川や湖の追加、とNaniteを利用した岩の配置の方法が大体は分かっていますが完全には分かっていません。

<Naniteの復習>

まず今まで勉強したNaniteの復習からやる事にします。

Blogを見直してNaniteに関してどんなTutorialで勉強したのかとその結果、何を理解し何が実装出来る様になったのかについてを整理します。

量が膨大になるので別な節を作ってやる事にします。

<Water Systemの復習>

UE5におけるWater Systemを勉強した事があるのかは覚えていませんが、UE4のWater Systemなら勉強した記憶があります。

これも過去のBlogを調べて、どんなTutorialで勉強したのかとその結果、何を理解し何が実装出来る様になったのかについてを整理しておきます。

5.2 今まで勉強したNaniteの復習

過去のBlogを読み直して今までのNaniteに関して勉強した内容をまとめ直す。

2021-12-13

ここで初めてNaniteの勉強をしました。

公式のDocumentであるNanite Virtualized Geometry [6] を読んでその内容を簡単にまとめています。

この週はまだ最初の2つの節を読んだだけですね。

2021-12-20

Nanite Virtualized Geometry [6] の続きを読んでその内容をまとめています。

ここで気になる内容が書かれていました。

Naniteが使用出来ない条件に

Custom Depthが入っています。

これCharacterの輪郭線を出すために使用する予定だったんですが、CharacterにはそもそもNaniteを使用しないのでCustom Depthを使用しても大丈夫だと解釈しているんですが、どうなんでしょう?

後、Spline Meshも使用出来ない一覧に入っています。Water SystemってSpline Meshの一種だった気がしますが。

これも確認が必要です。

それだけじゃなくてMaterialに関しては以下の機能を使用する事も出来ないそうです。

Decalはあんまり勉強した事ないですが、近い将来勉強しようと思っていた分野です。

これDecalを使用したMaterialにはNaniteが干渉しないのか、そもそもDecalが一個でも配置されたらそのLandscape上ではNaniteが全く使用出来ないのかのどちらかなのかが分からないです。

前者だったらそんなに問題ないですが、後者だと結構大問題ですね。

2021-12-26

Nanite Virtualized Geometry [6] の続きを勉強しています。

今、Nanite Virtualized Geometry [6]を読みながら、Blogにまとめてある内容と比較しているんですが、Blogに書いてある内容とNanite Virtualized Geometry [6]の内容が微妙に違っています。

Nanite Virtualized Geometry [6]のNanite Fallback Mesh and Precision Settingsの内容の大部分は更新されて新しくなっているみたいです。

これは後で読み直す事にします。

ここでは、Nanite Virtualized Geometry [6]のNanite Fallback Mesh and Precision SettingsとPerformance and Content Issuesについて一生懸命まとめていますが、あんまり理解しているとは言えないですね。

そもそもこの辺の知識が無くてもNiagaraの基礎は使えそうです。

2022-01-10

Nanite Virtualized Geometry [6]のData Sizeを勉強してその内容についてまとめています。

と言うか全然まとめてなくて、何書いてあるのか全く分からんから一字一句訳してみます。と全部訳しています。その中で訳の意味が通じない部分を検証して多分、こう言う事を言っているのではと推測しています。

やっている内容は理解出来ますが、もう少しまとめてくれ。と読んでて思いました。

内容自体に関しては、多分こういう話をここではしているんだろうと言う推測までは出来ていますが、その推測が合っているのかは今でも不明です。というかこの部分、理解出来なくてもNaniteで作成する事に何の支障もない気がします。

Skipして良い内容だと思います。

2022-01-17

Nanite Virtualized Geometry [6]の残りの節であるVisualization ModesとConsole Variables and Commandsについて勉強しています。

今、Nanite Virtualized Geometry [6]を見直すと、Visualization ModesとConsole Variables and Commandsの間にAuditing Nanite Contentと言う節が有るんですが、これについてのまとめはありませんでした。

Visualization ModesとConsole Variables and Commandsは前の2つの節と違ってNaniteを使いこなすためには勉強して使用方法を理解しておく必要がありそうです。

<ここまでのまとめ>

何かNaniteはえらい沢山勉強した記憶が有るんですが、その割にあんまり成果が出なかったというかあんまり理解していないんです。

これBlogをまとめてその理由が分かりました。

Naniteの勉強のそのほとんどの時間は公式のDocumentであるNanite Virtualized Geometry [6]を読む事に費やしていたからでした。

このDocument、読んでおいて損はないですが、絶対読まないとNaniteが使用する事が出来ないと言うものでもありません。更に後半部分の内容はNaniteの使用を一通り経験した後でないと理解出来ないようなAdvanceな内容がかなりあります。

これをNaniteを全く使用した事ないのに全部理解しようとしたんですから、大変なのは当たり前です。

まあ、でもこういう勉強をしておくと、後で理解した時にああ、あの時読んだ内容はこういう意味だったんだと理解出来ます。ので全く無駄になったわけではないはずです。

2022-01-24

ここではNanite Virtualized Geometry [6]の勉強が終わったので、次はもう少し実践的なTutorialで勉強したいと言って他のNaniteのTutorialを探しています。

それだけです。

2022-01-31

 Unreal Engine 5 Tutorial - Create Nanite Meshes [7] を勉強しています。

前の週で調べたNaniteのTutorialの中で、一番良さそうなのを選んだみたいです。Ryan Laley氏のTutorialでした。

氏のYouTube Channelを見たらAuthorized Instructorって表示がありました。

これってどうやったら取れるんでしょう?

試験みたいなのがあるんでしょうか?

しかし久しぶりに。Ryan Laley氏のYouTube Channelを見たら非常に精力的に新しいTutorial SeriesをUploadしていました。

これは注目する必要がありますね。

肝心のTutorialを勉強した内容ですが、そのまとめを読むと結構面白いです。

例えば以下のMaterialの実装を見て、

こんな実装は初めて見た。とうろたえています。

ただ、今このやり方でNaniteの設定をするのが最適なのかは分かりませんね。World Partitionでも一寸前の設定方法と今の設定方法は全く違っています。Naniteの設定方法はもっと最新のTutorialで勉強し直す事にします。

2022-02-06

Unreal Engine 5 Tutorial - Create Nanite Meshes [7] の勉強内容とその前に勉強したNanite Virtualized Geometry [6]の内容を比較しています。いますが本当に一寸しかやっていません。

Naniteの勉強は以上でした。

<Naniteの勉強まとめと来週の予定>

今までNaniteの何を勉強したのかは分かりました。来週からはNaniteの最新のTutorialを探してそれを勉強する事にします。

5.3 Water Systemの復習

こっちはまとまって勉強した記録は出て来ませんでした。

これに関してはKlaus氏がWater System込みのLandscape作成用のTutorialを作成しているはずなのでそれを先に調べます。

以上です。

6.Gaeaの勉強

先週、 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [8]のTutorialを勉強したんですが途中で止めています。残りを勉強する事にします。

6.1 How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [8]を実装する

先週のBlogを読み直すと「もう何をやっているのかが分からなくなってしまった。のでここで終わりにします。」と書いてありました。

何の対策も無い状態で続きから始めてしまうと、この何も分からないまま最後まで勉強を続ける。と言う恐ろしい結果になる可能性があります。

それで先週勉強した箇所を先に実装してみます。

実装する事で、先週勉強した内容の理解が深まって、今週勉強する内容が全く分からない。となる事態を防げる事を期待しての事です。

それでは始めます。

一応、先週のまとめを参考にしながらもTutorialを見ながら実装する事にします。

まず以下のTipを見逃していました。

まあ一個でもKlaus氏のTutorialをやったらこの事は知っています。

以下の実装から始まっています。

取りあえずそっくりに作りました。

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

Tutorialを見るとPerlinノードの設定が細かく記録されています。

記録通りにセットしました。

念のためにTutorialでも確認します。

先週のBlogにまとめた以上の事はやってなかったです。

Perlinの結果です。

何か私のは山じゃなくて穴があいていますね。でもこれでやってみます。

Warpノードを追加した結果です。

先週のBlogには以下の様に書いていますが一応確認します。

あってました。

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

こんな感じです。

川が出来ているのか良く分かりません。近づいてみます。

出来てました。
Blogには以下の様に書かれていました。

しました。

結果です。

Terrainが変化した事は分かりますが、どう変化したのか具体的に言えと言われると言えません。

次にThermal Shaperノードを追加します。

LandscapeがFuseつまり溶けた感じになりました。

比較のために、Riverノードの結果を同じ位置からScreenshotにしました。

TutorialだとThermal ShaperノードのParameterの値を少しだけ弄っているので一寸だけ変更しました。

Shapeの値を変更する事でConcaveもしくはConvex な形状(凹凸のある形状)に変化出来ると説明されています。

これ少し試してみます。

ShapeがNegativeの時は、Concaveな形状(凹のある形状)になるそうです。

Shapeが-100の時です。

Shapeが100の時です。

確かにShapeが100の時の方が谷が無くなって全体的に平らになっています。

Shapeが-100の時は全体的になだらかになってはいますが谷は残っています。

どちらの値でも全体的にはなだらかになっています。

またWarpノードを追加します。

結果です。

おお。

Tutorialの例とは全然形が違いますが、Mesa(テーブル状の台地)が出来ています。

この上にTerraceとErosionを追加してMesaを完成させるそうです。

そのためにまずFractional Terracesノードを追加します。

結果です。

おお。段差がよりはっきり現れました。

この辺なんか地層が出来ています。

UEのBookmarkみたいな機能がほしいですね。

一端近づいて詳細を確認した後に前の俯瞰図を見る為の位置にパッと戻れると非常に楽です。

Terranceが多過ぎるので少し減らします。

TutorialではTerraceが多すぎなのかもしれませんが、私のTerrainは適切な気がします。

でもこれは勉強なのでTutorial通りにGradientノードでFractional Terracesノードの調整をします。

Gradientノードの設定です。

結果です。

うーん。Terraceが増えている気がします。

Tutorialで確認します。

うん。あってました。

GradientノードのClampのMaxはDefault値が100なのでその半分にしたからTerraceが減っていると表現していました。

後、Tutorialの例だとFractional Terracesノードを追加した時も別にTerraceが増えてないです。

これはSeedによって生成されるTerranceが変わるので傍目にはあまりTerraceが増えてなく見えるSeedもあるみたいです。TutorialではSeedの値を変えてTerraceを増やしていました。

後、Fractional Terracesノードの結果の変化をReal timeで見る為のPinの使用に関しては先週のBlogでまとめてあるのでここでは省略しました。

Erosionノードを次に追加します。

とうとうErosionノードの登場です。

結果です。

あれ、全体的に平らになってしまいました。

Erosionもそんなに見えないし。

あ、これがSedimentなのか。

Sediment Removalの値を40にします。

ErosionノードはApply Changes を押して初めて変化したParameterの値が適応されます。

結果です。

確かにSedimentが無くなってErosionがはっきりしています。

特に谷底の変化が顕著です。

Sediment Removalの値が40の時です。

Sediment Removalの値が0(Default値)の時です。

この結果を見るとErosionノードを追加する時は常にSedimentに気を付ける必要がありますね。

確認のためにTutorialを見たら以下のRandom Sedimentationの値を162にしていました。

ので同じようにしました。

結果です。

ただこのRandom Sedimentationの機能が分かりません。

GaeaのTutorialを勉強していて、機能を説明するBoxが表示されるようになるButtonか何かがあったはずです。

一寸調べます。

2022-04-11 から2022-05-23のBlogを見直しましたが見つかりませんでした。

ただGaea Beginner Tutorial Series : Part 1 – Interface [9] の復習が出来たので良かったです。

Gaea Beginner Tutorial Series : Part 1 – Interface [9] はGaeaのUIについての解説をしています。勉強した時は余りに退屈で非常に苦しかったんですが、Blogにまとめてある内容を今、読み返すと非常に役に立つ事が書かれていました。

これは後でしっかり復習すべきですね。

今勉強している How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [8]の勉強が終わったら、Gaea Beginner Tutorial Series : Part 1 – Interface [9] の復習をする事にします。

Random Sedimentationについてなんですが、公式のDocumentであるNode ReferenceのErosion [10]に解説がありました。

これは地学の知識がないと理解出来ないです。

一応、この文章を読んだ限りの理解で語ると以下の様になります。

まず前提としてSedimentation(沈殿)のProcessにはある種のランダムが関係しているみたいです。

これは川の底に沈殿物が貯まる場合を想像すると何となく理解は出来ます。

ただこのランダムが本来のErosionの場合はほとんど影響しないそうです。

え、そうなの。

川の底をイメージしたら流されてきた砂とかランダムに沈殿しそうなんだけど。

じゃあ、何で敢えてこのParameterを作成したのかと言うと、特殊な場合、例えば沈殿がある場所にしか起きないみたいな設定を追加した場合に必要になるからだそうです。

うん。

何となく分かりました。

でもこの解釈、最初の「Sedimentation(沈殿)のProcessにはある種のランダムが関係している」が地学的な観点から見て正しくないと成り立ちません。

のである程度理解出来たかも。位にしておきます。

次にErosionノードをもう一回追加します。

先週のBlogでも書きましたが、

Erosionノードを何回も分けて追加する本当の理由は分かりません。

ただErosionノードを追加したら以下の様に

折角、除去したSedimentがまた生成されてしまいました。

そこでBlogに書いたようにMinを押します。

これによって

となるそうです。

結果です。

確かに先程まであったSedimentが無くなりました。

比較のためにこのErosionノードの前の状態をScreenshotしました。

2つ目のErosionノードを追加した場合、山の部分の侵食が目立っています。

確かにTutorialの言っている効果は確認出来ました。

Tutorialの解説も聞き直しましたがBlogでまとめられている以上の説明は無かったです。

次に行きます。

次は雪を追加します。

そのためにSnowfallノードを追加しました。

結果です。

Terrainのほとんど全てが雪に覆われてしまいました。

Snow Lineの設定を25にします。

結果です。

これでもほとんど雪に覆われています。

Tutorialの結果と大違いです。

あんまりTutorialと違う結果になるのも嫌なので以下の設定に変更しました。

その結果です。

Blogに書かれているのでSettle-Thawの値も上げましたが

こっちは良く分かりません。

Tutorialでも確認してみます。

TutorialではSettle-Thawの機能についての解説は特にありませんでしたが、Intensityの値も弄っていました。

同じ様にしました。

公式のDocumentであるNode ReferenceのSnowfall [11]では以下の解説がありました。

と言う事は、SettlingとThawingの意味が分かればこのParameterの意味も分かる?

Thawingは雪や氷などの固体が溶ける事だそうです。

Settlingはその場に留まる事を意味する時もあります。

あ。これなら理解出来ました。

雪の溶ける割合を示すParameterでしょう。

それを理解してからSettle-Thawの値を0にしたり100にしたりして結果を比較すると100の時の方が雪の量が増えていました。

Blogに書かれた以下の解釈は多分、間違いですね。

Snowfallノードは雪を表すNodeですのでその下の岩の亀裂を管理するのは少しオカシイ気もしますし。

次にこの太陽光が当たる方向の雪を溶かします。

そのためにSun Light ノードを以下に示したように追加します。

ここでSunlightノードはSnowfallのMeltピンに接続する必要があります。

結果です。

あんまり変わっていませんね。

Blogを見たら以下の事を更にしていました。

やってみます。

結果です。

おお、今度は太陽光が右側から当たっているのが分かる位には雪の溶け方が違っています。

Tutorialの内容も一応確認したら2つ目のErosionノードにPin as Underlayを付けていました。

このPin as Underlayの機能は、さっきGaea Beginner Tutorial Series : Part 1 – Interface [9] の復習をしている時に出て来ました。

調べたら2022-05-02のBlogに以下の様に書かれていました

つまりSatMapsノードで色を追加する時の元のTerrainをこのNodeから使用すると言う事みたいです。

Tutorialでは更にSnowfallノードのSnowlineの値も少しだけ下げていました。

一応、少しだけ下げました。

結果です。

雪の量が増えました。

はい。最後にWaterを追加します。

まずRiverから追加します。

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

結果です。

次にLakeを追加します。

結果です。

どう見ても多すぎます。

Lakeの量を減らします。

ここから良く分からない部分です。

まず、RiverノードにUnderlay Pinを追加します。

そしてMaskノードをLakesノードのMaskに繋げます。

MaskのEditを押して

以下の部分を赤く塗りました。

結果です。

げ。谷底の水が無くなってしまいました。

更に中央の赤い印をつけた部分にはほとんど水が溜まっていません。

Maskをやり直します。

以下の様に塗り直しました。

これ一端塗った場所を消す方法が分かりません。

今度はこんな結果に。

うーん。

今週はここまでにして残りは来週直す事にします。

でも先週、訳わからなくなった水の追加の部分がそれなりに理解出来ました。来週やる時にはもっと理解が深まっていると思われます。

今週の勉強は結構、Gaeaの理解が深まりました。

7.雪山のMapの作成

今週もUE4: Step-by-Step to Creating Your First Volumetric Cloud Material [12]の続きを勉強し直す事にします。

7.1 Volumetric Advanced Outputについて

UE4: Step-by-Step to Creating Your First Volumetric Cloud Material [12]でまだ実装内容を理解していない最後の部分であるVolumetric Advanced Outputについて勉強します。

これです。

公式のDocumentであるVolumetric Clouds Reference [13] にVolumetric Advanced Material Output Expressionの説明がありました。

要するにVolumetric Cloudをもっと細かく設定出来るNodeであるって事です。

それは分かっています。

と思ったらそれぞれのInputについて詳しい解説がありました。

<Phase G

Phase Gは光の錯乱する方向を定義していました。

Per SampleのSampleが何を指しているのかが分かりません。と言うかPer Sampleじゃない時は、何を基準にして錯乱の方向を決定しているんでしょうか?

まあ、そうは言っても自分でこのNodeと同じ機能を持つMaterial Functionを実装する訳ではないので、この位の曖昧な理解でも問題ないでしょう。

<Phase G2

これPhase Gと全く同じ解説ですね。

<Phase Blend

成程。だからPhase GとPhase G2がある訳ですね。

となるとPhase Gで0、Phase G2で1を指定してPhase Blendで0.5を指定した場合と、Phase Gで0.5、Phase G2で1を指定してPhase Blendで0を指定した場合は、どちらのPhase も0.5になるという解釈で良いんでしょうか?

テストしてみます。

Phase Gで0、Phase G2で1を指定してPhase Blendで0.5を指定した場合です。

Phase Gで0.5、Phase G2で1を指定してPhase Blendで0を指定した場合です。

全然違う。

うーん。

ならばPhase Blendの値を0にしてPhase G2の値を色々変えてみます。

これは全く同じでした。

この後色々試したんですが、最初の考え方で合っている気がします。最初の例も一見全然違う様に見えましたが良く見ると結構そっくりです。

この考え方で合っていると信じて先へ行きます。

何とVolumetric Advanced OutputノードのInputの最初の3つの意味が既に解明出来ました。

これは全部理解出来そうです。

<Multi Scattering Contribution

これは全部理解出来そうです。

はい。

Successive Octaveって何の事でしょう?

他のMuti Scatteringの項目も全てこのSuccessive Octaveを調節しています。

OctaveってFrequencyを倍々したものを呼ぶそうです。Frequencyが2,4、6、8なのをSuccessive Octaveと呼んでいるんでしょうか?

この辺はもっと情報がないと理解出来ませんね。

Successive Octaveが何なのかを知っているのは常識みたく解説していますが、そのSuccessive Octaveを説明しているサイトが一個も見つからないとなると、これ以上の理解をするのは一寸無理です。

<Multi Scattering Occlusion

これもSuccessive Octaveが何なのか分からないと理解出来ません。

<Multi Scattering Eccentricity

これもです。

<Conservative Density

これも本当に理解するためにはVolumetric Cloudを作成するための式を知らないと無理です。

その式の中にMedium Conservative DensityというParameterがあるんでしょう。

このInputに関してはBen Cloward 先生のVolumetric Cloud Materials - Building Worlds In Unreal - Episode 33 [14] で実際に使用した例があるのでその実装を勉強する時に勉強する事にします。

8.UI Designの勉強

先週、作成した先攻後攻を決める演出をGameに組み込みます

選択した結果に応じて適切な次のEventを呼び出せるようにします。

このWidgetを今まで使用していた先攻後攻を決めるWidgetの代わりに生成するようにします。

今まで使用していたWidgetはMy Find First WidgetというVariableに保持されるような設計になっていました。

この変数がどこに使われているのか不明です。

ので検索で確認しました。

どこにも使用されてないようです。

これでGame中に先週作成された先攻後攻の演出が使用されるはずです。

テストします。

最初の先攻後攻を選択する場面です。

普通に表示されました。

先週作成した通りに動きました。

だだし右下にボタンが残っていたりカードにCursorをカードに合わせた時に色が変わるのがあまり目立ってなかったりしています。

この辺は後で直します。

戦闘が開始し次のターンになりました。

先攻後攻を選びます。

はい。

普通に選べました。

この後以下に示した様に魔法選択のWidgetが消えなくなってしまいました。

このBugを直します。

関係がありそうな実装部分をCheckしましたが問題は見つかりませんでした。

もう一回Gameをやってみました。

Stage 7までGameをやったんですが、このBugを再現出来ませんでした。

このBugに関しては後で検討します。

カードの選択に関しては以下の様に直しました。

左のカードがCursorを載せた時の色です。

これなら左が選択されている事はUserに伝わります。

後、ボタンも必要ないので消しました。

9.Anime Renderingの勉強

9.1  今回の予定

今回、初めてのAnime Renderingの勉強として、10回程度ここで勉強する予定です、

以下に勉強する予定の内容を書いておきます。

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

9.2 PPLineDrawingの検証

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

<Depth Based Outline

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

ぱっと見ですが、こっちは一般的なOutlineの抽出ですね。

まずここで、上下左右のPixelのScene Depthの値を取るための計算をしています。

Scene Texel Sizeを掛けてScene Depthの1Pixelのサイズに調整しています。

TextureのPixelだからTexelが正しい言い方なんですね。

Voxelは何かスッと納得出来たんですが、Texelは何かPixelとどう違うのか?何か同じな気がします。UVとXYのようなみんなが使ってるから何となく使用しているけどよく考えると同じじゃないという気がします。

次の部分で中心のTexelのScene Depthの値からの差分を取っています。

次にParameterで最大値を指定してClampしています。Clampの最小値は指定した最大値*-1でした。

特にCommentは無いです。

空とかの隣のObjectなんかは差分がとんでもない事になりそうですし。Clampしておくのは理解出来ます。

次は全部の差分を足します。

うーん。

ここが分からない。全部足したら±0になり易くなる気がします。絶対値取って足して4で割った方が差分が出やすくない?

そしてその結果をLine Shapeにパスしています。

むむ。

この計算だと理論上は-4~4の間の値がPassされると考えられます。

まずPowerですが、0~1の値をPowerした時はContrastを大きくします。

以下に例を示します。

1以上の値でPowerした場合は黒さがUpされ、0から1の間でPowerした場合は白さがUpしています。

しかし今回は0以下の値をPowerする場合もある訳です。

0以下の値をPowerした場合、以下に示した様に奇数と偶数で結果が全く変わります。

この後Clampして0と1の間の値へ変換していますが、これPassされた値がNegativeだった場合、Powerの値が奇数だったら全部0になります。所が偶数の場合は0にはならずにPassされた値がPositiveだった時と同じ値になります。

これだとPowerの値を指定する段階で奇数の値を入力するか偶数の値を入力するのかを考慮する必要が出て来ます。

更に1以上の値だった場合もPowerの性質がContrastを付ける。から単に指数的に値を大きくする。に変化します。

Passされた値が1以上だった場合、後でClampするのでPowerの値に関係なく全部1に収束します。

これ以外にもPassされた値が-1以下だった場合も考える必要があります。

この辺の問題を回避するために、上下左右の差分の絶対値を足して4で割った値をClampして、その後でPowerした方が安全な気がします。

うーん。

でもひょっとするとScene Depthの場合、ここで書いた内容は気にしなくて良いのかもしれません。

例えばScene Depthの場合、比較対象のPixelの左右のどちらかの値が比較対象のPixelと違う場合はあっても、左右両方の値が比較対象のPixelと違う場合はあんまり想像出来ません。

こういうScene Depth特有の縛りがあるのかもしれません。

良く分かりません。

この辺の疑問はもっとOutlineの抽出についての知見が高まったら理解出来るのかもしれません。

一応、今回はこんな疑問を感じたと言う事だけ記録に残しておいて、後でもっとOutlineの計算に対しての理解が高まった時に検証する事にします。

それ以外の点については特に理解出来ない部分も無いです。

以上です。

9.3 公式のDocumentStylized Rendering [15]の勉強

もう2,3個、Materialを見る事にします。

今週は以下の柵のMaterialを見てみます。

以下のMaterialが使用されていました。

最初のMaterialから見てみます。

結構複雑です。

ここは同じですね。

Falseから見ていきます。

<Mask & Color Wood

Mask & Color Woodです。

ここはいつものLerpノードを3つ使用して色とTextureをAlpha値に基づいて混合している部分ですね。

Lerpノードを順番に見て行きます。

まず最初のLerpのAlphaは距離による実装の変更です。

Bの遠い時は、

単なるこの色を使用しています。

近い時は以下のLerpの結果を使用します。

Alphaの実装です。

Mask Parameterノードは初めて見るノードですね。

DefaultではGにセットされていました。

Texture SampleノードにセットされているTextureを以下に示しました。

何か凄い芸術的なTextureです。

Gには以下の値が入っていました。

この白い部分つまり先程のLerpノードのBには以下の色がセットされていました。

そのLerpノードのAには最後のLerpノードが繋がっていました。

このLerpノードのAlphaにはSwitch Parameterノードが繋がっています。

これも初めて見るNodeです。

Default値ではTrueになっています。

Trueの実装を追います。

以下の実装がありました。

あれ、一つ前のLerpのAlpha値と同じ?

調べたら全く同じ設定でした。

多分Texture SampleノードのUV値がちがうんでしょうね。

このLerpノードのBには以下の色が、

そしてAには以下の色が

セットされていました。

<Creates UV Offset from number

Mask & Color Woodにあった二つのTexture SampleノードのUV値を計算する実装です。

こんな実装です。

Pannerノードがあります。TimeにWireが繋がれていると言う事は時間によってTextureが移動すると言う事です。

なんで柵のTextureは移動しないんでしょう。

TexCoord[0]ノードにParameterを掛けていますね。まあ普通のUV値ですね。それをPannerに繋げてその計算結果をTexture SampleノードのUV値に返しています。

下のTexture SampleノードはSwitch Parameterです。

DefaultではTrueにセットされています。

その場合のUV値は先程の上のTexture SampleノードのUV値と一緒です。

Falseの時は

を単に繋いでいます。

World Off SetがTrueだった場合、この2つのTexture Sampleノードは全く同じ結果になると思います。

<Creates a single number obtained from…

PannerノードのTimeの値を計算している部分です。

これ見るとTimeによって変化していませんね。それぞれのObjectの位置によって別な値が生成されることによって、MeshのMaterialの模様にずれをもたらす為の実装の様です。

<Create world vector for water height

最後に一番最初のSwitchノードでTrueを返した場合の実装を見て行きます。

Water Level Multiplyを使用した場合です。

最初のLerpノードのAlphaから見て行きます。

またLerpノードがあります。

World Position with Scaleノードは何をしているんでしょうか?

World Positionを入力された値で割っているだけでした。

そのObjectの配置されている高さによってA(0)になったりB(1)になったりするんですね。

その値がそのまま最初のLerpノードのAlpha値として返されます。

1の時はMask & Color of Woodで計算された値、0の時はMask & Color of Woodで計算された値にWater Level Darknessノードの値を掛けた値になります。

以上でした。

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

先週、色付けしたSuzanneに法線転写(Normal Transfer)を追加しました。

しかし結果を見ると法線転写出来ているのか分かりませんでした。

ので今週は、

をこのSuzanneに実装して本当に法線転写が出来ているのか確認します。

BlenderのSuzanneのProjectを開いたら以下のSuzanneが表示されました。

あれ、出来ている。

そうか。

以下の設定で白丸を選択したら上記のImageが表示されるんでした。

これを見るとSuzanneの鼻の部分が平らになっていませんね。

選択出来ていなかったんでしょうか?

確認します。

半球と法線転写したSuzanneの顔の部分のObjectを消してみました。

うーん。鼻の部分も消えていますね。

良く分かりません。

今週の目的のRGBミックスの実装をやります。

2022-06-192022-06-26のBlogに前に勉強したRGBミックスの内容がまとめられていました。それをまず読み直します。

要は以下の実装を作れば良いみたいです。

まずこれを作成します。

しました。

結果です。

顔の上部に関しては法線転写は出来ていますね。

顔の下部はいつも影になっています。

これでは見にくいので2022-06-26のBlogで勉強した

も追加で実装します。

ここに出ているMultiplyノードが見つかりません。

Tutorialを見直したらMix ノードとなっていました。Mixノードで探したらありました。

以下の実装になりました。

結果です。

Suzanneの顔の上部には目などの影は生じていません。

Lightを動かして見ました。

綺麗とは言い難いですが顔の上部は法線転写は効いています。

しかし顔の下半分はずっと影のままになっています。

うーん。

なんで?

来週考える事にします。

最後に折角作成したSusanneの色を塗ったTextureを使用して影の変化を見ようと思います。

以下の様に実装を組みました。

MaterialのNodeはBlenderとUEで違いますが、底の理論は同じなのでBlenderのNodeの機能を理解したら、どこにTextureを追加すれば良いのか直ぐに分かりました。

結果です。

うーん。前よりは見栄えが良いですね。

Lightを動かしてみます。

やっぱり顔の上半分だけ法線転写が効いていますね。

法線転写が無い状態との比較が必要ですね。

来週やります。

10.まとめと感想

今週は普段より集中していて普段の1.5倍位出来そうな勢いでした。あんまりやり過ぎるのも体に良くないので、途中からSaveして意識的に量を減らしました。

11. 参照(Reference

[1] CGHOW. (2022, June 8). UE5 Niagara #ScratchPad Module #2 | Custom Drag [Video]. YouTube. https://www.youtube.com/watch?v=8ogtukZWwkI

[2] CGHOW. (2022a, April 6). UE5 Content Example | Niagara Fluids | Chaos Destruction [Video]. YouTube. https://www.youtube.com/watch?v=TgYtTbHHoMs

[3] CGHOW. (2022b, June 13). Clouds in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=SrhS0075Qls

[4] 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

[5] Epic Games. (n.d.). Math Material Expressions. Unreal Engine. Retrieved August 21, 2022, from https://docs.unrealengine.com/5.0/en-US/math-material-expressions-in-unreal-engine/#frac

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

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

[8] 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

[9] Klaus. (2022a, January 12). Gaea Beginner Tutorial Series : Part 1 - Interface [Video]. YouTube. https://www.youtube.com/watch?v=H-vTeYYHJPM&list=PLyNtvXvNIFMMHnW1_-hXO3RNPp_Z5CExF&index=1

[10] Quadspinner. (n.d.-a). Erosion - Gaea Documentation - QuadSpinner. Gaea Documentation. Retrieved August 21, 2022, from https://docs.quadspinner.com/Reference/Erosion/Erosion.html

[11] Quadspinner. (n.d.-b). Snowfall - Gaea Documentation - QuadSpinner. Gaea Documentation. Retrieved August 21, 2022, from https://docs.quadspinner.com/Reference/Snow/Snowfall.html

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

[13] Epic Games. (n.d.). Volumetric Clouds Reference. Unreal Engine Documentation. Retrieved August 21, 2022, from https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/VolumetricClouds/VolumetricCloudsReference/

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

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

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

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