UE4の勉強記録

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

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

1.今週の予定

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

以下の2つを行います。

  • Runtime Virtual Textureを使用して岩のMaterialをLandscapeのMaterialと合成する
  • World Aligned Blendノードを使用してCliff Layerに別なMaterialを追加する

Niagaraの勉強>

今週は何をやるのかまだ考え中です。

Alignmentはもうやりたくないです。CGHOW氏の新しいTutorialを試すかもしれません。

<Materialの勉強>

Ben Cloward先生のIce Shader Part 2 - Advanced Materials - Episode 6 [1]を勉強します。

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

効果音の追加と販売促進のための戦略についての考察を行います。

<Gaeaの勉強>

今週もAndrea Cantelli氏のGaea Tutorial for Beginners #6 | Texturing our first terrain [2]の勉強の続きをやっていきます。

TextureというかMaskingの手法についての基礎をまとめる予定です。

<Houdiniの勉強>

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

<Volumetric Cloudの勉強>

DaVinci Resolveの使い方の勉強をやります。

時間が余ったらVolumetric Cloudを綺麗に見せるためのParameterの微調整も行います。

DirectXの勉強>

Olympus Mons Tutorials氏の C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [4]のCreating Olympusを実装します。

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

今週は以下の2つを行います。

  • Runtime Virtual Textureを使用して岩のMaterialをLandscapeのMaterialと合成する
  • World Aligned Blendノードを使用してCliff Layerに別なMaterialを追加する

後、先週、Naniteで風にそよぐ木の追加を行いました。これPackagingしても同じように動いているのかの確認はしていませんでした。

それも行います。

2.1 Runtime Virtual Textureの使用方法を確認する

もうRuntime Virtual Textureの使用方法を忘れてしまいました。

その復習から始めます。

2022-05-09のBlogUnreal Sensei氏の How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [5]を勉強しています。

この辺のBlogを読み直してRuntime Virtual Textureの復習をします。

2022-05-09のBlog

この週は How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [5]の内容を勉強してまとめただけです。

今、読み直すとかなり複雑です。

後、何でこの実装をするとこうなるのか分からない。と色々な箇所で述べています。

2022-05-16のBlog

 How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [5]の実装を行っています。

4.27で試しています。

うーん

UE5でVirtual Textureを試すのにはUE5で作成されたVirtual TextureのTutorialを試した方が良い気がします。

実装は途中までしか終わらず残りは来週やると書いてありました。

2022-05-23のBlog

 How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [5]の実装の最後の部分を完成させています。

その後で、Virtual Textureの歪みを補正するのにBen Cloward 先生のTriplanar Projection Normal Maps [6]を使用出来ないのかとか考えています。

これはこの時はかなり優れたIdeaだと思ったんですが、LandscapeのMaterialってZ軸に対してのDataがないんです。のでどうやってもその間は切れた感じになってしまったはずです。

<復習のまとめ>

Unreal Sensei氏の How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [5]はVirtual Textureを4.27で使用しているのでそのまま使用するのは危険です。

UE5で作成されたVirtual TextureのTutorialを探してそれで試す事にします。

検索すると以下のTutorialが出て来ました。

最初の2つが私が知りたい事をやっています。

QUICK TRICK to Realistically BLEND ASSETS with LANDSCAPE | UE5 Runtime Virtual Texturing Tutorial [7]を見てみます。

全部、見ました。

UE5で作業していますが、UE4.27と比較して特に変化したところはないです。

 How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [5]のやり方でやる事にします。

2.2  How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [5]のやり方でVirtual Textureを実装する

以下の様にLandscapeに岩を追加しました。

この岩にVirtual Textureを追加します。

Project SettingからEnable virtual texture supportにCheckを入れます。

Editorを再起動します。

これでVirtual Textureが使用出来るはずです。

Runtime Virtual Textureを2個作成します。

一個はMaterial用、もう一個はHeight用です。

名前はMaterial用をVT_Material、Height用をVT_Heightにします。

VT_Heightを開きVirtual Texture Contentに

World Heightをセットします。

同様にVT_Materialを開きVirtual Texture Contentが

Base Color、Normal、Roughness、Specularにセットされている事を示します。

次に両方のTextureのSize of the Virtual Texture in Tilesの

値を10に変更します。

2022-05-16のBlogには

何故このParameterの値を変更するのか不明。Tutorialも説明していない。

と書かれていました。

QUICK TRICK to Realistically BLEND ASSETS with LANDSCAPE | UE5 Runtime Virtual Texturing Tutorial [7]では、この値は全く弄っていません。

LandscapeのSizeが1009なので1024なら多分大丈夫でしょう。

Runtime Virtual Texture Volumeを追加します。

このRuntime Virtual Texture VolumeのVirtual Textureに

先程作成したVirtual TextureであるVT_Heightをセットします。

そしてBounds Aligns Actorsに

Landscapeをセットしました。

これTutorial通りにスポイトでLandscapeにセットするとSub Levelの一部のみがセットされます。

のでLandscapeを手動で選びました。

このやり方できちんと動くのかは不明です。

このRuntime Virtual Texture VolumeをDuplicateします。

DuplicateしたRuntime Virtual Texture VolumeのVirtual Textureには

VT_Materialをセットします。

次はLandscapeのMaterialの実装を変更します。

Runtime Virtual Texture Outputノードを追加します。

NormalをMaterial AttributesからBase Color、Specular、Roughnessの値を得ます。

World Heightの値は

Absolute World PositionのBの値から得ます。

最後にNormalの値を

Tangent SpaceからWorld Spaceに変換します。

これでLandscapeのMaterialの実装の変更は終わりです。

次にLandscapeを選択します。

LandscapeのDraw Virtual Textureに

先程作成した2つのRuntime Virtual Textureをセットします。

ここまで正しくセット出来ていると、この2つのRuntime Virtual TextureのIconにImageが表示される。みたいな話を聞いたんですが、これ正しいImage何でしょうか?

分かりませんね。

まあ最後までやってみましょう。

もし駄目だった場合はLandscapeの設定をSub Levelに変えてみます。

今度はVirtual Textureに保持されているLandscape のMaterialの情報をFoliageに使用しているRockにパスします。

RockのMaterialです。

これだと編集しにくいのでMaterial Attributeを使用します。

ここにBlend Material Attributesノードを追加します。

Alphaの値から取得します。

Virtual Texture Sample Parameterノードを作成し名前をVT Heightにします。

ここからLandscapeの高さを得ます。

RockのWorld PositionからこのLandscapeを引きます。

これでRockの表面にあるそれぞれのPixelのLandscapeからの高さが判明します。

この後でRockのScaleが変化した時のために以下の実装を追加しています。

これってRockが回転した時にも対応しているんでしょうか?

してない気がします。

これは計算から確認するより実際の結果で確認した方が速いので残りの実装も追加します。

この辺の計算は上手くいかなかったら読んで理解する事にします。

何と、Blend Material AttributeノードのAlphaに繋いだら

Virtual Texture Sample ParameterノードであるVT HeightがErrorになりました。

よく見たらVirtual Textureがセットされていませんでした。

VT_Heightをセットしました。

Errorが消えました。

結果を見え易くするためにBlend Material AttributeのBは赤くしました。

結果です。

真っ赤です。

Virtual Blend Textureの値を変更してみます。

結果です。

こんな感じで色が変化しました。

うーん。

成程です。

岩の上面は全部Virtual Textureで塗ってしまい、側面だけRockのMaterialを使用しようとおもっているので、これでも問題はないです。

ただその場合、この実装方法は最適ではないのでその点は後で調整します。

今度はLandscapeのMaterialを取ります。

結果です。

うーん。

値がPassされていませんね。

色々試したんですが原因が分かりません。

分かりました。

Runtime Virtual Texture Volume2の

Set Boundsを押したら

一気に直りました。

Runtime Virtual Texture VolumeのSet Boundsも押してなかったです。

Set Boundsを押したら以下の様に変化しました。

こっちが正しいVirtual Textureですね。

もう一回確認します。

それぞれの岩で50%ぐらい白くなっていますね。

岩の位置は関係していませんね。

岩のScaleとかRotationがVirtual Textureにどう影響しているのかですが、これだけ見たんじゃよく分かりません。

でもこのような混合具合ならパッと見た感じはとても自然です。ので取りあえずはこれで良いです。

後、LandscapeのNormalは使用しない事にしました。RockのNormalをそのまま使用した方がRockらしさが出るからです。

でもこれは後で考えを変えるかもしれません。

以下に示した

岩の側面のTextureの歪みを直します。

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

これParameterであるSide ContrastのDefault値が0になっているんですが、これ合っているんでしょうか?

結果です。

当然、真っ白です。

Side Contrastの値を10にしました。

これはVirtual Blend Heightの値を上げる必要があります。

Virtual Blend Heightの値を1.5にしました。

これは出来ていますね。

黒い部分にLandscapeのMaterialを追加して白い部分のRockのMaterialを追加します。

結果です。

うーん。

まず以下の岩を見てください。

これ。

どう考えてもオカシイです。

Slide Constantの値を下げます。

おかしく無くなりました。

しかし

岩の上部にVirtual Textureが乗らなくなりました。

色々試してSide Contrastが1.8位だったら

位になります。

Rockに赤を掛けてみました。

この辺は工夫したら色々出来そうです。

元に戻しました。

Virtual Textureのサイズが全然違います。

Landscapeの1000倍位のサイズになっています。

探したら他にもおかしな所が有りそうです。

うーん。

Virtual Textureもそのまま使用するには色々な制約が在りそうです。

2.3 LandscapeのVirtual Textureのサイズが1000倍位になっている問題

試しに普通に岩を置いてみました。

見事にLandscapeのTextureのSizeが1000倍位になっています。

うーん。色々試したんですが分かりません。

もう頭が働きません。

今週のVirtual Textureの検証はここまでとします。

2.4 World Aligned Blendノードを使用してCliff Layerに別なMaterialを追加する

こっちをやる事にします。

過去のBlogでWorld Aligned Blendノードの勉強した箇所を探したんですが、あまり良いのが無いです。

Unreal Sensei氏のTutorialでWorld Aligned Blendノードについて勉強したのは覚えていますが、World Aligned Blendノードの実装自体をかなり改良した記憶があります。

それを試す前に基礎を復習したいです。

2021-04-04のBlogで以下の様に述べていました。

これだけでもSlopeが急な所だけ別なMaterialを適応する事は可能そうです。

LandscapeのMaterialに使用しているM_Landscape5に使用しているMF_CliffにWorld Aligned Blendノードを使用してみます。

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

結果です。

ほぼ真っ白になりました。

Blend Sharpnessの値を50にしました。

角度が急な所だけが白くなっています。

Blend Biasの意味が分かりません。

色々調べていたら以下の方法で混合しているTutorialがありました。

こっちも試してみます。

結果は同じです。

試すだけ試したのでWorld Aligned Blendノードは外します。

2.5 World Aligned Blendノードを使用した感想

本当に一寸だけしか使用しませんでしたが、結論は今までと同じです。

World Aligned Blendノードを使用するよりもGaeaのMaskをもっと丁寧に作成してLayerで分割した方が良い。です。

のでWorld Aligned Blendノードの検証はこれで終わりにします。

2.6 先週作成した風に揺らぐ木がPackagingしても同じように表示されるのか確認する

取りあえず以下のような木を追加しました。

風でガンガンに揺れています。

これをPackagingしてみます。

30分ぐらいかかりましたがやっとPackagingが終わりました。

Exe fileを起動します。

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

木も風に揺れています。

Collisionもしました。

何も問題ないです。

今週のLandscapeはここまでとします。

2.7 今週のまとめと来週の課題

今週は3つの作業を行いました。

  • Virtual Textureの追加
  • Auto Material(World Aligned Blendノード)によるSlopeの分離
  • Naniteで作成した風で揺らぐ木がPackagingしたExe fileでもきちんと動くかの確認

それぞれについての感想を以下にまとめます。

<Virtual Textureの追加>

まず岩に追加して思ったのが、Virtual Textureは素晴らしい。という事です。

これは絶対に使用したいです。

しかし現状では、以下に示した様にLandscapeのMaterialが

1000倍位の大きさになってProjectされているBugが存在しています。

実際に使用するためにはこの原因を解明する必要があります。

<Auto Material(World Aligned Blendノード)によるSlopeの分離>

これの感想は前と同じで、Gaeaで最初から別なMaskを作成したのと変わらない。です。

敢えてWorld Aligned Blendノードで別のLayerをMaterial内で作成してそれに別のMaterial Functionで作成したLayerを追加する事をすべきかどうか?を考えると後で見直した時に見にくいし、理解もしづらくなります。

ので、今回のLandscapeの作成ではWorld Aligned Blendノードは使用しない方向で行こうと思っています。

<Naniteで作成した風で揺らぐ木がPackagingしたExe fileでもきちんと動くかの確認>

これは多分、無理だろうと思ってそんなに期待しないで試したんですが、何の問題もなく出来ました。

結構、驚きです。

<まとめ>

結局、Virtual Textureが上手くいくかどうかに掛かっています。

もしVirtual TextureのLandscapeのMaterialのサイズのBugが直せたら、このLandscapeは凄く良くなります。

しかしその問題が直せない限り、Virtual Textureを実際に使用する訳には行きません。

来週は、この問題の解決に集中して当たる事にします。

一応、問題の原因として考えているのは

Landscape用のMaterial内でLandscapeLayerCoordを使用しないで

以下に示したTexCoord[0]を使用している所です。

後、参考になるのがUnreal Sensei氏のTutorialで使用したLandscapeで、このLandscapeのMaterialの実装とも比較してみます。

来週はこの問題を解決するために集中します。

3.Niagaraの勉強

もう、前回のような勉強はしたくないです。

何がいやだったのかと言うと、Spriteの面の向きをAlignmentとFace Modeの値を変更する事で数学的に厳密に計算出来るようになれると思ってTutorialを勉強したら、AlignmentとFace ModeのそれぞれのParameterの説明を読まされるだけだった事です。

例えると、数学に苦手な分野があって「あの先生から教わったら一発で理解出来るよ。」という噂を聞いて、勉強しに行ったら嘘とまでは言わないけど、単に似た問題の答えを覚えるだけで、その分野の根本的な理解をするためには全く関係なかった。と言う感じです。

普通のProgrammingを数学に例えると、DirectXOpenGLを利用して直接Shader言語を書き込むProgrammingは物理に似ています。

そしてUnreal EngineやUnityを使用して書くProgrammingは化学や生物に似ているんです。

これ、何が言いたのかと言う、どれだけUnreal Engineの機能を数学的に厳密に追及しようとしても所詮はBlack Boxな部分が出てくるので、それに見合った対応をすべきと言う事です。

だから化学や生物の勉強でよくあるような理屈が分からん箇所は暗記してすます。

というあんまり理系にはうれしくないやり方がUnreal Engineの勉強法としては、実は一番正しい場合もあると言う事です。

この辺を誤解していました。

ので先週は一寸、感情が爆発してしまった訳です。

これからは見た目の凄いEffectを勉強する事にします。

これだったら最悪、中身が何しているのか不明でも凄いEffectを作れたと言う満足感を得る事が出来ます。

3.1 CGHOW氏のTutorialを勉強する

Power Spell in UE5.1 Niagara Tutorial | Download Files[8]を勉強します。

これ、今まで勉強したNiagaraのTutorialと比較するとかなり毛色の違ったTutorialです。

こういうのも勉強する事にします。

まず軽く全部を見てどんな勉強をするのかを把握します。

見ました。

Sequencerを使用しています。

後は、Skeletal MeshのAnimationとかも使用しています。

勿論、Niagaraも使用しています。

何か今までのTutorialとはかなり毛色が違います。

今週は、このTutorialを内容をしっかりまとめて、来週から実装する感じでしょうか?

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

いつも通りCGHOW氏はTutorialを章分けしてくれていないので、こっちで適当に分けます。

<Intro>

まず完成品を見せています。

以下のようなSequenceです。

このSequence自体、今まで使用した事が無いです。

まず以下の箇所までのSequenceで

以下のCharacterが動きます。

以下の当たりで

手が赤く光ります。

次に以下の辺りで

全身が光ります。

RGBも少しずれていますね。

このEffectを何と呼ぶのか忘れてしまいました。

そういえば新しいChatが使えるBingが昨日から使用出来る様になりました。

Bingに聞いてみましょう。

凄すぎ!

RGBを少しだけずらすEffectはChromatic AberrationというかRGB Split/Glitchと言うらしいです。

Chromatic Aberrationだ。

これについて更に質問して確認します。

Chromatic Aberrationが載っているサイトが紹介されています。

さらに以下に示した様なImageも紹介してくれました。

サイトの方も見ましたが、なんかRGBが少ししかずれていないんです。

このEffectみたくズバッっと明確にずれている感じじゃないです。

RGB Splitについて聞いてみます。

紹介されたサイトを見たらこれでした。

凄い。

でもPhotoshop云々は要らないです。

ここからが凄いです。

Photoshopは要らない。

このEffectの名前が分かったら十分と答えたら

答えを見つける事が出来てうれしいです。

って答えています。

凄すぎる。

前の会話を覚えているんです。

いや実際は覚えていないのかもしれませんが、覚えているのと同じです。

思わずこんな丁寧に返答してしまいました。

凄い!

今度はCharacterが黒くなります。

そして集中戦が入っています。

大体こんな感じのSequenceを作成します。

<準備>

Empty Levelを作成します。

背景をGrayにするためにExponential Height Fogを追加します。

次何ですがCameraが切れて見えません。

Fog Inscatte...かその下のSkye Atmosphereの値を

灰色にします。

するとLevel全体が灰色になります。

そういえばExponential Height FogのParameterの使用方法も良く知らないです。

そのうち勉強する事にしましょう。

そしてLevel Sequenceを作成します。

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

使用するAnimation Sequenceを

Dragして先程のLevel Sequenceに追加します。

すると以下の様に先程のAnimation Sequenceが追加されます。

私は同じAnimation Sequenceはないので別のCharacterのAnimation Sequenceを使用します。

Animationに先程のAnimation Sequenceを追加します。

???

今追加したのがAnimation Sequenceでしょう。そのAnimationに同じAnimation Sequenceを追加するの?

もう一回確認します。

これがLevel Sequenceに追加したAnimation Sequenceです。

こっちがそのAnimation Sequenceを追加したLevel SequenceのAnimationの所にあるAnimationに追加したAnimation Sequenceです。

同じAnimation Sequenceでした。

間違っていませんね。

次にこのAnimationの最後のFrameの所でSet End Timesを選択します。

するとPlayをした時にその場所でPlayが終了するようになります。

<Materialの作成>

新しいMaterialを作成しました。

しようしているAnimationのCharacterのTextureとNormalを追加します。

またLevel Sequenceに戻ります。

最初の行のTrackを押してSkeletal Mesh Component0を選択します。

すると以下に示した様にSkeletal Mesh Componentが追加されますので

+を押します。

するとBoxが表示されますのでその中からMaterial Element0を選択します。

ここに何かを追加するのかと思ったら、ここに表示されるParameterはうんたらかんたらと言って

突然、Preview画面のCharacterを選択しました。

そしてそのMaterialのElement0に先程のMaterialをセットしました。

するとまずCharacterに色が追加されます。

更にMaterial Element0のParameterを押しても

今度は何も表示されなくなりました。

これは先程作成したMaterialにはParameterが無いからだそうです。

お。

やっと繋がりました。

先程作成したMaterialにParameterを追加します。

Lerpノードを追加して0の時は普段のTexture、1の時は白を表示するようにします。

そしてそのLerpノードのAlpha値をParameterに指定します。

実際のEffectではCharacterは白くなるだけじゃなくて黒くもなるそうです。

のでLerpノードのBの値もParameter化します。

この状態で先程のLevel Sequenceに戻り、以下に示したMaterial Element0のParameterを押すと

先程、Materialに追加したParameterであるColor ValueとText Colorが表示されるようになりました。

<TimelineからMaterialのParameterの値を変更する>

ここでSequenceにある以下のBarの右端を

ぐっと左に移動させました。

すると以下に示した様に

こんなTimelineだったのが

以下のようなAnimationがある箇所だけがZoomされたようなTimelineに変化しました。

こういう小技を知っているのと知らないのじゃ大きな違いがあります。

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

あれ今見たら先程の2つのParameterがTimelineに追加されていました。

Videoを巻き戻して見直したらMaterial Element0の+を押したところで追加していました。

両方の値が1.0なので

Characterは白くなっています。

この設定は要らないので以下のTimelineのButtonを選択して

消してしまいます。

これどうやって消したのか分かりません。

実装する時は色々試してみます。

Buttonを消すと

以下のParameterの値も

0に変化していますね。

そして以下の丸ボタンを押して

Timeline上に丸Buttonを追加します。

CharacterがこんなPoseを取っている所です。

以下の矢印の中で赤く囲ったボタンを2回押します。

このボタン今まで何のためにあるのか不明だったんですが、1 Frameだけ前に進むそうです。

今回は2Frame前に進みました。

ここでCharacterが白くなるようにParameterの値を変更し

また以下の丸Buttonを押して

Timelineに追加します。

Previewの画像です。

白くなっています。

更にその1Frame後で

黒くなるように指定します。

更にその3Frame後で

元の色に戻るように

設定を変更します。

<Cameraの調整>

今度はCameraの調整を行うそうです。

以下のCameraのButtonを押します。

すると以下のような画面に切り替わりました。

特にTimelineのTrackに表示される要素が全部変わっています。

この辺も初めてですね。

Camera Componentを選択して

右のDetail画面の

Sensorの値を

逆にします。

今度は以下の場面でBackgroundを黒くします。

OutlinerからExponenを選択します。

この状態のまま+Trackを押して以下のBoxを表示させます。

Add Exponential Height Fogを追加します。

Exponential Height Fogが追加されました。

そして以下に示した様に

Exponential Height Fogの+Trackを押してHeight Fog Component0を追加します。

更にHeight Fog Component0の+Trackを押して

Fog Max Opacityを追加します。

以下の様になりました。

Sequenceを普段から使用している人達にはこんなの基本でしょうが、私はここまで理解するだけでもかなり大変です。

以下の様にFog Max Opacityの値を指定しました。

最初のFrameでは1を指定しました。

こんなBackgroundです。

ここから2Frame後です。

Fog Max Opacityの値に0を指定する事で

Backgroundを黒くしました。

更にその2Frame後で

Backgroundの色が元に戻るように指定しました。

<腕を赤く光らせる>

今度は、Characterの手を赤く光らせます。

まずCharacterのSkeletal Meshを開きます。

Make Static Meshを押し

CharacterのStatic Meshを作成します。

作成したStatic Meshを開きます。

ここからUVを表示させます。

UVを表示した状態でCharacterの手のEdgeを選択すると

手のUVがどこにあるのかが判明します。

前腕部のUVです。

前腕と手のUVが判明したら以下のUVを利用して

Mayaなどの3D Softwareを使用して以下のようなTextureを作成します。

TutorialではMayaなどのSoftと言っていますが、この加工はPhotoshopなどを使用して加工すべきでしょう。

赤のImageです。

緑のImageです。

この作成したTextureをMaterialに追加します。

これはおまけですが、先程作成したStatic MeshをPreview画面に追加する事も出来ます。

TexColorの値を0にしました。

先程のTextureをPreviewします。

これ見ると白いですね。

先程のTextureのImageで青は表示していませんでしたが、これ見ると緑と同じようです。

ここからの実装が一寸謎です。

以下の様にまずNoiseとGを掛けます。

その結果をParameter、Tempで掛けます。

更にその結果をBlackbodyノードに繋ぎます。

その結果を前のEmissive Colorの結果に足します。

分かりました。

ParameterであるTempの値を10000にすると以下の様に

手が光ります。

ここまで完成したら後は簡単です。

またLevel Sequenceに戻ってきて

Skeletal Mesh Component 0のMaterial Element0に

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

Timelineで最初はTempの値を0にします。

以下に示した様な手の位置に来た時に

Tempの値をすごく高くします。

こんな結果になります。

更に以下の地点で

Characterが真っ白になった時に

更にTempの値を高くして

Characterの手の色をもっと白くする事も出来ます。

当然、最後のFrameでTempの値を0に戻します。

まだ半分しか終わっていないのか。

結構量がありますね。

白く光っている時にCharacterを少しだけ大きくします。

たった1FrameですがCharacterを1.3倍にしています。

<Post Process Volumeの追加>

もう現時点でかなり疲れていますが、ここから更にEffectを加工するそうです。

今度はPost Process Volumeを追加します。

Post process Volumeの境界をInfinite ExtendにCheckを入れて無しにします。

今度はChromatic AberrationのIntensityの値を

上げます。

あれ、さっきBingに聞いたときはChromatic Aberrationは写真に使用する名称でCGではRGB Splitが正しいと理解したんですが、ここではChromatic Aberrationって言っていますね。

うーん。

でもPost Process Volumeだから写真と同じ効果を追加すると考える事も出来ます。

これもLevel Sequenceに追加して

0,15、0にセットします。

白い時にChromatic Aberrationが起きるようにします。

うーん。

大体、Level Sequenceの使用方法は理解したんだけどこのLevel SequenceはGame画面から呼び出す事って出来るんでしょうか?

例えばLevel BPから呼び出す事とか。

Niagaraを追加する>

今度は以下のEffectを追加するそうです。

やっとNiagaraを追加します。

まずNiagaraに使用するMaterialの作成をします。

以下のTextureを使用します。

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

ここでMultiplyとDivideのBの値を同じにする必要があるそうです。

すると以下に示した様な

StylizedされたImageを作成出来るようになります。

別解として以下のやり方も紹介していました。

Blend Modeを以下の様にセットして

以下の実装をします。

結果です。

Particle Colorを掛けて

Niagaraから好きな色を追加出来るようにします。

更にStepに使用する値もDynamic Parameterを使用してNiagaraから指定出来るようにします。

ひょっとしてこっちを使用するの?

これでNiagara用のMaterialの作成は完成です。

ここからNiagaraの作成を行います。

いつものNiagara Systemの作成でFountainを追加したやつです。

Render SectionにあるSprite Renderer Moduleの

Materialに先程作成したMaterialをセットします。

要らないModuleを全部消します。

Emitter Update SectionのSpawn Rate Moduleの

Spawn Rateの値を

5にします。

Spawn Rate SectionにあるInitialize Particle Moduleの

Sprite Sizeに関する設定を以下の様にします。

Previewの結果です。

ここでParticle Update SectionにDynamic Material Parameter Moduleを追加し

Layerの値を変化すると

あれ、Parameterの名前がLayerに代わっていました。

まあどこのParameterなのかはすぐに分かるのでどうでも良いです。

Previewの結果ですが、

Screenshotでは分かりませんが、凄い勢いで回転して形状が変化しています。

このLayerの値にFloat from Curveを追加して

0の時に0、1の時に20の値を代入しました。

以下の結果になりました。

Emitter Update SectionにあるSpawn Rate Moduleを消してSpawn Burst Instantaneous Moduleを追加します。

Spawn Burst Instantaneous ModuleのSpawn Count

の値を10に変更します。

更にEmitter Update SectionにあるEmitter State Moduleの

Loop Behaviorの値をOnceに変更します。

ここでParticle Spawn SectionのInitialize Particle Moduleの

Colorの値を変更して

色を追加しています。

あれ、Materialで作成したParameterは使用しないんでしょうか?

まあ良いです。

Previewの結果です。

今度はRender SectionのSprite Render Moduleの

AlignmentとFacing ModeをCustomに変更します。

うげー。

当分見たくないと思っていたAlignmentとFacing Modeがここでも出てきた。

Particle Spawn SectionにAlign Sprite to Mesh Orientation Moduleを追加します。

まずErrorをFixし、

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

この結果、Spriteは全ての方向にRandomに向くようになりました。

更にParticle Update SectionにScale Sprite Size Moduleを追加し

以下のような設定にします。

そしてParticle Spawn SectionのInitialize Particle Moduleの

Lifetimeを短くします。

この辺はEffectを微調整しているだけです。

最後にPropertiesを選択して

Local SpaceにCheckを入れます。

これでEffectは完成です。

NiagaraをLevel Sequenceに追加します。

まず位置を以下に場所に移動しました。

まずEffectをSpawnさせます。

最初にSpawnをOffにして次のFrameでOnにします。

結果です。

最後にLightを追加します。

Naniteに戻ってRender SectionにLight Renderer Moduleを追加します。

Color Addの値を以下の様にします。

以下のEffectが追加されます。

<集中線を追加する>

多分これが最後のEffectの追加です。

やっとここまで来ました。

まず以下のTextureを使用します。

このTextureを使用したMaterialを作成します。

Previewの画像です。

このMaterialを使用したNiagaraを作成します。

まじですか、Post Processで使用するのかと思ったらNiagaraで使用するそうです。

以下の実装を作成します。

いつものFountain Templateから要らないModuleを引いたStackですね。

おそらくSprite Renderer Moduleには先程作成したMaterialがセットされているはずです。

Spawn Burst Instantaneous Moduleが使用されていますね。

しかもそのSpawn Countは1になっています。

更にParticle Update SectionのScale Sprite Size Moduleの

設定です。

この説明だけではよく分からない部分もありますね。

例えばこのSpriteの継続時間です。

まあ良いです。

続きを見ます。

先程のNaniteと同じようにLevel Sequenceに追加します。

Spawnする位置を指定します。

結果です。

これで終わりです。

3.2 Power Spell in UE5.1 Niagara Tutorial | Download Files[8]を勉強した感想

とんでもなく長いTutorialでしたがこれでLevel Sequenceの使用方法の基礎は理解出来ました。

Level Sequenceにセットするものとして

  • Animation Sequence
  • Skeletal MeshとそのMaterial
  • Exponential Height FogのParameter
  • Post Process VolumeのParameter
  • Niagara

の追加方法を勉強しました。

更にLevel Sequence内におけるCameraの調整なども学びました。

やっぱりNiagaraはこういう勉強をすべきです。

今週はかなり知見が広がりました。

このSequenceの実装は来週やります。

4.Materialの勉強

今週はBen Cloward先生のIce Shader Part 2 - Advanced Materials - Episode 6 [1]を勉強します。

4.1 Ice Shader Part 2 - Advanced Materials - Episode 6 [1]を勉強する

まず全部を軽く見ます。

見ました。

今回も神回で、凄いMaterialを作成しています。

ただ最終的な完成が以下に示した様になったので

これもう少し微調整して透明度を上げた方が良い気がします。

少なくとも氷には見えません。

この辺は後で自分で調整します。

もう少し調整したらかなり氷らしいMaterialが完成出来る気がします。

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

まず細かい理屈は今回は勉強しないそうです。理論をしっかり勉強したい人はVolumetric Ice Shader - UE4 Materials 101 - Episode 11[8]を見て下さいと述べています。

これは来週以降勉強する事にします。

今回使用するTextureです。

Googleで見つけたと言っています。こんなのあるんでしょうか?

New Bingで聞いたら以下の回答を貰いました。

お勧めのサイトを見てみます。

2番目のサイトが30個のIceのTextureが有ると言うのでこっちの方を見てみます。

https://thedesignest.net/ice-textures/

このサイトです。

このサイトに紹介されていたIce Textureの一つです。

これで良いんじゃないでしょうか?

New Bingでは更にImage画像の紹介もありました。

このImageの中にも以下に示した様なすぐにIceのTextureとして使用出来そうなのがありました。

IceのTextureを手に入れるのは簡単みたいです。

実はこの点を一番心配していました。

まずこのIce Textureを先週作成したIceのMaterialに追加します。

試しにこのTextureをBase Colorに繋ぐと

以下の様になります。

この状態だとTextureがObjectの表面に張り付いているように見えます。

TextureをObjectの内側に張り付いて見えるようにするために以下の実装を追加します。

まずCamera ViewとZ軸との間でCustom Reflection Vectorを計算します。

この計算はTangent Spaceで行われるのでCamera VectorのSpaceをWorld SpaceからTangent Spaceに変換しています。

この辺の理論についてはこのTutorialではあんまり解説していません。

先程出てきた、別のTutorialであるVolumetric Ice Shader - UE4 Materials 101 - Episode 11[8]で勉強して下さい。って事でしょうか?

その結果をRGでMaskしてTexCoord[0]に追加します。

これで角度によって表面からOffsetされたTextureが見えるようになるそうです。

結果です。

うーん。

確かに氷っぽくはなったけど。

おお。

止まっているとあんまり変化が分かりませんが、角度を変えるとTextureがObjectの内側にあるのがよく分かります。

ただ今の状態だとTextureがObjectの内側と言うよりもObjectの奥にあるように見えます。

これを直すそうです。

100をCustom Reflection VectorのBの絶対値で割ってその結果を先程のCustom Reflection VectorのRGの値に掛けます。

Bの値によってOffsetの強さに変化を付けている訳です。

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

更にTextureのPixel数の逆数を掛けています。

結果です。

確かにTextureが少しだけ奥に写っています。

ここから更にIceの表面のLayerを作成します。

これを追加するとはっきり言って岩みたくなってしまいます。

あんまり追加したくないLayerですが、一応は勉強しています。

ほとんどやり方は一緒ですが、Textureのサイズを4分の1にしています。後Offsetの値が10に変更されています。

この結果と先程の結果をなんと足してしまっています。

ここはLerpにしてどちらかの結果だけ表示すべきだと思います。

でないとObjectの表面だけが色が濃くなって氷の透明感が消えてしまいます。

結果です。

うーん。

Iceっぽい事はIceっぽいです。

ここでCustom Reflection VectorノードのNormalの値をRockのNormal Mapから得る事にしています。

そのまま使用すると強すぎるのでFlatten Normalノードを使用して弱くします。

結果です。

はい。

過ぎたるは猶及ばざるが如しです。

もう石にしか見えません。

この結果を先週のBase Colorと混合します。

この混合方法には私はまるっきり反対です。

しかしその前にこの実装が何をやっているのかを解説します。

先週のBase Colorに色を付けてLerpのAに繋ぎます。

それより薄い色をLerpのBに繋げます。

LerpのAlphaに先程作成したTextureを使用した実装を繋げます。

このやり方だと全部が不透明になってしまいます。

ので私はLerpのAの先週の実装、LerpのBに今週の実装、LerpのAlphaには白黒の氷っぽいTextureを使用すべきと考えます。

まあ、良いです。この辺は来週実装する時に検証します。

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

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

5.1 先週の続き

先週の最後に今週は以下の箇所に音を入れると言っています。

  • 開始ボタン
  • 先攻後攻を決めるCardの選択(Cursorを乗せた時も音がするようにする)
  • 対戦相手の魔術師がMonsterを召喚した時のAnimation

これからやっていきます。

開始ボタンを押した時の効果音を追加しました。

音は他のボタンを押した時と同じ音です。

先攻後攻を決めるCardの選択時に音を追加します。

Cardの上をCursorがHoveringした時の音です。

CardをClickした時の音です。

対戦相手の魔術師がMonsterを召喚した時のAnimationにも音を追加します。

しました。

テストしたら音が合っていないので音を変えました。

合っていないと言えば以下の召喚するMonsterを壺にセットする時の音です。

長すぎます。

別な音を試してみます。

少しだけ短めな音に変更しました。

これで先週追加したいと言った効果音は全部追加しました。

5.2 Monsterが召喚された時の効果音

MonsterはLevel BP内のSpawn Monster()関数で召喚しています。

このSpawn Monster()関数内に以下の実装を追加します。

ここではPlay Sound at Locationノードを使用しています。

WidgetのSoundは仕方ないですが、NiagaraのSoundもWorld Spaceの位置を考慮してない音が出ています。

のでここではPlay Sound at Locationノードを使用する事にしました。

テストします。

音があんまり中世感が無いです。

これは別な音源があったら変えたいですが、今は無いので仕方ないです。

5.3 妖精族が攻撃した時の効果音

以下の音を追加しました。

雷の音はかなり不満です。

英語ではLightningとThunderingは別の事で、通常Lightingは雷の光っている部分Thunderingは雷の音の部分を指します。

でこの効果音集にあるのはLightingの効果音だけでシューンみたいな音しかありません。私が欲しいのはゴロゴロする効果音です。

テストしてみます。

思ったよりは良かったです。

後、

  • MonsterがDamageを受けた時
  • Monsterが死んだ時
  • 魔術師が魔法を使用した時

の音を追加する必要があります。

妖精族のだけ今追加します。

<MonsterがDamageを受けた時>

まずMonsterのDamageのAnimation SequenceはDefaultのAnimationを使用しています。

ここにSoundを追加してしまうとDefaultの値が変わってしますので、新しいAnimation Sequenceを作成しました。

これをDamageのAnimationとして使用します。

音を追加します。

テストします。

かなり良いです。

<Monsterが死んだ時>

Monsterが死んだ時のAnimation SequenceもDefaultのAnimation Sequenceを使用していました。

以下に示した様にDuplicateしたAnimation Sequenceを代わりに使用する事にします。

交換します。

音を追加します。

テストします。

音が早すぎます。

Notifyの位置を以下の様に変更しました。

テストします。

良い感じです。

<魔術師が魔法を使用した時>

これは誤解を生む表現で魔術師が魔法を使用した時の効果音は既に追加してあります。

しかしMonsterがその魔法を受けた時のEffect時の効果音がまだ追加していません。

この効果音を追加します。

攻撃力2倍の効果音を追加しました。

回復です。

位置交換です。

それではテストして確認します。

確認しました。

まあOKではあります。

ありますが、だんだん効果音が増えて来ると一寸物足りなくもあります。

5.4 来週の予定

以下に示した読みましたButtonを押した時に音がしません。

これに音を追加します。

後、来週は亡霊族に音を追加します。

5.5 効果音を探す

流石にこの効果音だけでは物足りないので、Freeの効果音をMarketで探す事にします。

無料のSound Effectは以下の3つしかありません。

これらを試してみます。

真ん中のGVoiceは何でしょう。購入ボタンが無いですね。

2つだけ試してみます。

<Interface & Item Sounds Pack>

全部聞いてみました。

まあ、何個か使えそうな音が有るかもしれないLevelです。

<Human Vocalizations>

こっちの方が使えそうです。

本当の人の声が入っているので雰囲気を壊してしまう可能性もありますね。

<追記>

こんなMailがEpic Game社から来ました。

うーん。

これは困った。

ここから販売促進のための戦略についての考察を始めます。

5.6 またアメリカでポケモン スカーレット バイオレットへの叩きが始まりました

今度はポケモン スカーレット バイオレットのSave Dataが消えたと騒いでいます。

その言い分が振るっていて600時間のPlay時間が消えた。と騒いでいます。

いや、600時間もPlayしたら十分だろう。と思いますが、それ以前にこのGameはPlayするに値しないから返金してくれ。って言っていたじゃん。

もう無茶苦茶ですが、クレーム言うのが仕事のYouTuber達はその矛盾に自分では気が付いていません。

で、本当にポケモン スカーレット バイオレットをPlayした人達は、かなり今回のポケモンの出来にはかなり満足しているみたいです。

そのSave Dataが消えたと言うのが本当なのかどうかは不明ですが、600時間も楽しくPlayした人は、0からやり直しになっても別に困らないでしょう。

また一からやり直すだけです。

しかしGameの解説を生業とするYouTuberはもうクレーマーと変わりませんね。

Game業界の発展に何一つ貢献しないで、いちゃもんをつけるだけです。

実際にPlayした後での感想ならまだ分かりますが、全くPlayしないでネットから適当に拾ってきた情報だけで文句言って生計立てているですから。

普段、Gameを全くやらない私は少なくとも彼らがGame位はしっかりPlayした上で批判していると思っていました。

それすらしないでクレームつけているんですから、ヤクザと同じです。

開店した店の前に猫の死体を並べて、客が恐れてこなくなってからショバ代を要求するヤクザと何ら変わらないです。

大体、Gameの実況をYouTubeに許した時点で間違っていたんですよ。

このクレームがどういう結果になるのかは不明ですが、私は後5年で任天堂以外のGame産業が終焉を迎えると推測しています。

そしてこのクレームがもし任天堂ポケモンの会社に壊滅的なDamageを与える事になったら、任天堂のGameも終わりを迎え全てのGame産業が終わると推測しています。

まずアメリカですが既にAAAのGameを作成する会社が無くなって来ています。

Harry PotterのGameも政治問題化してしまいました。

これの何が問題なのかというと、元々Harry Potterが好きな層は左翼なんです。

アメリカの右翼は読書なんて軟弱?な行為はしませんから。

その左翼層、つまり潜在的なFanを敵に回してしまったんです。

Harry PotterのGameは今回は売れました。

しかしそれはそれを買ったほとんどの層が、J. K. Rowlingがあんな発言をした事何で知らなかったんです。

でも今回の事件でJ. K. Rowlingの発言も世界的に有名になってしまったので、これからも今回と同じようにヒットするのかは微妙です。

(ただTrans Genderの人達がGameをPlayする事に対して脅しをかけるのか、一寸Imageに合わない所もあります。これはTrans Genderのふりをした極右の仕業の可能性もあります。この辺はまだよく分かりません。)

これイーロンマスクと同じです。

電気自動車を買う人は環境保全に気を遣う層で、左翼なんです。

特にアメリカの右翼は石油業界と密接な関係があるので地球温暖化なんて詐欺だと思っています。

イーロンマスクは連日のTwitter事件で右翼層に猛烈に媚売って、左翼を怒らしてしまいました。

もうテスラを買う人もいなくなるでしょう。

アメリカに住んでいた時、ある友人がもう滅茶苦茶、イーロンマスクを尊敬していました。

それで昔、イーロンマスクについて調べたんですが、私の感想は単なる詐〇師でした。

そしてその印象は今も変わっていません。

というか益々その印象が強くなりました。

結論から言えば、CO2の排出を減らすには電車やバスを利用するしかないんです。

イーロンマスクのやっているのは本当の環境保全の立場から言えば、なんの役にも立っていません。

ただ電気自動車自体は、燃焼エンジンを使用する自動車と比較すると構成する部品が遥かに少ないので、産業としての未来があるとは思っています。

ので詐〇師と言うよりは優秀なBusinessmanと言うべきでしょうね。本当の所は。

でも環境保全とは何の関係もないです。

まあ、イーロンマスクの話は関係ないのでここまでとします。

しかしアメリカのGame産業が終わりを迎えつつあると予測しているのは私だけではありません。

NvidiaのCEOもこの前のInterviewで「今まではVideo Gameで伸びてきた。これからはAIで伸びる。」と当然の様に語っていました。

今、Chat GPTが凄い話題になっていますが、AIによる車の自動運転技術も革命的な進歩を遂げています。

私が聞いた話では、自動運転も今までのような画像認識ではなく、仮想空間に3dを作成してその中でAIに車を運転させる事で、革命的な進歩をしているんだそうです。

そしてその3Dの仮想空間の作成にはNvidiaのVideo Cardが必要になる訳です。

そんなに直接的な使用方法でなくても、一般的なDeep Learning(Machine Learning?)をするにもNvidiaのVideo Cardは必須です。

近い将来、世界中の車にNvidiaのVideo Cardが搭載される訳です。

つまりNividaはもうGame産業が潰れて無くなっても何の問題もないんです。

この問題はアメリカだけではありません。

中国でもGame産業に対する風向きが180度変わりました。

中国共産党は、Game産業は何の役にも立たない処か、人民に害をなす存在と結論づけました。

Gameに貴重な人材を回すより、半導体の製造などの分野の人材育成に努めるべきである。と言っています。

そして我が日本ですがGame産業からたらふく税金を徴収しているのに全く還元しません。

他の国では、IndieでGameを作成している会社は税金を免除の上、開発環境を政府が提供したり何億円の資金援助をしたりしてGame産業の育成に努めていましたが、日本では全くそういう事はしていませんでした。

大体Gameが3D化した時に民間だけで対応出来る時代は終わっていたんです。

アメリカなんか3D Graphicsの研究に何兆円の単位でつぎ込んでいます。産学官連携でやっています。

そうやって発展した結果の上にUnreal EngineなどのGame (3D Graphic) Engineが存在している訳です。

そもそもこのGame (3D Graphic) Engineを日本のGame会社が、自社で作成しないといけない事態が間違っているんです。

日本ではGame (3D Graphic) Engine自体は国の研究機関が開発して、無料でGame会社が使用出来る仕組みにしておくべきだったんです。

そうしないと日本のGame会社の体力と人材ではGame (3D Graphic) Engineの開発だけで終わってしまいます。その後に日本が得意だった面白いGameを作成する所をやる前に体力が尽きてしまいます。

任天堂のビジネス戦略が上手かったのは3D Graphicsは三流で良いです。と最初から最新のGame (3D Graphic) Engineの開発競争に参入しないで、面白いGameを作成する方に集中した所です。

でもそれがいつまで通用するのかは不明です。

そう言えば、ウマ娘で大成功した会社もその利益を社員に還元しないで、親会社の損失の補填に充ててしまいました。これだっていずれ社員の不満となって表面化するでしょう。

昔の日本のGame会社は、一本でもGameをヒットさせたら2億とか3億とかボーナスで貰えたんですよ。

だから社員も頑張ったんです。

まあ、そういう訳でこれから数年のうちに日米中でGame産業自体が無くなる可能性はかなり高くなっています。

とは言ってもUnreal Engineは3D Graphic Engineとして不動の地位を保ち続けるのは間違いないですので、Unreal Engineを勉強する事が無駄になる事は無いと思っています。

5.7 販売戦略を考える(Gameをやる理由を追加する)

こういう事態を予測した上で、どういう風に自分の作成したGameを販売するのかを考える予定でしたが時間が無くなってしまったのでこれは来週やります。

6.Gaeaの勉強

6.1 先週の勉強の復習

先週の勉強の内容を復習します。

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

そしてその目的ですが、

Textureの作成部分もTerrainの作成と同じように、手順を一般化し、それぞれの手順で使用出来るNodeを整理し、誰が使用しても一定以上の質を保ったTextureの作成が出来るようにする事と言っています。

そうだ。

Textureの作成はUE5にExportした時にMaskの作成部分に対応します。

のですごく重要なんです。

この後、手順を名称で分割すると訳分からなくなるので以下に示した2つ手順で分けました。

そしてそれぞれの手順の名称を

  1. Masking、
  2. Coloring

と名付けました。

これは私が勝手に名付けたんですが、この分け方とこの名称を使用する事で、Textureの作成部分も手順を一般化し、それぞれの手順で使用出来るNodeを整理し、誰が使用しても一定以上の質を保ったTextureの作成が出来るようになります。

ので、みんなで使うようにしましょう。

因みに、私が今勉強に使用しているAndrea Cantelli氏のTutorialでもこの手順の名称は、一貫していなくてその時々で色々な言い方で読んでいます。

Klaus氏のTutorialはまだ確認していません。

Klaus氏のTutorialに関してはこの手法が完成してから全部を比較する事にします。

<Masking>

MaskingにはData Groupに属しているNodeを使用します。

ここでData GroupにあるそれぞれのNodeの特性について調べています。

調べたNodeは

  • Soilノード
  • Heightノード
  • Slopeノード
  • Textureノード

の4つです。

ここに登場するNodeはMaskingの基本となるとても重要なNodeです。

それぞれの特徴について簡単にまとめておきます。

<<Soilノード>>

これ、Maskingのための最も基本的なNodeとして紹介していますが、その特徴がまとめられていません。

後でもう一回見直す事にします。

<<Heightノード>>

Heightを指定してその部分より上を白く下を黒くします。

これ見ると灰色の箇所もあります。

<<Slopeノード>>

Slopeの角度を指定してそれより大きい箇所が黒く、小さい箇所が白くなります。

このNodeから作成したMaskがあれば、UEのAuto Material(World Aligned Blendノード)は使用しなくて良いはずです。

白くなる部分と黒くなる部分が想像と反対なのでその部分の調整をする必要があります。

これについては今週調べる事にします。

<<Textureノード>>

このNodeは全てのNodeの中でも最も複雑なNodeだそうです。

このNodeに関してはほとんど勉強していません。

今週、勉強する事にします。

<他のData GroupのNodeについて>

Angle、Curvature、Details、Distribution、Flow、Growth、そしてProTrusionノードについても調べています。

まあ、調べたと言ってもそれぞれのNodeをTerrainの結果に繋いだだけです。

どんなMaskを作成したい時のどのNodeを使うべきかを検証した訳ではないです。

<MaskとLandscapeの関係についての検証(UE5)>

ここでかなり重要な検証をしているんですが、すっかりこの事忘れていました。

MaskとLayerの関係ですが以下の関係がある事が判明しました。

  • Maskの白い部分はLayerになる。
  • Maskの黒い部分は前のLayerがそのまま残る。
  • Maskの灰色の部分は前のLayerとの混合になる。

6.2 先週の勉強の復習のまとめ

先週の勉強を復習したらかなり重要な内容が3つほど含まれていました。その内容を忘れてないようにここに改めてまとめ直します。

  • Textureを張り付けるための手順とその名称
  • Maskの作成にはData GroupのNodeを使用
  • UE5におけるLayerとMaskの関係

GaeaからMaskを作成するためにはこれらの理解はどれも欠かせないものです。

逆にこれらを理解したら一騎当千の働きをしてくれる頼もしい存在でもあります。

以下にこれらの内容を簡単にまとめます。

<Textureを張り付けるための手順とその名称>

GaeaにおいてTextureを張り付けるための手順は大まかに言って以下の2つに分ける事が出来ます。

  1. Textureを張り付けるためにTerrainをある条件に沿って分割
  2. 張り付けたTextureに色、またはImageを追加

それぞれの手順の名称は人によって呼び方が違いますが、分かり易くするために私は

  1. Masking、
  2. Coloring

と名付けました。

<Maskの作成にはData GroupのNodeを使用>

これはAndrea Cantelli氏のTutorialで紹介されていました。

これについては後でもう少し深堀します。

<UE5におけるLayerとMaskの関係>

MaskとLayerの関係は以下の様になっています。

  • Maskの白い部分はLayerになる。
  • Maskの黒い部分は前のLayerがそのまま残る。
  • Maskの灰色の部分は前のLayerとの混合になる。

6.3 何故この3つが重要なのかについて

で何でこれらがそんなに大切なのかについても以下にまとめます。

今、UE5でLandscapeを作成するには大きく分けて3つの方法があります。

一つ目はLandscapeのSculptを使用してUE内で直接、Landscapeの形状を作成する方法です。

このやり方の長所は

  • 初心者にも分かり易い
  • 自分で臨んだ形状を作成出来る

などがありますが、以下の短所もあります。

  • 山が丸くなって、すぐにCGで作成された山だと分かってしまう。
  • 全部自分で作成するため時間と労力が掛かる。

2つ目のやり方はWorld MachineやGaeaなどのTerrainを作成する専用のSoftにHeight MapやMaskを作成させ、それをUE5にImportする方法です。

つまり今私がやっている方法です。

この方法の長所は

  • Open World用の巨大なMapが簡単に作成出来る
  • Layer用のMaskも簡単に作成出来る
  • 写真で見るような地形を本物そっくりに作成出来る(遠くの地形だけ。近づいた地形はそれなりにオカシイ)

などがあります。

しかし短所もあり、

  • Height Mapの1Pixelを1mに拡大するため、細かい地形は変な凹凸が存在する
  • MaskをLayerとして指定するためか、LandscapeをNaniteに変換出来ない。(するとLayerが消える)

があり一部の人が強力に勧めるほどの完全無欠ではない気もしています。

3つ目のやり方はEpic Game社がUE5のデモであるVally of the Ancientなどで

やっているやり方で、Landscapeを全く使用しないで全部Static Meshで作成する方法です。

このやり方はあまり詳しくないので推測で話すだけですが、

長所としては

  • 遠くも近くも本物そっくりな地形を作成出来る
  • 全部にNaniteを適応出来る

などが考えられます。

短所というか現状不明な点としては

  • 巨大なMapを作成するにはそれなりに時間と人力が必要な気がする
  • Textureの調整やFoliageの配置がどうなっているのか不明

と思っています。

この三番目の方法はEpic Game社がUE5のデモで採用している方法なので将来的に一押しされる可能性もあります。

後、Static MeshをOpen World全体に配置するのはFoliageで自動で生成しないとかなり辛いと思いますが、その辺がどうなっているのか不明です。

これらの方法を比較すると一番目の方法は論外で、労多くて益少なしです。

非常に大きなマンパワーを要求する代わりに、完成品の質が低く、アニメ風などのStylizedな地形を制作する場合などの場合を除き商業として耐えられないLevelのものしか生成出来ません。

それに対して圧倒的に沢山の専門家が推すのが二番目のやり方です。

Gaeaで作成したHeight MapやMaskをUE5にImportしてLandscapeを作成するやり方で、簡単に広大でPhoto-RealisticなMapを作成出来ます。

しかし実際にこのやり方でLandscapeを作成してみると色々な問題もある事が分かります。

例えば遠くの地形はそれは非常に綺麗に作成出来ますが、近くの地形はかなりの不自然な凹凸が生成されています。

そして三番目のやり方です。

このやり方はよく分かりませんが、いずれ主流になる可能性もあります。単にStatic Meshを並べるだけですので近くの地形の凹凸が不自然になる事もありません。

しかし現時点ではこのやり方でOpen Worldを作成する方法はよく分かりません。

ので。しばらくの間は二番目の方法に三番目の方法で補佐するやり方でLandscapeを作成するのが最適だと思われます。

二番目のやり方でOpen Worldの大まかな地形を作成して細かい凹凸の不自然さはNaniteを使用したStatic Meshで補正する方法です。

と言う訳で二番目のやり方はOpen Worldの作成方法として当分の間主流になると思われます。

この二番目のやり方の中でMaskの作成はMaterialのLayerの形状を指定するのに直結するので核に当たる部分になります。

はい。

なので、GaeaでMaskを作成するために必要な要素を全部、抜き出していた先週のまとめは非常に重要になる訳です。

6.4 今週のGaeaの勉強のまとめ

今週は先週の勉強内容を綺麗にまとめようとしてまとめきれなかったですね。

まあ、しょうがないです。

これは反省して、来週までにどうすればもっと分かり易くまとめる事が出来たのか考えておきます。

7.Houdiniの勉強

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

7.1 Accessing Toolsの続きを勉強する

思い出しました。

先週は突然、花粉症みたくなって鼻水が止まらなくなって途中で中止したんでした。

今週は先週の残りをまず終わらせます。

と思ったら先週のDataがありません。たしかにSaveしたはずですが見つかりません。

仕方ないです。最初から作り直します。

何回やっても以下の部分のねじれが戻りません。

Tutorialを何回も見直したらやっと原因が判明しました。

以下に示したDefault Pairing Shiftの値を変更します。

1に変更しました。

結果です。

Default Pairing Shiftはそういう意味だったのか。

もう途中で止めようかと思いましたが、怪我の功名です。

やっと先週の箇所まで作成する事が出来ました。

今度はここで一回Saveして休憩します。

休憩してきました。

一個前のNodeであるVoronoi fractureノードを選択します。

Cupが砕ける前の形状に戻ります。

Nを押して全てのPrimitiveを選択した状態でTabを押してTransformを選択します。

NodeにTransformが追加されました。

以下の様に位置を変更しました。

Nodeの繋ぎを以下に示した様に変更しました。

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

更にRBD Bullet Solverノードを追加します。

RBD Bullet SolverノードのParameterのCollisionの

Ground TypeをGround Planeに変更します。

次にPropertiesに移動し

Densityの値を10000にします。

Playを押します。

Cupが

落ちて

地面に当たって

Cupが砕けて

終わります。

以上でした。

本当は次のTutorialもやる予定でしたが、途中で詰まった所でかなりの時間とエネルギーを使ってしまいやる気が起きません。

一寸、短いですが今週のHoudiniの勉強はここまでとします。

8.Volumetric Cloudの勉強

DaVinci Resolveの勉強の続きをします。

8.1 DaVinci Resolve 18 - Full Tutorial for Beginners [9]の続きを勉強します。

<Split Clips with Blade Tool>

 以下のカミソリのIconを選択して

切りたい場所を選択してClickします。

<Delete Clips on Timeline>

以下のように動画の真ん中の要らない部分をカットしたとします。

この要らない部分を消します。

消し方は色々あるそうですが、今回は要らない部分を選択して

Back Spaceを押します。

結果です。

要らない動画は消えましたが、動画の間に空間が出来ています。

この部分を再生する時は

以下のような真っ黒な画面が表示されています。

全てのClipは繋がっているべきです。

この隙間を埋める方法を以下に示します。

隙間を選択します。

この状態でもう一回Back Spaceを押します。

すると隙間が無くなります。

もしくは消したいClipを選択した時点で

Deleteを押します。

選択したClipが消えた上に隙間も無くなりました。

<Track/Layer>

もしClipを移動したい時は、移動したいClipを選択して

左右に移動させるか

選択したClipを上に移動させて

別なLayerに移動させてから移動します。

同じ時間帯に2つ以上のLayerにClipがある場合は番号が大きい方が再生されます。

<Moving Clips on Timeline>

複数のClipを同時に移動したい場合は、

移動したいClipを全部選択すれば良いです。

<Adjusting View>

TimelineのViewを調節するためには以下のIconを使用します。

Timelineが以下の様になっていたとします。

マイナス側に移動すると

Zoom Outします。

プラス側に移動すると

Zoom Inします。

またAltを押した状態でMouseのWheelを回転させても同じ効果を示します。

いやそのZoomよりもClipの高さを調節したいんです。

と思ったらそのやり方も解説していました。

高さを変更したいClipを選択して

Shiftを押したまま、MouseのWheelを回転させるそうです。

これは高さを変更したいClipを選択するんじゃなくてCursorを乗せるんでした。

後、Audio1の高さを調整するとAudio2の高さも同じように調整されました。

確かにこれらの機能を使用したら以下に示した様に

TimelineのViewの表示をかなり自由に変更する事が出来ました。

MouseのWheel Buttonを押した状態でMouseを移動させると

Timelineの位置を移動出来ます。

MouseのWheel Buttonを押した状態でMouseを移動します。

Timelineの位置が移動しました。

<Build a Story>

ここはAppend Endの使用方法の説明でした。

Media Pool内にある動画をDouble Clickして

Source Viewerに映像を表示させます。

この映像をTimeline Viewerに移動させると以下に表示したBoxが現れます。

ここでAppend Endを選択すると

以下に示した様に前のClipのすぐ後にこのClipを追加してくれます。

何でこの機能をBuild a Storyと紹介するのかと思ったら、これで動画のあらすじを大体完成させてしまうからだそうです。

<Add Audio/Music>

BGMの追加方法です。

基本的に動画と全く同じです。

動画についている音が要らない場合は、以下のMを押すと動画の音はMuteされるそうです。

<Adjust Volume>

Audioの音量の調整方法です。

まずZoom inして調整したい音のTimelineを大きくします。

白い線を選択します。

Screenshotでは表示されませんが、赤い線で書いたようなCursorが表示されます。

この状態で左ClickしながらMouseを動かすとそのAudioの音量を調節出来ます。

少しだけ音量を小さくしてみました。

もっと精密に音を調整したい時は、

Audioを選択した状態で

右上にあるInspectorを開きます。

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

この中のVolumeで音の大きさを調整出来ます。

もしDefaultの値に戻したい時は以下のResetボタンを押します。

以下のResetボタンは全部のParameterをDefault値に戻すそうです。

<Fade Audio and Video>

Shift + Z

だそうです。

以下の状態でShift + Zを押しました。

結果です。

いやこれはFade OutはFade Outかもしれませんが、そういう意味じゃねーだろう。

と思ったら次の画面で説明していました。

CursorをClipの端に合わせると以下のような矢印が表示されます。

この矢印を引っ張って移動させると以下のようになります。

この斜線に従って音が小さくなるそうです。

試してみます。

うーん。

正直よく分かりません。

Videoの方で試してみました。

こっちは画面が真っ黒になったので変化したのが分かります。

<Adjust Brightness>

次は動画の輝度を調整します。

Colorを選択します。

以下の画面が表示されます。

輝度を調整したいClipを選択します。

Offsetの以下のDialを回して輝度を調整します。

少しだけ暗くしてみます。

Edit画面に戻って変化を確認します。

Timeline Viewerの右上にある赤い線で囲んだIconをOn Offする事で輝度の調整後と調整前を比較出来るそうです。

Offにしてみました。

画面が明るくなっています。

<Insert Text>

今度はTextの追加です。

Logoを表示する方法を紹介するそうです。

まずTool BarにあるEffectを選択します。

そして左下にあるToolboxのTitlesを選択し

Textを選択しTimelineにDragします。

普通のClipとして追加されました。

Textを選択したままInspectorを開くと以下のBoxが表示されます。

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

TextureがFade Inするようにしました。

あんまり良くないので以下の様に変更しました。

文字が段々消えていきます。

これなんか昔の教育テレビの番組みたいです。

まあ、でもTextureの基本は理解しました。

後、Tutorialでは以下のBoxにあるTransformの使用方法についても説明していましたが

あんまり興味ないのと直感で理解出来るのでこれは省きます。

<Dynamic Zoom>

次はInspectorにあるDynamic Zoomについてです。

これをOnにするとそのClipを少しずつZoom Inしながら写します。

Dynamic ZoomをClickすると以下の様なParameterが表示されます。

ここでSwapを押すとZoom InとOutが逆になります。

<Transitions>

ClipのつなぎにTransitionを追加する事も出来ます。

EffectのToolboxにあるVideo Transitionを選択します。

色々な種類があります。

試しに追加してみました。

Tutorialがやっているように2つのClipの間に置く事は出来ませんね。

まあ、Versionが違うのかもしれませんし、深く追求しても仕方ないでしょう。

結果です。

げ。

Trimmingで切った部分が表示されています。

Transitionを追加する時はこの辺の事も考えて作成する必要が有りますね。

<Keyboard shortcuts>

やっとここまで来ました。

Shortcut Keyで知っておくと便利なのは

  • j:後ろ向きに再生
  • k:再生を止める
  • l:再生

だそうです。

後はDaVinci Resolveを開くと以下に示したBoxが表示され

Keyboard Customizationを選択したら、以下のShortcutの一覧表が表示されます。

<Render Video>

最後にRenderingの方法についてです。

Fileを選択しQuick Exportを選択します。

以下のBoxが表示されるのでYouTubeを選択し

直接UploadするならSign inしてExportします。

<Wrap Up>

特にないです。

これ以上の本格的なDaVinci Resolveの使用方法の基礎を学びたい人には、別に8時間のTutorialがあるそうです。

一寸だけ後で見てみます。

8.2 DaVinci Resolve 18 - Full Tutorial for Beginners [9]を勉強した感想

大体の使い方は理解しました。

取りあえずこれでVolumetric Cloudの動画を撮って編集してみます。

それからどうするのかを考える事にします。

また花粉症になってしまったみたいで、滅茶苦茶くしゃみが出て止まらなくなってしまいました。

今週のVolumetric Cloudの勉強はここまでにします。

9.DirectXの勉強

9.1 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [4]のCreating Olympusを実装

Episode2をDuplicateしてEpsoide3を作成しました。

Epsoide3のSolutionを開きます。

特に問題は無いみたいです。

Playを押して実行してみます。

普通に実行できました。

ではEpsoide3で実装の続きをやっていきます。

新しいProjectを追加しました。

名前はTutorialの通りOlympusと名付けました。

Blank ProjectでやったようにFile名を変更します。

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

見やすくするためにSource Fileを作成してその中にPrivateとPublicを移します。

Switch Viewを押してFolder Viewを選択し

Episode3のFolderを表示します。

この後、先週のBlogには以下の様に

Fileを追加します。と書いていますが

FileじゃなくてFolderな気がします。

Tutorialを見て確認します。

やっぱりFolderを追加していました。

Folderを追加します。

追加したFolderの名前をSourceにしました。

このFolderに

Olympus.hとOlympus.cppを追加します。

これらはFileから作成していました。

FileはHeader fileやSource FileのFileでFolderはFolderを指していました。

よく考えたら当たり前ですが、先週はこの2つを逆の意味で使用してしまっています。

これからは間違えないように気を付けます。

またSolution Viewに戻って来ました。

またFileとFolderを間違えて使用しています。

あれ、でもSolution Viewの場合、実際にFolderを作成する訳じゃなくて仮想的なFolderを作成しているはずです。

そうだ。

思い出しました。

先週は、仮想的なFolderだからFolderと呼ぶべきじゃない。と考えてFileと呼んだんでした。

でもFileは完全に間違っています。

あ。

Filterって呼んでいます。

Filter、Folder、File。

この3つの用語を適当に使用していました。

  • Solution Viewの仮想的なFolder:Filter
  • Folder Viewの本当のFolder: Folder
  • .hや.cppなどのFile:File

これが正しい名称です。

それではSource Filterに新しいFilterを追加します。

名前はpchにします。

そしてこのpch Filterに先程作成したFileである、Olympus.hとOlympus.cppを追加します。

今度はPropertiesの設定を行います。

まず使用しないX86を外します。

次にGeneralのOutput Directoryの値を変更します。

TutorialではBlank Projectの値をCopyすれば良いと書かれています。

私のBlank ProjectのPropertiesを開いたらOutput Directoryの設定が消えています。

えー。

一寸待ってください。

Copyする前のSolutionも調べましたが全部、消えていました。

うーん。

何で?

これってひょっとしてBlank Projectの方も直さないといけないヤツなんでしょうか?

調べたら2022-10-23のBlogでBlank Projectの設定を直しています。

うーん。

まずこれに沿ってBlank Projectの設定を直します。

そしてそれをOlympus ProjectにCopyする事にします。

いや、その前にこのOutput Directoryが何を指定しているかを調べて、指定した通りになっているのかを調べる必要があります。

うーん。

面倒くさい。

New Bingに聞いてしまいます。

そりゃ、OutputしたFileがOutput Directoryに入るのは分かります。

でもBuildした後にOutputされるFileが具体的に何なのかがわからないんです。Exe fileなのかそれともその前のCompileした後のFileなのかが分からないんです。Buildした後と言っているのでCompileしてLinkした後であるのは間違いないはずです。

これも調べるのが面倒臭い。

New Bingに聞いてみます。

もうExe FileやConfiguration Fileだと言っています。

今のOlympus ProjectのOutput Directoryの設定は以下の様になっています。

これはDefaultの設定でしょう。

Blank ProjectのOutput Directoryの設定は

となっています。

本当は以下の様になってないといけないはずです。

Episode3のFolderを見てみます。

これがSolutionDirに当たるはずです。

うーん。一応Build Folderはありますね。

Build Folder内を見ます。

BlankProjectがありました。

これは$(ProjectName)に当たりますね。

BlankProject Folderの中を見ます。

Debug。

これは$(Configuration)に当たる訳か。

うーん。あっている?

Configurationは今回はDebugを選択しているはずなのでこれはあっていそうです。

Debug Folderの中を見ます。

Exe.Fileがありました。

これもNew Bingの回答通りで、Output Directory内に生成させるFileはExe.Fileでした。

これは出来てるの?

他のSolutionのProjectのOutput Directoryを見てみます。

DirectXの魔導書のCh3です。

これも<different option>になっています。

Output DirectoryのEditを開いたら以下の様に本当のPassが表示されました。

以下に実際のExe fileがある場所を示します。

Output Directoryの指定とはx64 Folderが間にある所が違いますね。

それ以外は同じです。

しかしOutput DirectoryのEditを選択したら本当のPassが表示されるみたいです。

OlympusのEpisode3に戻って試します。

本当のPassは表示されません。

うーん。

大体理解しました。

この<different options>は本当のPassじゃなくて、Macroか何かで本当のPassは別の場所に保存されていると思われます。

もしそうでなかったらBlankProjectのExe Fileが最初にOutput Directoryに指定したPass通りの場所に生成される訳がないからです。

となると

Olympus ProjectのOutput Directoryでもこの<different options>をCopy Pasteすれば同じ結果になる可能性が高いです。

それが駄目な場合は、Olympus ProjectのOutput DirectoryもBlank ProjectのOutput Directoryに指定したPassを指定すれば良いと考えられます。

更に、BlankProjectのOutput Directoryは直す必要はないです。現状正しい場所にExe Fileが生成されているからです。

Olympus ProjectのOutput Directoryは以下のような設定に変えました。

適用を押します。

Visual Studioの設定は英語にしていてもこの辺は日本語が出て来ますね。

不思議です。

今度はIntermediate Directoryの設定をBlank Projectからコピペしています。

コピペ出来ないのでこれも自分で打ち込みました。

Blank ProjectのIntermediateはどこにあるのか確認してなかったです。

にありました。

いやこれがIntermediate Directoryなのかよく分からないんですが。

以下のFileが入っています。

Log FileとかObject Fileがありますね。

New Bingで聞いてみます。

Object File、Manifest File、そしてResource Fileと書かれています。

まあObject Fileがあるしここで合っていると思います。

となるとやっぱりBlank Projectの<different options>には元の設定が残っていますね。

次にConfiguration TypeにDynamic Library (.dll)をセットします。

次はWindows SDKのVersionの設定です。

これはBlank Projectと同じVersionを使用します。

しました。

C++ Language Standardの設定ですが、

2022-10-23のBlogを見ると以下の様になっています。

最新盤はC++20ですが、ここはBlank Projectと同じにします。

何故なら先週のBlogで以下の様に述べているからです。

以下の様にしました。

今度はC/C++のPrecompiled Headerの設定を変更します。

あれ、2022-10-23のBlogではこの後、Blank ProjectのLinkerのSystemの設定を変更しています。Olympus Projectではその設定は変更しなくていいんでしょうか?

Tutorialを見て確認します。

確かにC/C++のPrecompiled Headerの設定を変更していました。

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

同じように変更しました。

これでPropertiesの設定は終わりです。

今度はOlympus Fileの実装を行います。

Olympus.cppに以下の実装を追加します。

Olympus.hには以下の実装を追加します。

これが終わったらまた、Propertiesを開き

LinkerのSystemのSub Systemの設定を

Not Setにします。

次はConfigurationの設定をDebugにして

C/C++のPreprocessorの設定を

に変更します。

更にConfigurationの設定をReleaseに変更して

Preprocessorの設定を

に変更します。

ここで先週のTutorialは終わっています。

ので今週の実装もここで終わりにします。

一応、C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [4]のCreating Olympusを見て抜けが無いか確認をして終わりにします。

はい。

特に抜けは無かったですが、もっと重要な情報がありました。それはさっきのPropertiesの<different option>の意味です。

これはよく読んだら言葉の通りだったんですが、

DebugとReleaseで設定が違います。

と言う意味でした。

さっきのBlank ProjectのPropertiesをもう一回開いて、

Configurationの設定をDebugに変更したら

2022-10-23のBlogに記録された通りの設定が出て来ました。

あれ。

でもBlank ProjectのPropertiesの設定ってConfigurationはAll Configurationだったはず。

C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [9]を見直して確認します。

はい。

ConfigurationはAll Configurationになっています。

ここは来週直します。

9.2 「DirectX 12の魔導書」の「3.3 画面色のクリア」を読む

先週で一応、「3.2.2 DirectX D12の初期化」の勉強と実装が終わりました。

今週は次の節である「3.3 画面色のクリア」を読む事にします。

この節ではDirectXに命令して画面の色を変更させるそうです。

あれ、でもまだD3D12CreateDevice()を使用して

ID3D12Device型のObjectを作成しただけです。

これからこのObjectを使用してCommand Queueとかを生成すると思っていたんですけど。

まあ良いです。とりあえず読んでみます。

読んだら直ぐにCommand ListやCommand Queueの説明がありました。

Command ListやCommand Queueの細かい説明を読む前に

これだけ確認しておきます。

後、「Direct3D 12 ゲームグラフィック実践ガイド」を勉強していて謎の存在だったSwap Chainについての説明もあるみたいです。

パラパラっと全部読みました。

実装方法などの細かい点は飛ばして、それぞれの言葉の定義についての説明を読みました。

以下の用語の説明がありました。

  • Command List
  • Command Queue
  • Swap Chain
  • Render Target View
  • Descriptor
  • Descriptor Heap

この中でRender Targetは初めて聞く用語です。

Descriptor Heapについては「HLSLの魔導書」に以下の解説がありました。

まずSwap chainについてですが、この用語の示す事は簡単でした。

DirectX12では画面の切り替えをSmoothに行うためDouble Bufferingが採用されています。

これは今映している画面の裏側でその次に移す画面を予め作成しておいて画面の切り替えを瞬時に行うという良く聞くやり方の事です。

このDouble Bufferingを行うために必要なのがSwap Chainだそうです。

Command ListとCommand Queueに関しては以下の図以上の解説は無かったです。

この図さえ理解しておけば、大体十分です。

Command Listが有るがゆえに、遅延実行と言うものが生じるという説明がありました。

概念的には理解しましたが後でTestして試してみます。

Descriptorですが、GPUのMemoryの用途について指定するもの。と説明されていました。

これって2023-02-26のBlogの「DirectX 12の魔導書」の所で勉強したSemanticとは違うんでしょうか?

これこそGPUのMemoryの使用方法を指定していますよね。

Render Targe ViewはBufferをViewに変換するもの。とだけ理解しました。

これが何なのかは実際の実装する時に勉強します。

今週の「DirectX 12の魔導書」は以上です。

9.3 HLSLシェーダーの魔導書を勉強する

先週、何を勉強したのか忘れてしまったので先週のBlogを読み直します。

思い出しました。

まず教科書の勉強ですがChapter2が終わりました。

後、Sample CodeのCreateDevice()関数のCodeを読んでいて最初のParameterであるUseAdapterの初期化に必要なdxgiFactoryの生成方法の実装を途中まで読んだ所で終わっています。

先週のBlogの最後には

と書かれています。

正直、もうCreateDevice()関数の作成方法には興味が無くなってしまいました。

その次の段階である作成したDevice Objectを用いてCommand ListやCommand Queueを作成する方法に興味が移ってしまっています。

今週はChapter 3を軽く読む事にします。

まず「3.1座標変換」を軽く読みました。

ここはWorld Space、Camera Space、そしてScreen Spaceとは何かとかその変換についての概念的な説明をしています。

この辺はOpenGLで勉強した内容と同じです。

後、変換するための行列がDirectXOpenGLでは違うみたいな話しをOpenGLを勉強した時に聞いたんですが、その辺についての情報は書いてなかったです。

もう一つ、Screen Spaceは2次元と書かれていましたが、これって正しかったのか覚えていません。

Pixel Shader内でScreen Spaceに変換されるんでしたっけ。

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

ここでやる実装ですが、こっちがかなり面白そうです。

Signatureを作成したり、Descriptorを作成しそこに定数Bufferをセットしたりしています。そのDescriptorを更にDescriptor Heapにセットしたりもしています。

この辺はじっくり勉強する事にします。

9.4 「Direct3D 12 ゲームグラフィック実践ガイド」の「2.3 Direct X 12の初期化処理」の勉強の続き

今週はSwap Chainの生成をやります。

まずは教科書の「2.3.3 Swap Chainの生成」を勉強します。

こんなに沢山あるの?

正直、もう全部勉強する時間はないですね。

今週は出来る所までやる事にします。

まずはDouble Bufferingについての説明です。

ここではDouble Bufferingについてかなり詳しい解説が書かれていました。

これ読んだら今までの私のDouble Bufferingの解釈が間違っているのが分かりました。

Double Bufferingが必要になるのはMonitorの画面の更新がGPUの画面の更新速度よりもはるかに遅い事が原因だったんです。

これ知りませんでした。

要するにMonitorに直接出力してしまうと、Monitorが画面にImageを表示しきる前にGPUがMonitorのImageを(部分的に)書き換えてします訳です。

これを防ぐためにMonitorに表示しない画面を一枚裏に作成しておいてそこの画面をGPUに変更させます。そしてその裏で作成した画面を表の画面とSwapします。

うーん。

この説明も良く分からん。

裏のImageが完成して表のImageとSwapするまでの間はGPUの画像の出力はどうしているの?

結局、待っている訳でしょう。

だったら、画像が一枚の時もMonitorがその画像の表示を終わるまで待っていればいいじゃないですか。

後、Frame/Secondが144だった場合、

MonitorのHzは72あれば良いって事なんでしょうか?

それともやっぱりMonitorのHzも144必要なんでしょうか?

これも良く分かりません。

まあ良いです。

次のDXGI Factoryの生成を勉強します。

先週はこれが勉強したかったんですが、ここまでやる事が出来ませんでした。

教科書にはSwap Chainを生成するにはDXGI Factoryが必要なので、DXGI Factoryを生成するとだけ説明してありました。

Sample Codeを見たらDXGI Factoryは以下の方法で生成されています。

はい。

ここからが先週の疑問に対する検証になります。

DirectX 12の魔導書」はDXGI Factoryを

複数あるVideo Cardの中からNVidiaのVideo Cardを探すために使用しました。

しかしここでは、Swap Chainを作成するために使用しています。

この2つが本当に同じDXGI Factoryなのかどうかを確認します。

その後で、本当にDXGI FactoryにSwap Chainを作成したり、複数あるVideo Cardの中からNVidiaのVideo Cardを探すために必要なAdapterを作成したりする機能があるのかを確認します。

DirectX 12の魔導書」で使用されているDXGI FactoryはIDXGIFactory6です。

それに対して「Direct3D 12 ゲームグラフィック実践ガイド」で使用されているDXGI Factoryは

IDXGIFactory4

です。

更にIDGI Factoryを生成するために使用されている関数も

DirectX 12の魔導書」はCreateDXGIFactory2()関数ですが

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

CreateDXGIFactory1です。

これは厳密に言ったらこれらの教科書で使用されている2つのDXGI Factoryは同じじゃないです。

しかしIDXGI Factoryは番号が前のVersionを全部Inheritanceしているので、大体同じとは言えます。

そして

IDXGIFactory1 interface (dxgi.h) [10]で

EnumAdapter1()関数を得て、

その前のVersionであるIDXGIFactory interface (dxgi.h) [11]では

CreateSwapChain()関数とEnumAdapters()関数を得ています。

つまりIDXGI Factoryは、

  • 複数あるVideo Cardの中からNVidiaのVideo Cardを探すために必要なAdapterを作成する機能と
  • Swap Chainを作成する機能

の両方を持っています。

はい。

最後にIDXGI Factoryの実装だけ追加します。

今週はこれで終わりです。

10.まとめと感想

今週は時間がないのでまとめはなしです。

11.参照(Reference)

[1] Ben Cloward. (2022, November 3). Ice Shader Part 2 - Advanced Materials - Episode 6 [Video]. YouTube. https://www.youtube.com/watch?v=G-5bhff4f-M

[2] Andrea Cantelli. (2020b, June 6). Gaea Tutorial for Beginners #6 | Texturing our first terrain [Video]. YouTube. https://www.youtube.com/watch?v=d879QNdQG7U

[3] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[4] OlympusMonsTutorials. (2021, March 17). C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [Video]. YouTube. https://www.youtube.com/watch?v=YgZSSE3qZqA

[5] Unreal Sensei. (2021, April 23). How to Blend Objects with Your Landscape - UE4 Runtime Virtual Texturing (RVT) Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=xYuIDFzKaF4

[6] Cloward, B. [Ben Cloward]. (2022a, January 20). Triplanar Projection Normal Maps - Shader Graph Basics - Episode 30 [Video]. YouTube. https://www.youtube.com/watch?v=VUoI_IESK7U&list=PL78XDi0TS4lFD_8T8gkE29St8c__xIZV_&index=5

[7] Game Dev Academy. (2022, August 7). QUICK TRICK to Realistically BLEND ASSETS with LANDSCAPE | UE5 Runtime Virtual Texturing Tutorial. YouTube. https://www.youtube.com/watch?v=ATfzfvtvfIo

[8] Ben Cloward. (2020, January 30). Volumetric Ice Shader - UE4 Materials 101 - Episode 11 [Video]. YouTube. https://www.youtube.com/watch?v=X5WASspig3g

[9] OlympusMonsTutorials. (2021, February 17). C++ DirectX 12 Game Engine - [S01E01] - Creating Our First Window [Video]. https://www.youtube.com/watch?v=2vrEIhAajhM

[10] S. (2022, August 23). IDXGIFactory1 (dxgi.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nn-dxgi-idxgifactory1

[11] S. (2021, July 22). IDXGIFactory (dxgi.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nn-dxgi-idxgifactory