BlueRoseNote/03-UnrealEngine/VisualEffect/Niagara官方中文视频教学笔记.md
2023-06-29 11:55:02 +08:00

6.3 KiB
Raw Permalink Blame History

Emitter Properties-Deteminsim

勾选之后,重复播放的粒子都会是相同(随机值不会起作用)。可以用在制作阶段的效果预览,但需要在制作完后去掉勾选。

查看粒子各项数值与Debug技巧

在Niagara编辑器中的Window选项卡中开启Attribute Spreadsheet。即可对粒子数据进行捕获并查看。

你可以在给粒子设置Debug材质的方式来进行指定粒子的查看。具体的方式为通过NiagaraBindings传递参数之后材质中使用Debug节点进行显示。

按下键盘上的Pause键可以暂停

同时再按F8可以自由转换视角或者在编辑器中点击Eject结束对Character的控制以此切换为自由观察视角来进行观察。

在play或者Simulate下按下;开启DebugCamera装下

在这个状态下有着各种调试功能。还可以检查场景剔除情况。

Niagara系统的数据传递

https://zhuanlan.zhihu.com/p/74796515

  1. 从外界把数据传进来
    主要通过ParameterCollection或者直接对NiagaraSystem进行数据设置。这个数据需要加到Niagara变量中的User标签下
  2. Emitter内部数据传递
    本质上是使用MapGet和MapSet通过名字来找到数据的。
  3. NiagaraModuleScript之间的数据传递
  4. Emitter之间的数据传递
    在ParticleUpdate里添加事件。因为需要跟踪粒子Id所以需要勾选RequiresPersistentIds
    在需要监听事件的Emitter中的EventHandler中添加监听事件即可。

调节场景中的Niagara粒子播放速度

命令行输入Slomo [倍率]即可调节播放速度例如输入Slomo 0.1,就可以慢动作观察粒子播放了。

使用CurveAsset与CurveAtlasAsset将渐变信息导入材质中

CurveAtlas可以用于制作渐变贴图它支持的渐变条数与TextureSize有关一行一条渐变。之后再材质编辑器是使用CurveAtlasRowParameter节点即可读取渐变信息。

给CurveTime输入节点连上上UV节点的R通道即可观察渐变效果。如果把黑白渐变图连上那结果就会被染色成渐变效果。

CurveAtlas除了可以调整颜色值还可以通过调整Alpha值曲线来调整边缘效果。

另一种思路就是使用材质编辑器中的Gradient系列节点。

让特效具有立体感

粒子模型使用穿插面片:

使用Fresnal或者DotProduct节点记得使用abs与黑白Ramp贴图相乘以此来减弱接近平行的面片渲染效果。记得勾选双面渲染

Ribbon与Beam

Beam也是使用Ribbon进行渲染的。差别在于Ribbon是一个一个发射粒子之后再渲染飘带模型。 Beam是一下就生成完所有粒子的之后再渲染飘带模型。

设置步骤

  1. 在EmitterUpdate中添加BeamEmitterUpdate
  2. 在ParticleSpawn中添加SpawnBeam
  3. 在Render中添加RibbonRenderer

记得勾选AbsoluteBeamEnd将本地坐标转化为世界坐标。

调整宽度

在ParticleSpawn中添加Initialize Ribbon

控制Ribbon UV

  1. 在UV0Tiling Distance设置数值
  2. 在材质编辑器中的对UV进行求余数运算。

个人认为或许使用WorldPosition应该可以把。

另一种给材质传递传递数据的方法

对一个StaticMesh调用SetCustom Primtive Data XXX。可以是float、Vec2、vec3、vec4之后在材质编辑器中新建一个变量节点之后在变量节点的Details-CustomPrimitiveData选项卡中勾选UseCustomPrimitveData。

它的消耗比Dynamic Material Instance少的多而且不同的Component都是相互独立的不像材质集是全局的。

性能调试

Shift+Ctrl+,开启GPU Visualizer

限制其基类必须是Primtive。

直接控制SubImageIndex变量

通过修改SubImageIndex变量的方式来直接控制SubMaterial渲染结果。

使用随机值进行采样

可以在Niagara里设置一个变量在使用SetParameter节点对这个变量赋予随机值之后使用这个随机值变量对曲线进行采样。将这个值赋予CurveIndex

碰撞

碰撞类型需要与粒子类型相同GPU与CPU。同时使用的粒子材质需要是Translucent使用Mask会影响场景深度使得Depth不正确从而导致模拟出问题。

下雨逻辑GPU判定碰撞产生事件计算碰撞时间与法线之后生成水花SubImage

If you open the Material function "Imposter_ThreeFrameBlend" you will have to go to each "World to Loc" node and edit the shader code by replacing Primitive by GetPrimitiveData(Parameters.PrimitiveId).

In the material editor go to Window and then "Find results" There you can search for "Custom" this will look for every custom node with custom code. Cycle through every result until you find a World to Loc node. Then you can proceed to edit the code. There are a total of 5 nodes which you need to edit.

The edited code for me looks like this :

#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
#else
return mul(InWorldVector, (MaterialFloat3x3)GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal);
#endif

And like this :

#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
float3 temp;
temp.x = length(TransformLocalVectorToWorld(Parameters, float3(1,0,0)));
temp.y = length(TransformLocalVectorToWorld(Parameters, float3(0,1,0)));
temp.z = length(TransformLocalVectorToWorld(Parameters, float3(0,0,1)));
return mul(InWorldVector, (MaterialFloat3x3)transpose(Parameters.InstanceLocalToWorld)) / (temp*temp);
#else
return mul(InWorldVector, (MaterialFloat3x3)GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal);
#endif

#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
         return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
     #else
         return mul(InWorldVector, (MaterialFloat3x3)Primitive.WorldToLocal);
     #endif