ue4 截图_UE4精品教程 | 渲染编程(C++篇)【第一卷:类型】

本文深入探讨了UE4中C++的类型定义,包括`typedef`,`TRefCountPtr`智能指针,以及类型强转。通过实例解析了UE4引擎在渲染资源类型上的复杂性和转换技巧,帮助读者理解和掌握虚幻引擎中类型的魔法般操作。
摘要由CSDN通过智能技术生成
c78e3021acdc2b0f7c8e99b77d6a9aed.gif 14489239c5f33efa3ec0e1d1cf90f103.gif

本文转载于拉Box小能手知乎作者

原文链接:https://zhuanlan.zhihu.com/p/75005105

简介:

Epic已经把c++玩得出神入化了,然后业内出现了一个新词UE4 C++,所以跟着UE4官方玩c++飙车应该没啥太大问题顺便还能对引擎和c++有更深的理解。

UE4有大量的类型,各种类型转换也相当麻烦,所以有必要对虚幻的类型转换魔法般操作有一些理解。如果文章有错误还请各路大佬斧正留言。

【typedef】

最开始让我感到头疼的是接触到UE4渲染资源的相关类型的时候

41e1e7ebe35faa5a6b4ecfaa68c511a0.png

我的截图只是冰山一角,类型真的是太多了,虚幻非常喜欢用模板,各种typedef来欺负记忆力不好的人。

typedef就是为一个类型取一个新的名字,方便书写,其实类型还是那个类型只是换了个名字而已。和宏不同的是宏是直接文本替换。所以可以直接对两个typedef的类型进行操作,因为它们本来就是一个东西。

71f89daf7d0505154e1b8cd6be711aae.png

【TRefCountPtr】

这是虚幻自己做的一个智能指针,实现代码也非常简单就百来行代码

7acdb6347a4e4075e8c05c0742c59043.png

里面保存了一个Reference,是一个类型的指针,该类型由模板传入。如果把这个模板极简化大概是下面这个样子:

c81e1a1724f197f458ee5c09a23518f1.png

使用的时候类似这样,只不过我把智能指针的功能都去掉了,这里相当于给了个空壳。

4da20aaf71c6a9f2e107be4de9242440.png

【类型强转】

既然有这么多类型就免不了类型转换。关于c++各种类型转换可以去看下面这篇文章,这些基础我就不赘述了。

c++类型转换blog.csdn.net

这里我们来看下虚幻的一段代码

eecc203a7999aaf26712b40bab80e022.png

这部分代码等价于下面的代码:

#include 
using namespace std;
class FTexture1D
{
public:
FTexture1D(){}
void show()
{
cout << "Texture1D"<< endl;
}
};
class FTexture2D
{
public:
FTexture2D() {}
void show()
{
cout << "Texture2D" < }
};
template
class TParmRef
{
public:
RefType* Reference;
};
typedef FTexture1D FTexture1DNewName;
int main()
{
TParmRef Ref1D;
FTexture1D* Tex1DPtr = new FTexture1D;
Ref1D.Reference = Tex1DPtr;
TParmRef Ref2D = (const TParmRef&)Ref1D;
Ref2D.Reference->show();
system("Pause");
return 0;
}

还可以再做一些变化

分别给FTexture2D和FTexture1D一个int data成员然后分别赋值

32384abe7215fbb8125a55eb6aa00c23.png
81bc378380b6adc78a14d81795f83e71.png
5f140238ab60608f5e6d61a9a676f6d9.png
int main()
{

TParmRef Ref1D;
FTexture1D* Tex1DPtr = new FTexture1D;
Ref1D.Reference = Tex1DPtr;
TParmRef Ref2D = (const TParmRef&)Ref1D;
Ref2D.Reference->show();
system("Pause");
return 0;
}

最后输出的是10107

如果让FTexture2D的内存布局和FTexture1D不一样

6fcd74f821f7b28e629e3fc2cb0fd3a7.png

我们的操作相当于是把FTexture1D的数据拷贝到FTexture2D上,但是Ftexture1D没有DataY所以DataY输出是一个随机值

22cfdd27ab15069cf1da1688901b7114.png

我们的这句代码

TParmRef Ref2D = (const TParmRef&)Ref1D;

相当于是直接把内存数据拷过去(即使他们类型不同),如果内存布局相同,那么数据拷过去就对了,如果不同那么拷过去就是出错。

用这种方法我们能偷取一个类里的数据。

42c4187870b59f51874744fb4bdfe338.png

至此我们就能完全理解大部分Unreal渲染部分的代码类型相关的操作了。Enjoy it。

a7eb223c95f7e4caaf3f2d7b28eff5f2.gif fb6bfe4cb3d3d4f18b094c9fb7a4673e.gif f86a2b42d33e40d002d65da9a1acba54.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值