Niagara_Advanced内容示例 1.4 Sample GBuffer Attributes

在这里插入图片描述

粒子效果

球状粒子从模型表面生成(模型的各个位置),拥有与最近模型表面相同的颜色、金属度和粗糙度;生成的一段时间后,开始受到重力影响,下坠,与地面产生碰撞。

Niagara蓝图部分

蓝图部分可以粗略提供的信息有:首先这是一个GPU粒子系统;创建了一个变量暴露给Niagara系统外;有三个新的模块——Skeletal Mesh Location,Sample GBuffer Attributes和Camera Offset,从字面上理解分别是依照骨架网格体位置作为粒子的位置,获取GBuffer中存储的属性值和设定相机的偏移。其具体作用还需后面具体分析。此外,还有一些负责力学解算的部分——Gravity Force重力,Collision碰撞等。

在这里插入图片描述

效果实现分析

在进入Niagara蓝图之前,让我们先看一下这个人物骨骼模型的材质。我这边截取了其中跟我们这节内容比较相关的一部分,主要是对材质的BaseColor、Metallic和Roughness进行的设置和编辑(这些属性都会写入到GBuffer中)。

首先是左下角到BreakOutFloat3Components。这部分是用骨架网格体的位置(局部空间内)减去局部空间内bounding box(想象一个盒子将模型包住,同时保证这个盒子体积最小)中位置最小的点(即x,y,z值最小),再分别除以bounding box的长、宽、高,从而得到一个比值(将值限定到了0~1,总体可以理解成一个三维空间上的UV),break出来的三个通道RGB其实对应x、y、z坐标轴。

这个值的R通道作为Step节点的X值。Step节点的作用是将X的值(0.5)与Y值作比较,如果Y<X,输出1,相反则会输出0,这个输出会作为模型的Roughness粗糙度值。这里所有R通道小于0.5的像素点(模型局部空间内的,这里X轴向右,故而是模型的左半边)的Roughness为1,即粗糙拉满;大于0.5,即模型的右半边,粗糙度为0,非常光滑。

在右下角橘黄色部分,拿到前面输出的B通道(与局部坐标z值相关,即纵向,范围01),乘以8(范围扩大到08),然后输入Floor节点(相当于取整操作,比如输入的是5.1则取5),然后除以8(再将取值化为了0~1),这样就实现了分层(将连续的值转化为了离散的值),这个值最后作为了材质的BaseColor(当然中间还有一些节点,但是对最终效果影响不大)也就是最终效果图中我们看到的一层一层颜色的效果。

如此,我们便知道了GBuffer中的这些奇奇怪怪的颜色、粗糙度数据是怎么搞出来的了。

在这里插入图片描述

回到Niagara System中。欲获得粒子生成于骨架网格体表面的效果,我们需要在Niagara系统中拿到这个网格体表面的数据。这里创建了一个Skeletal Mesh类型的属性,并暴露出去,以作为获取Skeletal Mesh数据的接口。

在这里插入图片描述

在Particle Spawn阶段,用Skeletal Mesh Location去读将上面拿到的Skeletal Mesh类型的属性,并配置各种采样规则。Camera Offset则是根据粒子和相机之间的向量(方向)以及值的小大来作一点粒子的偏移,使距离相机近的部分有相对更大的粒子密度。

在这里插入图片描述

Sample GBuffer Attributes,采样GBuffer中的属性。看到右上角的铅笔就知道我们可以到Scratch中对它进行编辑。从使用来看,其上有三个可配置选项:Snap Particle To Sampled Depth移动粒子到采样的深度,Kill Particles If Too Far From Sampled Depth如果粒子距离采样深度太远就销毁掉,Sampled Depth Threshold采样深度阈值。还是进入编辑界面看看脚本是怎样的原理吧。

在这里插入图片描述

这个脚本还是比较清晰的,右侧Map Set主要写入或者重写了几项属性:Particles.Color粒子颜色,Particles.Position粒子位置,Data Instance.Alive粒子的生死,Particles.DynamicMaterialParameter动态材质参数(粒子和材质互动的接口参数之一)。

Particles.Color是通过节点Decode Base Color从GBuffer里根据屏幕UV(粒子世界位置转到屏幕UV上,参考GPU中顶点着色器的工作流)扒出一个颜色值(还需要补充一个alpha通道值),再写入/覆盖粒子颜色值。

同样的道理,Particles.DynamicMaterialParameter是也是通过解码节点(Decode节点),分别将深度、粗糙度、金属度写入进去(第四个通道没有存储任何数据,为0)。

在这里插入图片描述

其中的自定义节点(HLSL片段)我们先将他的输入理清楚:In_SamplePos读的是粒子的位置,GbufferDepth读的是GBuffer里的深度值。我用注释解释了一下下面这段代码片段。

理解了代码,后面就比较好理解了,其实就是两个条件判断:如果勾选了Snap Particles To Sampled Depth,就将粒子移到模型上的对应位置;只有当粒子到粒子在模型上对应点的距离小于我们之前设定的阈值,且勾选了Kill Particles If Too Far From Sampled Depth,才会保留粒子的存活状态,否则直接销毁该粒子。

float Depth = float(0);
//重置缓存数据
ProjectedDepth = float(0);
WorldPosOnDepth = In_SamplePos;

#if GPU_SIMULATION

float3 CameraPosWS = View.WorldCameraOrigin.xyz;
float3 CameraFWD = View.ViewForward.xyz;

//相机位置-粒子位置,然后归一化得到 粒子到相机的单位向量
float3 CamMinusSamplePos = normalize(CameraPosWS - In_SamplePos);
//粒子到相机单位向量 点乘 相机的朝向(单位向量) 得到两者夹角的余弦值
Depth = dot(CamMinusSamplePos, CameraFWD);
//用GBuffer中的深度值(是模型上对应像素的深度值) 除以 该余弦值 得到 粒子到模型上对应像素位置的距离(想象一条射线从相机出发,穿过粒子打到模型上一个某个点,相机到这个某个点的距离)
Depth = GbufferDepth / Depth;

//相机到这某个“点”的向量
CamMinusSamplePos *= Depth;
//这个某个“点”的世界位置
WorldPosOnDepth = CamMinusSamplePos + CameraPosWS;
//粒子位置到粒子该去的位置之间的距离
ProjectedDepth = length(In_SamplePos - WorldPosOnDepth);

#endif

OK,经过了属性的重写,下面就是力的解算了。之前我们讲解过,这里就不作阐述了。我们直接看我们重写的那些属性如何表现。来到Mesh Renderer网格体渲染其中绑定部分。颜色、位置的数据流动自不必说。那么Particles.DynamicMaterialParameter是如何表现出来的呢?我们进入到使用的材质中。

在这里插入图片描述

Particle Color是材质中接粒子属性的接口,而Dynamic Parameter是接Particles.DynamicMaterialParameter的接口,这里使用了Param2和Param3(我们之前构建DynamicMaterialParameter时这里个通道分别传入了GBuffer中获取到的粗糙度和金属度)。

在这里插入图片描述

总结

其实从Niagara蓝图的角度看,这个例子并不复杂,但是其中涉及到的图形学相关的计算和转化还是比较多的。要掌握这部分的内容,需要对GBuffer、深度、各种坐标空间、顶点和片元着色器有一定的了解才行。希望我的文字解释得足够清晰。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 《niagara_4_developercourse_labexercises.pdf》是一份关于Niagara 4开发者课程实验练习的PDF文件。Niagara 4是特尔斯控制系统公司开发的一款用于建筑自动化的软件平台,旨在提供集成管理各种设备和技术的解决方案。这份文件可能包含了一系列实验练习,旨在帮助学习者掌握Niagara 4的开发和配置技巧。 这些实验练习可能涉及不同的主题,包括系统架构、设备配置、图形界面设计、数据收集与分析等。学习者可能需要按照指导进行一系列的实验任务,通过实践来熟悉Niagara 4的各项功能和工具。这些实验练习可以帮助学习者了解如何使用Niagara 4平台来创建自定义的控制策略、设置定时任务、监视和控制设备,以及收集和分析数据等。 通过完成这些实验练习,学习者可以获得对Niagara 4开发和配置过程的实际经验,并加深对系统的理解。这份文件可能包含了实验指南、示例代码、实验结果分析等各种信息,以便学习者能够按照指导顺利完成实验任务。 总之,《niagara_4_developercourse_labexercises.pdf》是一份提供Niagara 4开发者课程实验练习的文件,通过完成其中的实验任务,学习者可以提高他们在Niagara 4平台上开发和配置的能力。 ### 回答2: niagara_4_developercourse_labexercises.pdf 是一份开发者课程实验练习的文档。 这份文档主要是针对Niagara 4开发者课程中的实验练习而编写的。Niagara 4是一种基于Tridium公司的框架和平台,用于建立和管理建筑自动化系统。开发者课程旨在帮助开发人员深入了解Niagara 4的功能和特性,并提供实践的机会来掌握其开发技术。 在这份文档中,会列出一系列的实验练习,帮助开发者逐步学习和实践Niagara 4的开发过程。每个实验练习都会有详细的步骤和指导,包括设置环境、创建项目、编写代码等等。开发者需要按照文档的指示一步步地完成每个实验,同时还需要理解实验的目的和背景。 这份文档的目的是帮助开发者通过实践加深对Niagara 4的理解和掌握。通过每个实验的完成,开发者可以逐步提升其在Niagara 4开发方面的技能。实验的内容涵盖了不同的主题和技术,包括系统建模、设备接入、数据处理等等。 总之,niagara_4_developercourse_labexercises.pdf 是一份Niagara 4开发者课程的实验练习文档,通过实践完成每个实验,开发者可以逐步提升其在Niagara 4开发方面的能力和技术。 ### 回答3: "niagara_4_developercourse_labexercises.pdf" 是一个文件名,可能是一个包含关于 Niagara 4 开发者课程实验练习的 PDF 文件。 在这个文件中可能包含了一些与 Niagara 4 开发相关的实验练习,供开发人员使用。该 PDF 可能包含了一些说明、指导或教程,以帮助开发人员学习和实践 Niagara 4 系统的开发技术。这些实验练习可能涉及到创建和配置 Niagara 4 网络、开发自定义应用程序、编写 Niagara 4 控制程序等。 对于想要学习并使用 Niagara 4 技术的开发人员来说,这个文件应该是一个很有用的资源。通过完成其中的实验练习,开发人员可以加深对 Niagara 4 系统的理解,掌握相关的开发技能,并在实际项目中应用这些技能。 需要注意的是,为了更好地利用这个文件,开发人员可能需要先了解基本的 Niagara 4 系统知识和开发概念。此外,建议开发人员按照文件中的顺序逐个完成实验练习,以获得更好的学习效果。 总而言之,“niagara_4_developercourse_labexercises.pdf” 是一个帮助开发人员学习 Niagara 4 系统开发技术的实验练习文件,对于想要学习并应用 Niagara 4 的开发人员来说是一份有价值的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Claude的羽毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值