ue4集合类型_UE4粒子系统渲染管线概述

cbd5660f73273dccf39df56fa9f19815.png

本文基于UE4版本4.25.3,对Cascade粒子系统的移动端渲染管线进行简单的概括和描述。

Game Thread部分

粒子系统Actor被Spawn(或所在的Level被加载)的时候,UParticleSystemComponent注册和初始化,并通过CreateSceneProxy函数注册和创建FParticleSystemSceneProxy。

UParticleSystemComponent的主要数据成员是TArray<struct FParticleEmitterInstance*> EmitterInstances,包含粒子系统的所有粒子发射器。每一个粒子发射器对应一个FParticleEmitterInstance,管理当前发射器下所有的粒子。

FBaseParticle为粒子数据结构,保存粒子的Location、Rotation、Size和Velocity等数据。FParticleEmitterInstance用uint8* ParticleData指向保存FBaseParticle类型数据集合的连续内存空间。

UParticleSystemComponent关联的所有粒子数据内存空间只由GameThread访问。在帧结束的时候通过UpdateDynamicData函数创建一份包含粒子内存数据的拷贝——FParticleDynamicData,并异步传递给FParticleSystemSceneProxy,供RenderThread渲染使用。

大部分情况下,UE4通过给渲染线程生成一份渲染数据拷贝和函数线程专用(比如函数后缀加_RenderThread)的方式来防止出现多线程渲染的Race Condition问题。

62e0f9fc5774557c062242705274182a.png
GameThread部分调用示意图

Render Thread部分

在FParticleDynamicData被GameThread传递过来之后,粒子系统的渲染真正开始。

粒子系统的渲染始于FParticleSystemSceneProxy::GetDynamicMeshElements函数,输出FMeshBatchs。FMeshBatch是FParticleSystemSceneProxy到MeshDrawCommand之间的一个中间数据结构,主要包含顶点数据流(FVertexStream)、IndexBuffer和材质等。

粒子系统渲染用到的顶点数据流主要有两个:索引为0的几何数据流和索引为1的Instanced数据流,由FParticleSpriteVertexFactory创建和关联。几何数据流描述每个粒子的几何结构为4个顶点构成的单位大小的正方形。Instanced数据流为粒子数据集合,用于以Instanced的方式绘制这些粒子正方形。

Instanced数据流由FParticleDynamicData初始化而来。因为FParticleDynamicData的数据内容主要是GameThread使用的FBaseParticle类型数据集合的拷贝,所以RenderThread通过FDynamicSpriteEmitterData::GetVertexAndIndexData函数把原类型数据集合转换成渲染使用的FParticleSpriteVertex类型数据集合。FParticleSpriteVertex定义了需要传入GPU的顶点数据结构,与ParticleSpriteVertexFactory.ush 定义的顶点输入类型FVertexFactoryInput对应。

为什么GameThread和RenderThread要分别定义粒子数据结构?GameThread对粒子的抽象是一个Pivot点,更新的是这个Pivot点的位置、旋转和Size等信息。而RernderThread把粒子点几何化为一个4个顶点,2个面构成的单位正方形,渲染的时候基于粒子Pivot点的位置、旋转和Size等信息把粒子的4个顶点计算并绘制出来。

FMeshBatch生成后,进入到MeshDrawCommand的构建阶段。FMeshBatch与MeshDrawCommand可理解为一对n的关系,n的值取决于该Mesh会被多少个EMeshPass处理。比如,产生实时阴影的不透明Mesh会被DepthPass、CSMShadowDepth和BasePass 三个EMeshPass处理来分别构建MeshDrawCommand。

为什么需要定义不同的EMeshPass?不同的EMeshPass绘制关联的顶点数据流,Shader和渲染状态等不一样,比如DepthPass的绘制只需要设置顶点位置数据流(PositionOnlyStream),关联的Shader主要功能为Vertex的空间变换和Pixel的深度输出,不用做光照计算等。

对粒子系统来说,一般不写场景深度,不产生阴影,所以DepthPass和CSMShadowDepth的MeshDrawCommand构建过程会被过滤掉。BasePass的构建始于FMobileSceneRenderer::SetupMobileBasePassAfterShadowInit函数,在关联好Shader,设置好TaskContext渲染状态等之后,调用BuildMeshDrawCommands函数真正进行MeshDrawCommand的构建。

所有相关EMeshPass的MeshDrawCommand构建好之后,开始MeshDrawCommand的提交和绘制。BasePass的绘制始于FMobileSceneRenderer::RenderMobileBasePassBasePass函数,然后根据构建阶段生成的TaskContext渲染状态设置PipelineState,根据MeshDrawCommand关联的顶点数据流设置StreamSource等,最后调用RHICmdList::DrawIndexedPrimitive完成绘制。

构建MeshDrawCommand阶段引擎默认是渲染线程起Work线程来并发执行,可以设置Console命令r.MeshDrawCommands.ParallelPassSetup=0来关掉并发,最后的Mesh绘制可以设置r.RHIThread.Enable=0来关掉RHI线程平台相关的绘制API的调用,这样上述所有阶段都在RenderThread依次顺序执行,方便调试。

7a2ef308fac2f16fc769f49d95aec57f.png
RenderThread部分调用示意图

PS:UE4引擎的代码量巨大,流程庞杂,单扣一个小细节就可能要研究上好几天,想要用短短几页文字把渲染管线描述清楚难度很大,而且还需要一些写作技巧使得描述不失偏颇,有点理解官网文档的“言简意赅”了(doge~~~

参考文献:

  1. Mesh Drawing Pipeline
  2. Threaded Rendering

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2、Sprite,SpriteBatch,Texture,TextureRegion的初步认识

昨天搭建了环境&#xff0c;今天就初步接触这个4个控件&#xff08;Sprite&#xff0c;SpriteBatch&#xff0c;Texture&#xff0c;TextureRegion&#xff09; 1、SpriteBatch 这个吗&#xff0c;我没有看api文档&#xff0c;偶是直接看土豆的博客学习的&#xff0c;我看了代码…

莒南机器人_莒南42项重点建设项目公布!一定有你关注的

10日&#xff0c;县发改局公布莒南县2020年重点建设项目表&#xff01;涉及工业、服务业、基础设施、现代农业等行业&#xff0c;共42项。详↓工业1、山东钢铁集团永锋临港有限公司临港先进优特钢产业基地一期项目投资方&#xff1a;山东钢铁集团永锋临港有限公司建设地点&…

配置Mysql实现主从复制与读写分离

环境说明 主从复制使用mysql自带的master与slave机制&#xff1b;读写分离使用mysql-proxy实现&#xff01; 有服务器三台&#xff1a;s1,s2,s3。 s1为web服务器&#xff0c;装有httpd&#xff0c;php&#xff0c;mysql&#xff0c;mysql-proxy。 s2为主数据库服务器&#xff0…

arduino 土壤温湿度传感器_嫌arduino太贵?太大?试试ATTINY85!DIY温湿度计入门级教程...

ATTINY85做主控&#xff0c;OLED显示的温湿度计。简介&#xff1a;通过Arduino开发环境&#xff0c;对ATTINY85进行编程&#xff0c;利用DH11温湿度传感器&#xff0c;在SSD1306(128*64)OLED显示屏上显示温度和湿度。材料&#xff1a;ATTINY85DHT11SSD1306 (12864 OLED)电池盒纸…

认识事件冒泡和事件捕获

一.事件冒泡就是多个元素同时响应了同一个事件&#xff0c;前提是这些元素都绑定了这一个事件。这只是我的定义&#xff0c;感觉好理解些。 称它为冒泡&#xff0c;是因为事件会按照DOM元素的层次结构依次执行&#xff0c;就像水泡一样不断浮向顶端。所以称之为事件冒泡。 这个…

计算abc=a!+b!+c!

根据题目&#xff0c;即求abca!b!c! 下面我们设计算法&#xff1a; 设三位数为n,取出每一位数分别放在a、b、c中 通过定义形参&#xff0c;求每位数的阶乘&#xff0c;通过函数返回值返回 主函数中&#xff0c;调用返回值&#xff0c;每一位的阶乘相加与该三位数比较&#xff0…

docker选择安装位置_自定义WSL的安装位置,别再装到C盘啦

本文使用 Zhihu On VSCode 创作并发布为了用docker,今天才决定更新到win10 2004打算另外装一个WSL2的发行版折腾docker和GPU&#xff0c;发现之前装WSL到非系统盘的教程找不到了。现在网上也没找到有这方面的东西&#xff0c;干脆自己写一个留作记录吧~WSL(Windows Subsystem f…

[讨论帖] 程序员如何赚外快?

昨天的一篇文章一个程序员如何快速赚到一百万&#xff1f;引起了大家的热门讨论&#xff0c;现在另开一个贴&#xff0c;讨论一下如何赚钱。 -------------------------- 挣外快需要的是大量的业余时间和强大的意志&#xff0c;如果你是个每天工作十几个小时天天累得像狗一样的…

求两个数的最大公约数和最小公倍数

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 [plain] view plaincopy #include <stdio.h> int main() { int a, b, num1, num2, tmp; printf("Input a & b:"); scanf("%d %d",&num…

24安装失败 spss win10_教你win10系统显卡驱动安装失败的解决方法「系统天地」

我们日常在对电脑的使用过程中&#xff0c;经常都会遇到这样或那样的问题。比如说win10系统显卡驱动安装失败该怎么办呢&#xff1f;别着急&#xff0c;还有小编在呢&#xff1f;接下来小编就来告诉大家win10电脑系统显卡驱动安装失败怎么解决。详细教你win10系统显卡驱动安装失…

算法题系列

如果字符串str3能够由str1和str2中的字符按顺序交替形成&#xff0c;那么称str3为str1和str2的交替字符串。 例如str1"abc"&#xff0c;str2"def"&#xff0c;那么"adbecf", "abcdef", "abdecf", "abcdef", "…

学会拒绝别人的6个技巧_多少人败在不懂拒绝上!牢记10个高情商拒绝技巧,人生越来越顺...

人际交往中&#xff0c;往往需要拒绝别人的请求&#xff0c;否定别人的意见&#xff0c;这并非易事&#xff0c;需要极高的情商&#xff0c;做到既能成功拒绝&#xff0c;又不得罪他人。否则&#xff0c;不懂拒绝的话&#xff0c;就会给自己带来许多麻烦&#xff0c;也会给别人…

记GMIC 2014

我也是因为一次偶然的机会得知了全球移动互联网大会&#xff08;缩写GMIC&#xff09;这样一个全球最大规模的移动互联网行业的盛会&#xff0c;并且因为偶然的机会有幸在今年五一假期时得到一张分会场的门票。面对这样难得的机会&#xff0c;果断把五一三天假给自己放成了七天…

Win10/Win7小技巧:教你如何彻底关闭系统进程

无论Windows 10打过多少补丁&#xff0c;官方说的有多么完美&#xff0c;运行卡顿和程序假死还是常有的事儿。这个时候常规的解决方案就是用任务管理器&#xff08;CtrlAltDel&#xff09;去解决一些占用系统资源非常过分&#xff0c;“表脸”的进程。 但有的时候会发现任务管理…

导致大量kworker的原因_高尿酸与生活习惯有关?导致高尿酸的8个坏习惯,现在改还来得及...

高尿酸是痛风出现前的一个时期&#xff0c;大约百分之十左右的患者会出现痛风情况。这种疾病是一种人体代谢絮乱疾病&#xff0c;是由内外多种因素导致的&#xff0c;那么关于高尿酸形成的具体原因&#xff0c;下面我们一起来看看吧。高尿酸的病因有哪些&#xff1f;1、饮食不当…

C#开发微信公众平台-就这么简单(附Demo)

相关文档&#xff1a;https://www.google.com/search?site&sourcehp&qC%23%E5%BE%AE%E4%BF%A1%E5%BC%80%E5%8F%91&btnGGoogle%E6%90%9C%E7%B4%A2 原文地址&#xff1a;http://www.cnblogs.com/xishuai/p/3625859.html 写在前面 服务号和订阅号URL配置创建菜单查询…

用一个简单的例子来演绎事件委托

本篇博文&#xff0c;Insus.NET想使用一个超简单的例子来演绎事件委托。我们在开发网页时&#xff0c;刚开始时在网页的顶部放一个铵钮(web control)&#xff0c;想实现一个功能。 在xxx.aspx.cs: OK&#xff0c;某一天&#xff0c;此网页的内容随时间而增长&#xff0c;出现了…

Java的接口及实例

一、定义Java接口&#xff08;Interface&#xff09;&#xff0c;是一系列方法的声明&#xff0c;是一些方法特征的集合&#xff0c;一个接口只有方法的特征没有方法的实现&#xff0c;因此这些方法可以在不同的地方被不同的类实现&#xff0c;而这些实现可以具有不同的行为&am…

三位数的茎叶图怎么看_贝德玛化妆品生产日期怎么看?贝德玛化妆品保质期怎么看?...

对于喜欢化妆的小伙伴来说&#xff0c;贝德玛这个名字并不陌生。因为在卸妆产品中&#xff0c;有一个爆款单品卸妆水就出自贝德玛旗下&#xff0c;当然这也是贝德玛最知名的产品。不过很多人并不知道&#xff0c;这个来自法国的化妆品品牌&#xff0c;其实属于药妆系列。所以贝…

从Loagistic 到 SVM算法

SVM&#xff08;支持向量机&#xff09;&#xff0c;一种二类分类器&#xff0c;之所以称之为向量机&#xff0c;是因为它本身就产生一个二值决策结果&#xff0c;即使一种决策“机”&#xff0c;支持向量机的泛化错误低&#xff08;具有结构风险最小&#xff09;&#xff0c;具…