UE4の勉強記録

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

UE5の勉強 -映像作品としてのLandscapeを作成する-

1. 今週の予定

1.1 今週の予定

以下の内容を勉強します。

<Landscapeの作成>

先週完成したLevelが明るすぎます。明るさを調整する方法を調査します。

Niagaraの勉強>

先週、作成した白黒の炎の実装を整理してDesignerでも操れるようにMIを作成します。

<Materialの勉強>

Ben Cloward先生のAdvanced Material Seriesの勉強をします。

<Gaeaの勉強>

Earth and Space Sciences XのLecture 10の続きを勉強します。

GaeaのTutorialの作成の続きをやります。

<Houdiniの勉強>

Free Time Coder氏のUnreal PCG Tutorial [1]の続きを勉強します。

<UEFNの勉強>

インベーダーゲームを作成するためにUEFNのTutorialを勉強します。

<DirectX12の勉強>

DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強をやります。

2. Landscapeの作成

2.1 先週の復習

先週で一応Unreal Engine 5.1Beginner Tutorial - UE5 Starter Course 2023 [2]の実装は終わりました。

しかし明るすぎます。

先週でも最後に以下の様に述べています。

今週はこれについて検証します。

2.2 HDRを切ってみる

この原因は光が強すぎるのか壁が白過ぎるのかは分かりません。

しかしまずはHDRを切ってみましょう。

やり方を調べます。

うーん。

暗闇に入ったら暗い部分が明るく見えて来るのがHDRだと思っていたんですが、なんか説明を読むと違っていますね。

あれ?

Eizo社のHomepageにある「HDRとは[3]」を見ると

画面の一部が白く飛んでいるのはHDRを使用してないからと解釈出来ます。

うん。

そうなのか?

色々調べたらUE5ではDefaultではHDRはOffになっているみたいです。

更に調べたら、どうやら私がHDRと思っていた「暗闇に入ったら暗い部分が明るく見えて来る」のはTone Mappingというのが正しいみたいです。

うーん。

よし。

HDRは一端中止します。

UE5で映像を作成する人達がどのような設定をしているのかを調べる事にします。

2.3 もう少しだけHDRとTone Mappingについて調査する

とは言ってもHDRやTone Mappingについて全く理解していないまま先に進むのも気が引けます。

UE5で映像を制作する場合の設定を調べる前に、一寸だけこれらを勉強する事にします。

まず公式のDocumentに以下の項目がある事を見つけました。

ここから勉強する事にします。

Color Grading and the Filmic Tonemapper [4]を読みます。

UEではTone MappingはColor Gradingと言うそうです。

<Tone Mapping>

まずTone Mappingについて解説しています。

あれ?

Tone Mappingって「暗闇に入ったら暗い部分が明るく見えて来る」事じゃないの?

分かりました。

西川善司氏の「ゲーム制作者になるためのグラフィック技術、増補改訂版」[5]の「Chapter 7 HDRレンダリング」を読み直したら分かり易く解説してありました。

この本はかなり昔に買って本棚にずっと置きっぱなしになっていたんですが、突然「確かこの本にHDRと暗闇に入ったら暗い部分が明るく見えて来る事について説明があったはずだ。」と思い出しました。

今、読み直すとHDRやTone Mappingについて素人でも理解出来るように簡単な表現を用いながら、しかし非常に正確な解説がされていました。

この本のHDRの解説によれば、このHDRからLDRへの変換をする時にその画面の平均輝度からのRangeで変換するそうです。

明るい場所ではこの平均輝度の値が大きくなり、暗い部分は単なる黒になります。逆に暗い場所に移動すると平均輝度の値は小さくなり、今まで単なる黒で表現されていた箇所に色々な色が見えるようになります。

その結果として「暗闇に入ったら暗い部分が明るく見えて来る」わけです。

つまりTone MappingはHDRからLDRに変換する事を指します。

しかしその行為の結果として「暗闇に入ったら暗い部分が明るく見えて来る」ようになります。

のでこれはどっちの定義も正しいわけです。

うーん。

でもそうするとUEではDefaultではHDRを使用していないはずなのに、なんで「暗闇に入ったら暗い部分が明るく見えて来る」んでしょうか?

やっぱりDefaultでもHDRは仕様しているんでしょうか?

<Academy Color Encoding System (ACES) Filmic Tone mapper>

UE5で使用されているFilmic tone mapperは業界の標準であるAcademy Color Encoding Systemを使用しているそうです。

そもそもAcademy Color Encoding Systemという名称自体、初めて聞きました。

Academy Color Encoding System単体の説明を読んだんですがあんまり理解出来なかったです。それよりもこのPageで2つの例を用いた説明の方が分かり易いです。

まずBloomです。

Academy Color Encoding Systemを用いたTone MappingではBloomは以下の様になります。

以前のRenderingでは以下の様になります。

これは理屈はともかく、違いは分かり易いです。

次の例です。

Exposure Levelsだそうです。

まずAcademy Color Encoding Systemを用いたTone Mappingを使用した場合です。

因みにAcademy Color Encoding Systemを用いたTone MappingはFilmic Tone Mapperと呼ぶそうです。

以前のRenderingの場合です。

こっちはどこに注目すれば良いのか分からないです。

一寸解説文を読んでみます。

分かりました。

まず元のSampleですが以下に示した様に、横に色々な色、縦にRoughnessが1、Roughnessが0、そしてMetalが1の設定になっています。

このSampleではExposure Levelは0にセットされています。

ここでExposure Levelを3に変更します。

すると従来のRenderingでは

金属の質感も表面のざらつきも全く分からなくなってしまいました。

ところが、Filmic Tone Mapperだと、

以下に示した様に

金属の質感も表面のざらつきもそれなりに認識出来ます。

成程。

Exposure Levelsが何を指しているのはは今一分かりませんが、Filmic Tone Mapperの利点については理解出来ました。

Exposure LevelsでGoogleたら以下の解説が出て来ました。

多分、似た意味で使用されているんでしょう。

<Legacy Tone Mapper>

ここではUE4.15からFilmic Tone Mapperが標準になっているのでその前のTone Mappingに直したい場合の方法について解説しています。

今ではあまり必要ない話ですのでSkipします。

この中の話で一寸だけ重要かと思うのは、この値を調整するのに

Post Process VolumeにあるFilm sectionの以下の値をいじっている事です。

UE5を開いて確認します。

同じParameterがありました。

<Film Settings>

先程出てきたFilmのPropertyを使用して別なTypeのfilm stockに変更する事が可能だそうです。

Film Stockって実際は何かを指しているでしょうか?

Filmic Tone Mapperと以前のTone Mapper以外のFilm Stockもあるんでしょうか?

もしあるなら一覧表みたいのが欲しいですね。

こういうFilm Stockがあってこんな特徴があります。これに設定するにはこれらの値は以下の様にします。みたいなのが。

後、以下の忠告がありました。

Project全体でTone Mapperの設定を変更する時がこのParameterを変更しますが、あるSceneだけとかDynamicに変更したい場合はColor Gradingを使用した方が良い。って書いていますね。

成程。

因みにColor Gradingはこの次の節で説明されています。

この後で、Film SectionにあるそれぞれのParameterの機能について解説しています。

<<Slope>>

最初のParameterであるSlopeについての説明です。

Default値である0.88の場合です。

0.6に落としました。

こんなに違うの!

光が差し込んでいる所が暗くなっています。

早速試してみました。

Defaultの場合です。

Slopeの値を0.6に変更しました。

うーん。

確かに地面の不自然なテカリは消えましたが、全体的に絵っぽくなってしまいました。

<<Toe>>

次のParameterです。

これは暗い色をAdjustするそうです。

どうAdjustするんでしょうか?

まず以下にDefault値である0.55の結果を示します。

これが0.8になると以下の様になるそうです。

影の部分がもっと黒くなっていますね。

これも試してみましょう。

Toeの値を0.8にしてみました。

比較用の標準も以下に示します。

うーん。

成程。

これも標準の設定の方が写真みたいですね。

地面のテカリも直っていません。

<<Shoulder>>

これは明るい色の方を調整するParameterだそうです。

標準値の場合です。

Shoulderの値を1に変更しました。

明るい部分の色がきつくなっていますね。

うーん。

これを上手く使用したら地面のテカリを直せるかもしれません。

試してみましょう。

Shoulderの値を0.01にしてみました。

地面が明るすぎる問題は直っていませんが、少しはましになった気がします。

ああ、何が問題か段々分かって来ました。

これ夏の日差しのように光が強いのに冬の日差しのように光が白いんです。

うーん。

どう直したらいいんでしょうか?

<<Black Clip>>

この値は調整するな。って書かれていました。のでSkipします。

<<White Clip>>

この値は、光が当たっている箇所が微かに変化しています。

非常に微妙な変化であまり意味はないかもしれません。

一応、試してみます。

差は見られませんでした。

<Color Correction>

別名をColor Gradingと言うそうです。

Post Process VolumeのColor Gradingには以下の項目があります。

これ全部勉強するの?

結構大変そうです。

試せる所だけやってみます。

まず温度を上げてみましょう。

夏の日差しなので夏っぽくしたいです。

結果です。

あれ?

良くないですか?

以下に比較のために標準のScreenshotを追加しておきます。

ほら。

全然違います。

以下の様に解説されていました。

うん。

これは偶然ですが当たりを引いたみたいです。

<<Workflow for Good Color Correction>>

ここはColor Correctionをするための手順が紹介されています。

このやり方で本当に色が調整されているなら従いますが、そんな証拠はどこにもありません。

参考程度に見るにとどめておきます。

今週のLandscapeの作成のための時間はもう無くなってしまいました。

のでここでお終いにします。

2.4 今週の勉強内容のまとめ

以下に今週の勉強の内容を簡単にまとめておきます。

  • HDRは「暗闇に入ったら暗い部分が明るく見えて来る」事ではなくTone Mappingがそれだった。
  • Tone Mappingは正確にはHDRからLDRに変換する行為の事を指している
  • そうすると「暗闇に入ったら暗い部分が明るく見えて来る」UEはHDRが効いているはずだか、DefaultではHDRは効いていないと書いてある。(これは謎)
  • Post Process VolumeのColor GradingにあるTemperatureの値を調整すると白過ぎる部分が緩和される事が判明した。

こんな感じです。

3. Niagaraの勉強

今週もAnime調の炎の調整をしていきます。

3.1 Smooth Stepノードの勘違い

まずSmooth Stepノードの機能を勘違いしていました。

以下の様に設定した場合、

0.2以上が白くなります。

この実装を作成した時は黒くなると思っていました。

以下の様に実装を改良しました。

Stepノードを追加してMaxより大きな値で白くなっている箇所を再現します。

それをSmooth Stepノードの結果から引きます。

最後にCeilをして0以上1以下の値を1に引き上げます。

結果です。

なんとこの時点で本来白いはずであるのに緑などの色がついています。

これはValueの値に以下のRGBを使用しているせいです。

Rの値だけ使用するようにします。

他の部分の実装も同じように直しました。

結果です。

3.2 色の指定はどこで行うべきか?

今回の実装では3つの部分で色を指定しています。

最も外側の黒い部分はMaterial内でConstantノードを使用して指定します。

次の赤い色はNiagaraにあるEmitter Stackの以下の場所にあるModuleから

指定しています。

最後の黄色はMaterial Instance内の以下のParameterで指定しています。

このようにNiagaraで作成したEffectは上記の3か所で色の指定が出来るようになっています。

この節ではどこで色を指定するのが最も適切なのかについて考察します。

色の指定はDesignerに任せて自分はProgrammingを書く方に集中した方が効率が良い訳です。

その観点から考えるとMIで色の指定が出来るのが一番良いです。

何故ならMIから操作する事はProgrammer以外でも出来るからです。

もう一つ、MIで管理した方が良い理由があります。

それはDirectorなどが後から手直しをしてくる場合の対策にもなるからです。

NiagaraやMaterialの実装を変更すると必ず予期しない副作用が発生して大手術が必要になります。Gameだったら工程が大幅に遅れるようになるでしょう。

このような変更はMIで出来る範囲に留めておけば、その場だけ試して終わりになります。

Directorとかだったら自分が望んだ表現がMIの変更だけでは表現出来なかったらそこで諦めるでしょう。

ので色の指定はMIで管理すべきとの結論になりました。

4. Materialの勉強

Ben Cloward先生のSharp Text Shader - Advanced Materials - Episode 18 [6]を勉強します。

4.1 Sharp Text Shader - Advanced Materials - Episode 18 [6]を勉強する

まず軽く全部見ます。

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

今回はUEが主で解説しています。ので結構長かったです。

Photoshopを使用したTextureの作成>

以下に示した様にTextureの文字の精度を

周りの環境Textureの精度に依存しないで表示する方法を勉強します。

以下に周りの環境Textureを2Kから512に変更した場合を示します。

環境Textureに直接書いた文字はぼやけてしまっていますが、今回勉強する方法で作成したTextureから作成した文字はまったくぼやけていません。

以下に方法をまとめます。

まずPhotoshopでTextureを作成します。

Photoshopは無いので、同様の事をGIMPで行います。

比較対象用の木材のTextureに文字を追加したものです。

Sizeは2Kです。

これはGIMPでも簡単に出来るはずです。

次に以下のImageを作成します。

Sizeは1280x128です。

ここからが何をやっているのかを判明するのが大変な所です。

まずLayerを選択してEffectsを更に選択します。

そしてそのEffectsからStrokeを選択します。

すると以下に示した様に

文字のEdgeがBlurになります。

因みにStrokeの設定は以下の様になっています。

何で、SharpなEdgeを持つ文字を表示するのにBlurを掛けるのかと言う質問に対して、これがSharpなEdgeを常に表示するために必要な工程だから。と回答しています。

私は一回、最後まで見てしまっているので、何でこれが必要なのかも知っているのでこの辺は既に納得しています。

ただ、これをGIMPで作成するにはどうすれば良いのかが分かりませんね。

このImageはGray Scale PNGでSaveします。

<ImportしたTextureの設定の確認>

UE5の操作に移ります。

最初のTextureです。

以下の設定になっているか確認します。

これは2048でもいいはずです。

0にするとそのTextureの最大のSizeに設定出来るそうです。

Base Colorに使用するためのTextureなので当然sRGBはEnableされています。

更にCompression Settingsは以下の様になっています。

次にImportしたTextureです。

文字のTextureです。

Compression SettingはGrayscaleを使用しています。

更にsRGBはDisableされています。

最後にMaximum Texture Sizeを0にします。

<Materialの作成>

今度はMaterialの作成をしていきます。

TextureをImportして普通のやり方で繋ぎます。

PreviewField of Viewを50.0に変更します。

これってCameraの視野角の事ですよね。

これを変更する事ってそんなに大事なんでしょうか?

今、軽く調べたらCameraの世界では画角という方が一般的みたいです。一般的なCameraの画角は45°みたいです。更に人間の視野角も同じ45°だそうです。

うーん。

そうなると何でUEのDefaultのField of Viewは90°なんでしょうか?

まあ良いです。

先に進みます。

ここで前のTutorialで作成したMaterial FunctionであるMF_TransformUVsを使用しています。

これ作成したかもしれませんが、前のPCはこの前久しぶりにDataを取り出すために電源を入れたら、火吹いて壊れてしまいました。

つまりDataが取れない状態になっています。

Moving, Rotating, and Scaling UVs - Shader Graph Basics - Episode 43 [7]のTutorialで作成したと言っています。

これは前に勉強した記憶があります。

調べたら2022-05-30のBlogで勉強していました。

うーん。

前のPCが壊れてしまったので、もう一回作成する必要があります。

実装する時はこの時のBlogを参考にして作成する事にします。

このMF_TransformUVsノードの結果をTexture SampleノードのUVsに繋ぎます。

次に文字のTextureとBase ColorのTextureを以下の様に混合します。

結果です。

文字のTextureのSizeを直します。

文字のTextureのSizeとBase ColorのTextureのSizeからScaleの値を計算します。

結果です。

文字がWrapされて何回も繰り返し表示されています。

Sample TextureノードのConst Coordinateの値をShared Clampに変更します。

結果です。

文字がRepeatしなくなりました。

今度は文字の位置を調整します。

結果です。

文字を近づいて見ると以下の様に

新しく追加した文字の方がぼやけています。

これを直します。

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

この結果をAddノードに繋ぎます。

結果です。

この時点で文字のEdgeがギザギザしていますが、ぼやっとしてる部分は直っています。

上記の計算でConstantノードを2つ使用していますが、MaxとMinimumと呼んでいました。

今の計算だと0で割っていますね。

これってErrorにならないんでしょうか?

今度はMaxとMinimumに以下の値を代入しました。

結果です。

文字のギザギザが消えました。

何で?

一寸考えます。

分かりました。

Minimum値を引くのでそれ以下の値は最終的には0になります。

Minimum値以上の値は(Max値-Minimum値)で割るので、1以上の値になります。

最後にSaturateして最大値を1に直すのでこのような結果になります。

以上です。

5. Gaeaの勉強

今週もGeologyの勉強とTutorialの作成の2つをやっていきます。

5.1 Geologyの勉強

Geology 10 (Sedimentary Rocks) [8]の続きを勉強します。

<Inorganic Limestone>

最初のSlideです。

何故かOrganic Limestoneの話です。

ますsecreteの意味が分かりません。

調べます。

だそうです。

この場合だとCalcium Carbonateを分泌する。って感じでしょうか。

CoquinaとChalkも調べます。

Coquinaから調べました。

当然、Geology的な意味なのでFlorida州の海岸で取れる貝は関係ないです。

Imageで検索してみます。

ぱっと見て貝と砂が結合して出来た岩みたいなのと須磨だけで出来た岩が表示されていますね。

Slideの定義どおりに解釈すると前者だけがCoquinaになるはずです。

発音もYouglishで調べました。

みんなコキィーヌァって言っていました。

後、例で出てきた動画でCoquinaは非常に頑丈で城の城壁や橋に使用されていたと言う説明がありました。

こういう話があると突然、面白くなります。

今度はChalkについて調べます。

嘘!

あのChalkの事なの?

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

しっかりとDeep Marine Conditions from the gradual accumulation of minute calcite shells.って書いてあります。

うーん。

しらんかった。

チョークってなんか体に悪いImageあったけどそんな事ないんでしょうか?

更にSlideでは以下の様にChalkの生成について述べていました。

ここでTestsと言っていますがこれは非常に小さい貝殻の事を指しているそうです。

Lectureの解説によると

これがChalkで、

それを顕微鏡で見たのか

これで、ここに写っているのがTestだそうです。

次のSlideです。

やっとInorganic Limestoneです。

InorganicなLimestoneは水の中のCalciumの割合が増えてPreciptateして作成されるそうです。

TravertineとOolitic limestoneの2種類が紹介されています。

Oolitic limestoneはSlideに写真がありますが、Travertineは無いです。

どんなものかImageが分からないのでGoogle検索しました。

これって大理石の事じゃない?

日本語で調べたら以下の解説が出て来ました。

Travertineはトラバーチンというみたいですね。

Travertineも面白かったですがOolitic limestone の話はもっと面白いです。

Slideにある以下の写真ですが、Oolitic limestoneが固まって一個の大きな岩になったそうです。

うーん。

化石にしか見えません。

<Chert>

次のSlideです。

Chertについてです。

微小なLevelで結晶化したQuartzが石になって生成されるそうです。

ぱっと見宝石と変わらないです。

<Chemical Sedimentary Rock>

要は溜まっていた水が蒸発して残った塩が結晶化したのがChemical Sedimentary Rockです。

Slideの左下に写っている写真は岩塩として利用される場合もあるそうです。

そう言えばピンク色の岩塩ってスーパーに売っていますよね。

<Salt Flats-Death Vally>

Chemical Sedimentary Rockは以下のSlideの写真のように、稀に平に形成される事があるそうです。

<Coal: An Organic Sedimentary Rock>

ここからOrganic Sedimentary Rockについての話になります。

このSlideの説明を読むと分かりますが、Coalつまり石炭の事です。

<Turning Sediments into Sedimentary Rock: Diagenesis and Lithification>

Sedimentがどうやって岩に変化するかについて解説しています。

ここで紹介されているCementationってセメント化のことでしょうか?

スィーメンティションって聞こえてセメントとは全然発音が違います。

調べます。

セメントの事でした。

<Identification of Sedimentary Rocks>

更に詳しい解説です。

Detritalってどういう意味かと思ったら

って書いてありました。

うーん。

これって既に勉強している単語。

Blog内を調べたら先週のBlogで勉強していました。

これ読んだら思い出してきました。

これを復習した後でこのSlideの左側の表を見たらやっとこの表が何をまとめているのかが理解出来ました。

で反対の右の表なんですが、一応Lectureの説明を聞いたんですが、複雑すぎてまだ理解出来ません。もう少しGeologyの知識が増えてからじゃないと本当の意味では理解出来ないです。

今回は軽く見て終わりにしておきます。

<Sedimentary Environments>

次のSlideです。

ここではどこでSedimentaryが起きているのかについて解説しています。

<Sedimentary Rocks Represent Past>

ここではSand StoneとShaleとLimestoneが出来る層について説明しています。

<Sedimentary Structure : Provide Additional Information>

Sedimentary Rockはその岩が生成された自体の情報を提供してくれるそうです。

StrataやBedは今まで何回もGaeaやこのGeologyの勉強で出て来ましたが、意味が今一分からない用語でした。

やっとここではっきり分かる定義に出会えました。

まずStrataとBedは同じ意味でSedimentary Rockの層を指す言葉だそうです。

Bedding PlaneはStrataとは違うと書かれています。

どう違うんでしょうか?

更にCross-beddingはSedimentary Rockが傾いているのを呼ぶと書かれています。

Lectureを聞いたらどう違うか分かりました。

Strataの層を分けてその一層をBedding Planeと呼ぶそうです。

更にCross-BeddingはStrataの層の向きが変わっているのを呼ぶみたいです。

<Cross-Bedding>

更にCross Beddingについての解説です。

ここではCross BedはStrataの向きが傾いていると言う意味で使用されていました。

この向きで傾いているのはこの時代では風が左から右に吹いていたからだそうです。

次のSlideです。

Sedimentary Structuresについてです。

Graded Beddingですが以下の写真が分かり易いです。

Turbidityの意味を調べた濁り具合って意味みたいです。

次の例です。

左下の写真は湖の底だった証拠だそうです。

<Energy Resource from Sedimentary>

Sedimentary RockとOilについてです。

このSlideの説明を読むとOil Trapと言うのが形成されるとOilや天然ガスがそこに貯蔵されるみたいですね。

Lectureの説明によると石炭は地上で生成されますが、Oilは海底で生成されるそうです。

<Common Oil Traps>

Oil Trapについて4つの例が紹介されています。

以上です。

5.2 GaeaのTutorialの作成

今週はもう時間が無くなってしまったのでこれはお休みします。

6. Houdiniの勉強

今週もHoudiniの勉強はお休みしてFree Time Coder氏のUnreal PCG Tutorial [1]を勉強します。

今週は先週勉強したUnreal 5.2 Preview PCG Tutorial - Part 6 - Sampling Meshes[9]を実装します。

6.1 Unreal 5.2 Preview PCG Tutorial - Part 6 - Sampling Meshes[9]の実装

今週からはUE5.3でテストします。

PCGのPluginを追加します。

どれを追加すれば良いのか分かりません。

全部追加してしまいます。

2023-05-22のBlogを見たらここでも全部のPluginを追加していました。

Pluginの種類が微妙に変わっていますね。

LandscapeはDefaultのTemplateのを使用します。

Maskを使用すると縞々になってしまう原因は分かりませんが、今回はDefaultを使用するので、このBugは無視できるでしょう。

このTutorialで使用する岩と木を探します。

一応、2種類ずつ準備しました。

サイズを調整したらなんとかなるでしょう。

Mesh to Pointノードが無いのでMesh Sockets to Pointsノードを代わりに使用します。

Static Meshに岩をSetしました。

結果です。

何も表示されません。

うーん。

これは使用した岩のSizeが小さすぎたのかもしれません。

もしくはこっちですかね。

Mesh to Pointノードを作成しました。

Static MeshにSM_Rockをセットすると

綺麗なPointが表示されました。

このPointは必ずWorld Positionの原点を中心に表示されますね。

Tutorialでやっているように岩を被せました。

Wireframeにして表示してみます。

三角形の中心にPointが生成されているのは確認出来ないですね。

Meshの数が多すぎてどの三角形の中心のPointなのか判別出来ないです。

以下の箇所でなんとか確認出来た感じでしょうか。

Points from VerticesにCheckを入れました。

結果です。

こっちはVerticesとPointsが一致しているのがすぐに確認出来ます。

Voxelizeの試してみます。

こっちは極端にPointの数が少なくなりました。

次をやります。

一端、設定を元に戻しました。

今度は岩の上に木を生やします。

Normal to Densityノードを追加します。

これでそれぞれのDensityの値はNormalが真上を向いている程1に近くなります。

結果です。

上から見た場合です。

白くなっています。

左から見た場合です。

白いPointと黒いPointが混在しています。

下から見た場合です。

ほぼ黒いPointsしかありません。

Point Scaleを調整します。

まずこのPropertiesを使用出来るようにするためにはScale Methodの値をRelativeかAbsoluteに変更する必要がありました。

Tutorialで確認したらRelativeを選択していました。

後、Tutorialと同じ0.1にしたら以下の様に

Pointがとんでもなく大きくなってしまったので、0.05に変更しました。

これだとPointの数が多すぎるので減らします。

Density Noiseノードを追加しました。

設定を以下の様にしました。

これで、Densityの値が0に近いPointが増える訳です。

結果です。

確かに増えています。

次にDensity Filterを追加しました。

結果です。

うーん。

これが多いのか少ないのか分かりません。

微調整は後でやります。

Static Mesh Spawnerノードを追加します。

結果です。

木が斜めに生えています。

PointのNormalかDensityの値に沿って生えているみたいです。

Static Mesh SpawnerノードのParameterでStatic Meshを垂直にはやす機能が無いか確認したのですが、無いみたいです。

Density Filterノードの設定を

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

結果です。

今度は許容範囲ですね。

でも木ではなく草を生やす事にします。

こっちの方がましですね。

他の草でも試してみました。

うーん。

もう少し緑色していたら良かったですね。

次の草です。

うーん。

これでやる事にします。

今度は沢山の岩の上に木を生成します。

Surface Samplerノードを追加します。

結果です。

Density Filterノードを追加してPointの数を減らします。

Static Mesh Spawnerノードを追加します。

Mesh Entryに岩のStatic Meshを追加しました。

結果です。

岩の向きが全部同じです。

Parameterを微調整して以下の様にしました。

そしてCopy Pointsノードを追加します。

更にCopy PointsのSourceにMesh To Pointsの結果を繋ぎました。

結果です。

おお、全ての生成されたRockの表面にPointが生成されています。

凄い!

この後は先程、作成した実装を追加するだけです。

結果です。

凄い。

近づいてみます。

凄いRealです。

6.2 Unreal 5.2 Preview PCG Tutorial - Part 6 - Sampling Meshes[9]を実装した感想

まず先週の勉強した感想を以下に示しておきます。

今回実装して思ったのはこの実装の要はCopy Pointsノードだという事です。

このNodeの機能はしっかり理解しておく必要があります。

後は、以下の様にRockの形状によっては地面の下から草が生えてしまっています。

この問題を解決するためには、

生成したPointが地面より下の場合はそのPointのDensity値の値を0にするとか機能を持ったNodeが必要だと思います。

つまりWorld PositionのZの値を得る事が出来るNodeが必要です。

もしかしたら既にあるのかもしれませんが、どれがそのNodeなのか分かりません。

この後で色々、試してみようと思ったんですが時間が足りません。

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

7. UEFNの勉強

今週はTutorialを勉強して終わりにします。

7.1 Make a Sliding Door / Moving Object in UEFN Creative 2.0 [10]を勉強する

以下の白いAssetが見つからないので

これで代用します。

専用のMaterialも作成しました。

Materialの中身はUE5と全く同じでした。

うん。

そう言えばNiagaraはどうなんでしょうか?

普通にありました。

これ、CGHOW氏とかUEFNのためのVFXの動画作った方が再生回数稼げるんじゃないでしょうか?

しかもFortniteにあるNiagaraVFXは以下の12個しかありません。

これは鉱脈を発見したかもしれません。

まずはTutorialを実装してからこのUEFNのVFXについて調べる事にします。

Prop Moverを配置します。

Distanceの値は後で調整します。

取り敢えず2にしておきます。

矢印の向きの下にしました。

Should Move from StartはDisableしました。

Prop Collision Behaviorの設定もTutorialと同じにします。

うーん。

これはDefaultでも同じになっていました。

Tutorialで確認したらDefaultのままでした。

今度はButtonを追加します。

更にProp MoverのAdvanceとReverseにこれらのButtonをセットしました。

ここからDoorを作成します。

Blueprint Classを選択して

以下のBoxを表示させます。

Building PropをClickします。

名前はProp_SlideDoorにしました。

ComponentにStatic Meshを追加し

以下のような形状に変更しました。

以下の様に追加しました。

これで完成の様です。

テストしてみます。

AdvanceのButtonを押しました。

Doorが閉まりました。

ReverseのButtonを押しました。

Doorが開きました。

この状態でReverseのButtonをもう一回押すとDoorが更に上に移動してしまいました。

Tutorialで忠告して言う通りのBugです。

今度はAdvance Buttonを2回押してみました。

Doorは最初の位置に戻りました。

うーん。

あんまり目くじら立てる程のBugでもない気がします。

7.2 UEFNNiagaraを調査する

以下に示したFortniteにあるNiagaraは全部Read-Onlyで実装を見る事も編集する事も出来ませんでした。

Level上に配置したら見れました。

一応、全部確認しました。

Loop系より一回だけEffectを表示して終了するのが多かったです。

更に言うと、銃口から出る火花を表現するために作成したのかもしれませんが、小さいEffectが多かったです。

石と木の破片が飛び散るEffect以外はほぼ炎関連のEffectでした。

UEFNのNiagaraのTutorialがどれくらいあるのか調べます。

4つしか検索に出て来ませんでした。

これは鉱脈を発見したのかもしれません。

来週からここは深堀する事にします。

8. DirectX12の勉強

8.1 「DirectX 12の魔導書」の勉強

8.1.1 先週までの作業の確認

先週は「3.3.6 Swap Chainを動作させる」の「Render TargetのClear」の「ためておいた命令を実行する」の実装を終わらせました。

先週のBlogを読み直しましたが、特に何か調査する事もないです。

今週は次の「画面のSwap」を勉強します。

8.1.2 「画面のSwap」を勉強する

まず教科書を読みます。

Swap ChainのResent()を実行するだけですね。

ここで垂直同期についての話が出て来ます。

ただ教科書の説明を読んだだけだと何を言っているのかよく分かりませんね。

一寸調べます。

Google検索で一発で出て来ました。

教科書では垂直同期は「画面内の全ピクセルを書き換える事を知らせる信号」だと説明していました。

これはGoogleの説明を理解した後で読むと間違っている気がしますね。

教科書ではこの値は1を使用しているんですが、モニターのFPSの設定が60fps以上でも1で良いんでしょうか?

公式のIDXGISwapChain::Present method (dxgi.h) [11]を見て確認します。

以下の様に解説してありました。

Vertical Blankが何を指しているのかが不明です。

IT用語辞典BinaryのVBI [12]で以下のような説明がありました。

うーん。

成程。

前よりは理解出来ました。

このテレビの映像を表示する電子銃の画像を見たいですね。

長谷川製作所、技術の足跡の「5 カラーブラウン管用電子銃組立」にいかのImageがありました。

この図を見ると横一線は一遍に描画されている様にも見えます。

それが正しいなら画面の一番下を描画した後で一番上に戻るときだけ空白の時間が生まれる事になります。それがVBIになる訳です。

因みにWikipediaVertical blanking interval [13]で

VBIとVertical Intervalは同じ意味と書かれています。

ああ、理解しました。

DirectX12のRenderingが30fpsでMonitorが60fpsだとVertical Blank Intervalは2が最適になるはずです。

DirectX12のRenderingのFPSとMonitorのFPSが同じ場合はVertical Blank Intervalは1が最適になるはずです。

教科書には更にBack Bufferの数や表示する画像がFullscreenかWindow Modeかによってもこの値が変化すると書かれていました。

8.1.3 「画面のSwap」を実装する

Codeが一行しかないので実装もやってしまいます。

Sample Codeを見ると以下の様に実装していました。

教科書のCodeと同じです。

自分のProjectでも以下の様に実装しました。

これで「3.3.6 Swap Chainを動作させる」の実装が全て終わりました。

試しに実行してみます。

真っ黒い画面が表示されているだけです。

まあ、これは次の節である「3.4 エラー対応」に書かれている通りの結果なので仕方ないです。

次の節である「3.4 エラー対応」は来週から勉強する事にします。

今週はここまでです。

8.2「Direct3D 12 ゲームグラフィック実践ガイド」の勉強

8.2.1 先週の勉強の復習

Render Target ViewをCreate Render Target View()関数を使用して作成しています。

このCreate Render Target View()関数の2番目のParameterにRender Target View Desc Structを使用しています。

このRender Target View Desc Structについて調査しました。

このRender Target View Desc Structの要素の一つに以下に示したFormatがあります。

このFormatはenumerationで100以上の種類があります。

その中で

が選択されています。

これが何処かで見た事あるんです。

ので

となって終わりました。

8.2.2 DXGI_FORMATについて調査する

Blog内でDXGI_FORMATを検索したら2023-04-17のBlogで解説していました。

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

Swap Chainについて勉強していますが、CreateSwapChain()関数の2番目のParameterである

のTypeがDXGI_SWAP_CHAIN_DESC構造体でその要素は以下の様になっています。

この中にFormatがあります。

確かに2023-04-17のBlogでは

が使用されていました。

はい。

どこで使用されていたのかは判明しました。

前に勉強した記憶があるのも間違ってなかったです。

何でSwap ChainのDescでは

が使用されているのに

View Descでは

が使用されているんでしょうか?

これって統一しないで良いんでしょうか?

8.2.3 Create Render Target View()関数の一番目のParameterについての調査

今週はここで終わりにしても良かったんですが、まだ一寸時間があるのでCreate Render Target View()関数の最初のParameterの作成についても調査する事にしました。

以下の部分です。

以下の実装でSwap ChainのBufferの値をPassされています。

m_pColorBufferは以下の様に宣言されていました。

まずは「DirectX 12の魔導書」におけるこのParameterの扱いと比較します。

DirectX 12の魔導書」におけるCreate Render Target View()関数です。

一番目のParameterには_buckBuffers[i]がセットされています。

この_buckBuffers[i]は以下に示したその前のCodeで

Swap ChainのBufferの値をGet Buffer()関数を使用してSetしていました。

この部分は「Direct3D 12 ゲームグラフィック実践ガイド」の実装と全く同じでした。

正しここに使用されている_buckBuffers[i]は以下に示した様にVectorで宣言されています。

Direct3D 12 ゲームグラフィック実践ガイド」では先程調べた通り

Arrayで宣言しています。

8.2.4 C++におけるVectorについての復習

C++におけるVectorの使用方法や宣言方法は既に忘却の彼方です。

復習します。

GeeksforgeeksのVector in C++ STL[14]を読みました。

まずVectorの意味として以下の解説がありました。

要するにSizeが可変する配列がVectorって事です。

以下の様に宣言していました。

うーん。

DirectX 12の魔導書」におけるVectorの宣言とは微妙に違いますね。

GeeksforgeeksのInitialize a vector in C++ (7 different ways)[15]にVectorの初期化についての詳しい説明がありました。

これ見るとVectorのSizeを指定しているみたいですね。

大体Vectorの宣言方法も理解出来たので今週はここまでとします。

9. まとめと感想

先週UEFNの勉強で紹介したシプル / SHIPUL [16]さんですが、

せっかく作成した島がBanされてしまったそうです。

会話を英語に訳した時に機械翻訳に頼って作成したら、使用してはいけない言葉を使用してしまってBanされたそうです。

流石に何か月も掛けて作成したProjectが無駄になってしまうのは辛すぎます。

本人も動画で引退するかもしれない。と漏らしていました。

私はアメリカに十年も住んでいたので、英語とアメリカ人との交渉に関してはかなり有効なAdviceが出来ます。(解決出来るとは断言できませんが)

ので出来れば手助けしたいんですが、連絡とる方法が分かりません。

このBlogで散々言っていますが、日本人は日本の常識が世界でも常識であると勝手に思いすぎです。

日本では常識的な行為でもアメリカで同じ事をやったら逮捕される事は沢山あります。

特にアメリカでは未成年者への不適切な扱いはすぐに犯罪になります。

Fortniteのように子供向けでもあるGameの場合はこの点に関しては注意し過ぎてもし過ぎる事は無いです。

更に言えば今回はBanされるだけで済みましたが、もっと悪い事態に発展していた可能性だってあります。

例えば、アメリカで炎上してその結果、逮捕状が発行されるとかです。

英語で公開する時はそういう事も考慮する必要があるんです。

ただこの翻訳に関しての問題の解決策は簡単で、まともなアメリカ人にProofreadingして貰って問題のある部分を修正するだけで済みます。

このまともなアメリカ人を探すのがかなり大変なんですが、これはEpic Games社に紹介してもらえば良いんです。

そもそもまともなアメリカ人じゃないとEpic Games社に入る事は出来ませんから。彼らがまともだと思う人もまたまともな人になるのは必然です。

10. 参照(Reference)

[1] FreetimeCoder [FreetimeCoder]. (n.d.). Unreal PCG Tutorial. YouTube. https://www.youtube.com/playlist?list=PLA03OHAaHgYpo0enf8p-2oEpja3grLOKZ

[2] Magnet VFX. (2023, April 2). Unreal Engine 5.1Beginner Tutorial - UE5 Starter Course 2023 #unrealengine5 #megascans [Video]. YouTube. https://www.youtube.com/watch?v=OCgn40aWVuU

[3] よくわかる、HDR徹底解説! HDRとは | EIZO株式会社. (n.d.). EIZO Corporation. All Rights Reserved. https://www.eizo.co.jp/eizolibrary/color_management/hdr/

[4] Color grading and the filmic tonemapper. (n.d.). https://docs.unrealengine.com/5.2/en-US/color-grading-and-the-filmic-tonemapper-in-unreal-engine/

[5] 西川善司. (2013). ゲーム制作者になるための3Dグラフィックス技術.

[6] Ben Cloward. (2023, March 9). Sharp Text Shader - Advanced Materials - Episode 18 [Video]. YouTube. https://www.youtube.com/watch?v=Euvy_R03rlg

[7] Ben Cloward. (2022, April 21). Moving, Rotating, and Scaling UVs - Shader Graph Basics - Episode 43 [Video]. YouTube. https://www.youtube.com/watch?v=aLCgoI0oYUo

[8] Earth and Space Sciences X. (2015, October 30). Geology 10 (Sedimentary Rocks) [Video]. YouTube. https://www.youtube.com/watch?v=6XbXM5y1110

[9] FreetimeCoder. (2023, March 28). Unreal 5.2 Preview PCG Tutorial - Part 6 - Sampling meshes [Video]. YouTube. https://www.youtube.com/watch?v=qKlWZjfkuRY

[10] Pi Equals Three. (2023, March 29). Make a sliding door / moving object in UEFN Creative 2.0 [Video]. YouTube. https://www.youtube.com/watch?v=CmPsuq2jlDI

[11] Stevewhims. (2022, September 23). IDXGISwapChain::Present (dxgi.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-present

[12] VBIとは 「垂直帰線消去時間」 (Vertical blanking interval): - IT用語辞典バイナリ. (n.d.). https://www.sophia-it.com/content/Vertical+Blanking+Interval

[13] Wikipedia contributors. (2023). Vertical blanking interval. Wikipedia. https://en.wikipedia.org/wiki/Vertical_blanking_interval

[14] GeeksforGeeks. (2023). Vector in C STL. GeeksforGeeks. https://www.geeksforgeeks.org/vector-in-cpp-stl/

[15] GeeksforGeeks. (2023). Initialize a vector in C    7 different ways. GeeksforGeeks. https://www.geeksforgeeks.org/initialize-a-vector-in-cpp-different-ways/

[16] シプル / SHIPUL. (n.d.). YouTube. https://www.youtube.com/@SHIPUL/videos