虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流

这篇具有很好参考价值的文章主要介绍了虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PCG节点处理的是数据流,也就是点云,点云到底是啥?笼统地说就是一个个携带着信息的点组成的集合。但是在具体是使用过程中,我们还得了解这些”携带着信息的点“是如何被层层包装起来的。本文中老王就和大家一边拆解源代码一边做实验,尝试着深入理解一下PCG中的数据流。如有错误,敬请指正!

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流,UE5程序化内容生成(PCG),虚幻引擎图文笔记,虚幻,笔记,PCG,程序化生成,虚幻引擎,程序化内容生成

1. FPCGDataCollection

ExecuteExecute with Context共同的输入参数,是Input,它的类型是FPCGDataCollection,我们先看一下它源代码中最核心的部分:

USTRUCT(BlueprintType)
struct PCG_API FPCGDataCollection
{
	GENERATED_BODY()

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Data)
	TArray<FPCGTaggedData> TaggedData;
}

一个TaggedData的数组,每一个TaggedData,对应着这个节点的一个输入连接,我们可以写个简单的代码试验一下:

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流,UE5程序化内容生成(PCG),虚幻引擎图文笔记,虚幻,笔记,PCG,程序化生成,虚幻引擎,程序化内容生成
虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流,UE5程序化内容生成(PCG),虚幻引擎图文笔记,虚幻,笔记,PCG,程序化生成,虚幻引擎,程序化内容生成

LogBlueprintUserMessages: [BP_CustomNode_C_20] Tagged Data 数量:3

接下来我们看一下FPCGTaggedData的内容。

2. FPCGTaggedData

我们先看一下FPCGTaggedData源代码中最核心的部分:

USTRUCT(BlueprintType)
struct PCG_API FPCGTaggedData
{
	GENERATED_BODY()

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Data)
	TObjectPtr<const UPCGData> Data = nullptr;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Data)
	TSet<FString> Tags;
};

如上文所述每个FPCGTaggedData对应着一条输入连接,每一条输入连接可能来自一个Actor、一个Spline、一个Landscape以及上一级节点的加工,那么每一条输入就会携带者原始Actor的Tag或者后添加上去的Tag。因此FPCGTaggedData包含最重要的两部分信息就是UPCGData的指针和Tag的集合。

我们再看一下什么是UPCGData

3. UPCGData

UPCGData是PCG中各种类型信息的基类

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流,UE5程序化内容生成(PCG),虚幻引擎图文笔记,虚幻,笔记,PCG,程序化生成,虚幻引擎,程序化内容生成

UCLASS(BlueprintType, ClassGroup = (Procedural))
class PCG_API UPCGData : public UObject
{
	GENERATED_BODY()
public:
	/** Unique ID for this object instance. */
	UPROPERTY(Transient)
	uint64 UID = 0;
private:
	/** Serves unique ID values to instances of this object. */
	static inline std::atomic<uint64> UIDCounter{ 1 };
}

UPCGData最核心的部分就是让每一个UPCGData都有一个全局唯一的UID,也就是说无论你的UPCGData是在何时生成(获取)的,它的UID都是全局唯一的。从上面的类图可以看到,在PCG中,我们经常使用的Data类型,不仅都派生自UPCGData,它们实际也都派生自UPCGSpatialData

3.1 UPCGSpatialData

空间相关的UPCGData

UCLASS(Abstract, BlueprintType, ClassGroup = (Procedural))
class PCG_API UPCGSpatialData : public UPCGData
{
	GENERATED_BODY()
	// Not accessible through blueprint to make sure the constness is preserved
	UPROPERTY(VisibleAnywhere, Category = Metadata)
	TObjectPtr<UPCGMetadata> Metadata = nullptr;
}

相对于UPCGData,每个UPCGSpatialData多了一个UPCGMetadataUPCGMetadata的作用就是允许用户自定义特性Attributes

UPCGSpatialData类有两个大的派生分支UPCGPointDataUPCGSpatialDataWithPointCache

3.1.1 UPCGPointData

UCLASS(BlueprintType, ClassGroup = (Procedural))
class PCG_API UPCGPointData : public UPCGSpatialData
{
	GENERATED_BODY()
	UPROPERTY()
	TArray<FPCGPoint> Points;
}

UPCGPointData中最重要的就是包含FPCGPoint数组,也就是说一个UPCGPointData对着一组Point

3.1.2 UPCGSpatialDataWithPointCache

UCLASS(Abstract, ClassGroup = (Procedural))
class PCG_API UPCGSpatialDataWithPointCache : public UPCGSpatialData
{
	GENERATED_BODY()
	UPROPERTY(Transient)
	mutable TArray<TObjectPtr<const UPCGPointData>> CachedBoundedPointData;
}

UPCGSpatialDataWithPointCache包含了一个UPCGPointData数组(间接包含了若干个FPCGPoint数组)

4. UPCGMetadata

注意:UPCGMetadata并不派生自UPCGData

先看一下核心代码:

UCLASS(BlueprintType)
class PCG_API UPCGMetadata : public UObject
{
	GENERATED_BODY()

	UPROPERTY()
	TObjectPtr<const UPCGMetadata> Parent;
	UPROPERTY()
	TSet<TWeakObjectPtr<const UPCGMetadata>> OtherParents;

	TMap<FName, FPCGMetadataAttributeBase*> Attributes;
}

UPCGMetadata也就是元数据,包含着Attributes的名称和值的Map,以及这些Attributes的来源,加上针对Attributes的各种操作。

在官方的文档中,自定义的特性叫做Attribute,而Point原生的属性叫做PropertyProperty直接定义在FPCGPoint中。

5. FPCGPoint

USTRUCT(BlueprintType)
struct PCG_API FPCGPoint
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Properties)
	FTransform Transform;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Properties)
	float Density = 1.0f;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Properties)
	FVector BoundsMin = -FVector::One();

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Properties)
	FVector BoundsMax = FVector::One();

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Properties)
	FVector4 Color = FVector4::One();

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Properties, meta = (ClampMin = "0", ClampMax = "1"))
	float Steepness = 0.5f;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Properties)
	int32 Seed = 0;

	UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Properties|Metadata")
	int64 MetadataEntry = -1;
};

FPCGPoint中除了属性Property的定义,还有一个int64类型的MetadataEntry,这个MetadataEntry应该就对应着PointMetadata(也就是Attribute)的关联方式。但是具体的算法还需要进一步研究。文章来源地址https://www.toymoban.com/news/detail-541313.html

	/** Adds a unique entry key to the metadata */
	UFUNCTION(BlueprintCallable, Category = "PCG|Metadata")
	int64 AddEntry(int64 ParentEntryKey = -1);
int64 UPCGMetadata::AddEntry(int64 ParentEntry)
{
	FWriteScopeLock ScopeLock(ItemLock);
	return ParentKeys.Add(ParentEntry) + ItemKeyOffset;
}

6. 小结

  • ExecuteInput是一个FPCGDataCollection,它包含多个FPCGTaggedData
  • 每个FPCGTaggedData对应一个输入源
  • FPCGTaggedData夹带着一串Tag和一个UPCGData(多数时候实际是其派生类UPCGSpatialData
  • 每个UPCGSpatialData(UPCGPointDataUPCGSpatialDataWithPointCache)对应着一组Point
  • 每个Point已包含固有属性(Property)通过int64MetadataEntry关联到自己的特性(Attribute

到了这里,关于虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 使用柏林噪声程序化生成地形

    参考教程链接 项目链接 👇对噪声和柏林噪声不了解的可以看下面这个讲解。 柏林函数简介   简单来说柏林噪声是一种连续的、渐变的噪声,不理解原理也无所谓,unity自带有Mathf.PerlinNoise(X-coordinate,Y-coordinate);我们可以根据这个来制作更有层次性的柏林噪声。你可以把这个

    2024年02月15日
    浏览(25)
  • (2023,3D 场景生成器 Infinigen)使用程序化生成的无限逼真世界

    Infinite PhotorealisticWorlds using Procedural Generation 公众号:EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 4. 实验  参考 S. 总结 S.1 主要思想 S.2 方法 S.3 场景生成 我们介绍 Infinigen,一个自然世界逼真 3D 场景的程序生成器。 Infinigen 完全是程序化的:从形状到纹理的每一个资产(asse

    2024年02月16日
    浏览(46)
  • 【用unity实现100个游戏之16】Unity中程序化生成的2D地牢5(附项目源码,完结)

    【视频】:https://www.youtube.com/watch?app=desktopv=-QOCX6SVFsklist=PLcRSafycjWFenI87z7uZHFv6cUG2Tzu9vindex=1 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月03日
    浏览(36)
  • 什么是程序化交易

    大到量化、程序化、高频交易、套利交易、主观投资这些基本的概念,小到网格交易、条件单、T+0、ETF套利、期现套利、算法拆单交易、打板策略等具体的投资方式。如果没有接触过这些,很容易混淆。 程序化交易: 指通过既定程序或特定软件,自动生成或执行交易指令的

    2024年02月06日
    浏览(39)
  • 基于URP的程序化天空盒

    参考来源:   天空盒教程第 1 部分 |开尔文·范·霍恩 (kelvinvanhoorn.com) 【程序化天空盒】过程记录02:云扰动 边缘光 消散效果_九九345的博客-CSDN博客 程序化天空盒实现昼夜变换 - 知乎 (zhihu.com) 一、太阳          目标:改变光的方向,使天空球旋转(日夜交替);光的正方

    2024年02月15日
    浏览(49)
  • 分享股票量化交易程序化模型的设计思路

    一个股票量化交易程序化模型的入市设计往往伴随着设计者的偏好和交易时间框架等。主要分为震荡交易、套利交易以及趋势跟踪等。当然在近些年的发展中,也出现了类似遗传算法、人工智能神经网络等许多种类的系统模型。 但是对于大多数投资者来说,趋势跟踪系统可以

    2024年02月03日
    浏览(37)
  • 程序化交易接口策略过滤器–九宫格

    不同的程序化交易接口策略适用于不同的市场情况,有些交易策略使用于均值回归,有些则试用于方向明显的时候,有些试用于方向不明显的时候,因此,我们需要根据不同的市场情况,综合考虑方向和波动率,市场成交量来选择合适的交易策略。 本文介绍了一种选择程序化

    2023年04月09日
    浏览(32)
  • Three.js程序化3D城市建模【OpenStreetMap】

    对于我在 Howest 的研究项目,我决定构建一个 3D 版本的 Lucas Bebber 的“交互式讲故事的动画地图路径”项目。 我将使用 OSM 中的矢量轮廓来挤出建筑物的形状并将它们添加到 3js 场景中,随后我将对其进行动画处理 推荐:用 NSDT编辑器 快速搭建可编程3D场景 为了使用 Node 和

    2024年02月11日
    浏览(30)
  • 【程序化天空盒】过程记录01:日月 天空渐变 大气散射

    昼夜的话肯定少不了太阳和月亮,太阳和月亮实现的道理是一样的,只不过是月亮比太阳多了一个需要控制月牙程度(or添加贴图)的细节~ 太阳的话很简单,直接在shader里实现一个太阳跟随平行光旋转而旋转的样子就行。实现这个效果需要用到Unity内置变量 _WorldSpaceLightPos0

    2024年01月18日
    浏览(30)
  • 用java去实现程序化广告应该有哪些步骤?

    1. 需求分析和规划 在这一阶段,我们需要详细分析和理解项目需求,并制定相应的规划和计划。这包括以下几个步骤: 项目背景和目标: 理解项目的背景和目标,确定开发的目的和意义。 功能需求分析: 分析用户需求,明确项目需要实现的功能和特性。 技术可行性评估:

    2024年04月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包