LoginSignup
6

More than 3 years have passed since last update.

Niagara Advancedを覗いてみる

Last updated at Posted at 2020-12-05

はじめに

Niagara AdvancedとはUE4.26からContent Examples(機能別サンプル)に追加されたNiagaraのサンプル集が入っているLevelです。
Simulation StageやAttribute Readerなどを使ったサンプルを見ることができます。
かなり複雑なものなので比較的簡単なものだけ見ていきます。

1.1 FillRenderTarget

最初に置いてあるやつです。
一見するとビルボードにテクスチャが張られているだけのようですが
image.png
内部ではSimulation Stageでテクスチャをレンダ―ターゲットにコピーしてマテリアルに渡しているようです。
そもそもSimulation Stageとは何なのか分かっていなかったのですが、コメントで説明が書かれていました。

Think of a simulation stage as an additional "stack" like Particle Update. The difference is it can iterate, meaning run multiple times on a single frame across all the elements in it.Think of it like a "For Loop" in the stack.

意訳するとParticle Updateのような追加のスタックで、反復処理ができてパーティクルやData Interfaceに対するFor Loopのようなものらしいです。なるほどわからん
また、Data Interfaceなら何でも使えるというわけではないようです。

このEmitterのIteration SourceにはRender Target 2Dが設定されています。
image.png
内部ではIndexからUVを計算して色をコピーしています。
ここでのExecution IndexはIteration Sourceに対するものなのでRender Target 2Dの各テクセルになります。
image.png
Render Targetをセットした後はTexture ObjectとしてMaterialに渡しています。
image.png
Material側
image.png

1.4 SpawnOnGBuffer

UE4.26から追加されたData InterfaceのGBufferを使ったサンプルです。
色が異なり、半分金属のグレイマンから同じ質感の粒々が垂れています。
image.png
GBfferはView Modeから見ることができるやつです。
image.png
このサンプルではスポーン時にScreen UVを計算してベースカラー、メタリック、ラフネスをDynamicMaterialParameter経由でコピーしています。
image.pngimage.png
また、深度が一定の閾値以上であればKillするという処理があり、その判定に使用する値を算出する処理がHlslで書かれています。
image.png
Custom Hlslを使用したサンプルが少ないのでありがたいですね。

2.1 AttributeReaderRing

Attribute Readerを使用したサンプルです。
image.png
円状に移動するParticleが通過したところの色が変化するというものです。
始めにAttribute Readerを作成して読み取るEmitter名を指定します。
image.png
そうするとModuleやScratch Pad内でGet○○で他EmitterのAttributeを読み取れるようになります。
image.png
ParticleのAttributeであればInitial.○○やModule名.○○といったものも読み取ることができます。

このサンプルではありませんが、コメントに赤字でAttribute Rederを使用する際にEmitter Spawnに一度だけセットすることが推奨されているようなことが書かれていました。

Only one attribute reader can exist at a time. It can be used in multiple locations however. It is good practice to define it at Emitter Spawn for general use.

image.png
以前まではModuleやScratch Pad内で新規に作成していたので参考にさせて頂きます。

2.2 AttributeReaderFollow

赤い粒の周りに緑の粒が追従するサンプルです。
image.png
Get Num Particlesという関数を使用して他Emitterのスポーン数が参照してランダムIDを取得し、IDからPositionを読み取っています。
(このノード知りませんでした。毎回手動で入力していたので助かります。)
image.png
IndexとIDの違いですが、IDはIndexとは異なりフレーム間で安定していることが保証されているそうです。
また、IDの読み取りをする際はRequires Persistent IDsにチェックを入れていないとエラーが表示されます。
image.png

2.3 AttributeReaderStreamers

他EmitterのParticleからスポーンするModuleのサンプルです。
image.png
UE4.26から追加された新機能ですね。
Spawn Particles From Other EmitterとSample Particles From Other Emitterをセットで使用するようです。
image.png
Spawn Particles From Other Emitterで読み取り先のEmitter名の指定やSpawn Rateの設定などが行えます。
Sample Particles From Other EmitterではInitialize Particleで設定できるような値を参照するかどうかなどの設定ができます。
デフォルトではPositionのみになっているようです。

このModuleはGPUとCPUの両方で動作すると書いてありましたが、GPUからCPUのような組み合わせでは動作しなかったので注意。

読み取り先 読み取り側 スポーンするか
CPU CPU する
GPU GPU する
CPU GPU しない
GPU CPU しない

3.x

Neighbor Grid 3Dというのを理解していないのでよくわかりませんでした。申し訳ありません。
ただ、Neighbor Grid 3Dを使うと近傍のParticleの情報を読み取ったり出来るみたいです。(使えるようになりたい。)
image.png
画像は3.7 Plexus

4.1 Component Renderer

UE4.26の新機能Component Rendererのサンプルです。
グレイマンがにょきにょき生えてきます。
image.png
Scene Conponentを継承していれば何でも使えるようです。
また、このサンプルではSkeletal Meshのアニメーションの速度をNiagara側から設定しています。
image.png
Particle SpawnでAnimationPlayRateというAttributeを設定してComponent Rendererから関数を呼び出しているようです。
image.png
Component側では受け取る変数名とSet ○○ (○○は変数名)という関数を用意しておけばよいようです。

試しに関数呼び出し用のCompoentを作成してみました。
image.png
Testという名前の変数とSet Testという関数を作成しました。
image.png
Niagaraに今作ったComponentを追加してみると変数名の項目が確かに追加されていました。
image.png
Particle.Positionをセットしてみます。
image.png
スポーンしたComponentごとに関数が呼び出されていることが分かります。
image.png

おまけ

このサンプルを見ていていくつか個人的な発見をしたので紹介します。

  • Dynamic InputsにもScratch Padが使える。
  • Niagara版InterpToのInterpolateOverTime_Float
  • SpriteBasedLineというModuleを使うことでGPUSimでもRibbonのような表現ができる。
  • RenderのBindingsからAttributeをセットできる。
  • Dynamic InputでReturn Normalized Exec Indexが使える。

続いて通常のLevelにも新たにサンプルが追加されているようなので見てみます。

4.1 Play Audio Per Particle

UE4.26の新機能でNiagaraからオーディオを再生するサンプルです。
image.png
プレイしなくても音が鳴るんですね
Audio関連で追加されているModuleは3つあります。

  • PlayAudio
  • PlayPersistentAudio
  • UpdatePersistentAudio

PlayAudio
BooleanのAttributeがあり、Trueになったタイミングで一度だけ再生されるようです。
(Sound Waveの設定でLoopingにチェックが入っていると音が止まらないので注意)
image.png
再び再生させるにはEmitterのCycleが更新されるか、Particle.HasPlayedAuioをFalseにする必要があります。
こののサンプルではDATA INSTANCE.Aliveの反転が設定されているのでParticleがKillされたタイミングで再生されています。

もう一つのEmitterの方ではCollisionValidが設定されていて衝突したタイミングで音が再生されるようになっています。
CollisionValidはCollisionのModuleを追加すると自動で作成されるAttributeです。
image.png
PlayPersistentAudioとUpdatePersistentAudio
こちらは動的にピッチやボリュームを変化させたいときに使うものです。
このサンプルではFindKineticAndPotentialEnergyというModuleで計算された中央のトーラスの力学的エネルギーがピッチとボリュームに連動しています。
image.png

4.2 RendererWithNoParticles

EmitterのAttributeをもとにSpriteを表示するというサンプルです。
image.png
中を見てみると0 Particlesとなっているのが分かります。
image.png
Sprite RendererではSoure ModeがEmitterに設定されており、Bindingsの項目ではEmitterの各Attributeがバインドされていることが分かります。
image.png
こちらを使うメリットですが、コメントには単一のSpriteの場合はパフォーマンスが向上し、Simulation Stageで流体のシミュレーションなどをレンダ―ターゲットに書き込むといった場合なども便利と書かれていました。

単一のSpriteはともかく流体のシミュレーションをする機会はなさそうですが機能として知っていて損はないと思います。

4.3 Mesh Orientation vs. Rotational Force

メッシュの回転に3種類あるというサンプルです。
image.png

  • Direct Orientation
  • Rotational Velocity
  • Rotational Force

上の3つがあります。

Direct Orientation
Direct Orientationは直接回転を指定するので直線的な動きでDragも考慮されません。

Rotational Velocity
Rotational Velocityは初速を与えるのでそのままでは直線的な動きですがDragやMassが考慮されます。
サンプルではParticle SpawnでRotation Forceが設定されています。
ここをAdd Rotational Velocity Moduleにすると初速にMassが考慮されないようになるようです。
image.png
Rotational Force
Rotational Forceは力を与えているので加速します。こちらもDragやMassが考慮されます。
(高校で習う力学の位置、速度、加速度の関係が回転に変わったというイメージだと思います。)

おわりに

Niagara完全に理解した状態の自分には難しかったです。HlslやSimulation Stageが使えるようになるよう精進して参ります。
また、よいサンプルがたくさん公開されたのでこれを機にSimulation Stageの情報が増えてくれることを願います。

UE4.26のリリースノート
https://docs.unrealengine.com/ja/WhatsNew/Builds/ReleaseNotes/4_26/index.html

Niagaraのドキュメント
https://docs.unrealengine.com/en-US/RenderingAndGraphics/Niagara/index.html

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6