RenderDependencyGraph学习笔记(二)——在插件中使用ComputeShader
前言
UE4 RDG(RenderDependencyGraph)渲染框架本质上是在原有渲染框架上基础上进行再次封装,它主要的设计目的就为了更好的管理每个资源的生命周期。同时Ue4的渲染管线已经都替换成了RDG框架了(但依然有很多非重要模块以及第三方插件没有替换),所以掌握以下RDG框架还是十分有必要的。
上一篇文章已经大致介绍了RDG框架的使用方法。看了前文的资料与官方的ppt,再看一下渲染管线的的代码基本就可以上手了写Shader。但作为一个工作与Ue4一点关系的业余爱好者,用的2014年的电脑通过修改渲染管线的方式来写Shader不太现实,编译一次3小时真心伤不起。同时google与Epic论坛也没有在插件中使用RDG的资料,所以我就花了些时间探索了一下用法,最后写了本文。因为非全职开发UE4,时间精力有限,不可避免得会有些错误,还请见谅。 代码写在我的插件里,如果感觉有用麻烦Star一下。位于在Rendering下的SimpleRDG.cpp与SimpleRenderingExample.h中。
https://github.com/blueroseslol/BRPlugins
首先还是从ComputeShader开始,因为比较简单。
RenderDependencyGraph学习笔记(一)——概念整理
前言
RDG = Rendering Dependency Graph
RDG主要包含两个重要组件,一个是FRDGBuilder,负责构建Render graph的资源及添加pass等,构建RenderGraph。另一个是FRDGResource,RenderGraph的资源类,所有资源都由它派生。
官方入门ppt:https://epicgames.ent.box.com/s/ul1h44ozs0t2850ug0hrohlzm53kxwrz
因为加载速度较慢,所以我搬运到了有道云笔记:http://note.youdao.com/noteshare?id=a7e2856ad141f44f6b48db6e95419920&sub=E5276AAD6DAA40409586C0552B8E163A
另外我还推荐看:
https://papalqi.cn/index.php/2020/01/21/rendering-dependency-graph/
https://zhuanlan.zhihu.com/p/101149903
本文也将引用上文中的若干内容。
注意:
- 本文为了便于理解,把诸如typedef FShaderDrawSymbols SHADER;这种类型别名都改成原本的类型名了。
- 本文属于本人边学边写的学习笔记,不可避免地会有错误。如有发现还请指出,尽请见谅。
Ue4Config方法总结与另外一种GameplayTag管理方法
前言
最近在尝试对GameplayAbility进行插件化处理。这么做好处在于这样可以方便后续项目的迭代。UE4官方频道有一个“盗贼之海”团队的经验分享视频,他们说制作的GAS Asset复用率能都达到90%,这可是相当惊人的程度。而且在不断地项目迭代过程中,使用GAS制作的技能、Buff/Debuff会越来越充分。从而加快后续项目的开发速度。所以将GAS插件化是很有必要的。
但使用GAS需要给项目添加一些项目设置比如:AssetManager中的DataAsset、指定AssetManager类、添加GameplayTag。在发现网上的添加配置方法无效后,我又花了一些时间研究,终于找到方法,隧有了此文。
ActionRPG中的攻击逻辑与其他实现方法
ActionRPG中的逻辑
逻辑位于BP_PlayerCharacter中,通过按键事件执行ActivateAbilitiesWithTags(定义于ARPGCharacterBase,本质上是执行AbilitySystemComponent的TryActivateAbilitiesByTag函数)、ActivateAbilitiesWithItemSlot(定义于ARPGCharacterBase,本质上通过查询ItemSlot来激活对应的Ability,使用了AbilitySystemComponent的TryActivateAbility函数)来施放“Ability”。
ActionRPG的存档与物品系统笔记
前言
ActionRPG在RPGType.h定义了各个类型,在RPGControllerBase类中定义背包逻辑。存档逻辑写在RPGGameInstance与RPGSaveGame中。
个人建议:如果你打算制作个人项目,这里的代码基本不用改,直接就可以用。当然最好还是将共用部分封装成插件,这样后续Ue4项目也可以使用。这也是官方GameplayAbility视频教程中所建议的。
AssetManager系列之Asset Bundles
Asset Bundles
Asset Bundles(资源束)可以理解为给特定主资源中的次级资源设置“组”,方便你通过“组名”对加载指定组的次级Asset。
AssetManager系列之TAssetPtr与FStreamableManager
TAssetPtr
因为在wiki上已经有介绍TAssetPtr的内容了,所以我就直接翻译了,并且在末尾给予一定的补充。以下是翻译自wiki的内容:
一般情况下,我们无需将这个场景中所有Asset都加载了再进入游戏,我们可以先加载必要Asset,在进入场景后,异步加载剩余的非必要资源。而TAssetPtr可以解决这个问题。TAssetPtr类似于标准指针,其区别在于TAssetPtr指向的资产可能已经加载,也可能还没有加载,如果资产没有加载,则它包含加载该资产所需的信息。(TAssetPtr属于弱指针)
一个简单的引用Asset的方法就是创建带有UProperty标记的TAssetPtr成员变量,并且在编辑器中指定想要加载的Asset。本质上是TSoftClassPtr,包含了FSoftObjectPtr对象。可以通过FSoftObjectPath构造,并用其监视Asset的状态。
AssetManager系列之actionRPG项目中的RPGItem类
前言
AssetManager是一个全局单例类,用于管理各种primary assets和asset bundles。配合配套工具 “(Reference Viewer)、“资源审计(Asset Audit)”可以理清Pak文件中Asset的依赖关系以及所占用的空间。
自定义AssetManager可以实现自定义Asset、自定义Asset载入逻辑与控制(异步与同步载入、获取载入进度、运行时修改载入优先级、运行时异步加载强制等待等)、通过网络下载Asset并载入、烘焙数据分包(打包成多个pak)。
在actionRPG项目中通过继承UPrimaryDataAsset来实现自定义DataAsset文件(content browser中能创建的Asset),具体请参照RPGItem,其中包含了包含了文字说明(FTEXT)、物品图标(FSlateBrush)、价格(int32)、相关能力(UGameplayAbility),具体的之后会介绍。