请选择 进入手机版 | 继续访问电脑版

#楼主# 2020-7-29

跳转到指定楼层
我的专栏目录:

简介:

Epic已经把c++玩得出神入化了,然后业内出现了一个新词UE4 C++,所以跟着UE4官方玩c++飙车应该没啥太大问题顺便还能对引擎和c++有更深的理解。
UE4有大量的类型,各种类型转换也相当麻烦,所以有必要对虚幻的类型转换魔法般操作有一些理解。如果文章有错误还请各路大佬斧正留言。
【typedef】

最开始让我感到头疼的是接触到UE4渲染资源的相关类型的时候
虚幻4渲染编程(C++篇)【第一卷:类型】-1.jpg 我的截图只是冰山一角,类型真的是太多了,虚幻非常喜欢用模板,各种typedef来欺负记忆力不好的人。
typedef就是为一个类型取一个新的名字,方便书写,其实类型还是那个类型只是换了个名字而已。和宏不同的是宏是直接文本替换。所以可以直接对两个typedef的类型进行操作,因为它们本来就是一个东西。
虚幻4渲染编程(C++篇)【第一卷:类型】-2.jpg 【TRefCountPtr】

这是虚幻自己做的一个智能指针,实现代码也非常简单就百来行代码
虚幻4渲染编程(C++篇)【第一卷:类型】-3.jpg 里面保存了一个Reference,是一个类型的指针,该类型由模板传入。如果把这个模板极简化大概是下面这个样子:
虚幻4渲染编程(C++篇)【第一卷:类型】-4.jpg 使用的时候类似这样,只不过我把智能指针的功能都去掉了,这里相当于给了个空壳。
虚幻4渲染编程(C++篇)【第一卷:类型】-5.jpg 【类型强转】

既然有这么多类型就免不了类型转换。关于c++各种类型转换可以去看下面这篇文章,这些基础我就不赘述了。
这里我们来看下虚幻的一段代码
虚幻4渲染编程(C++篇)【第一卷:类型】-6.jpg 这部分代码等价于下面的代码:
#include <iostream>
using namespace std;

class FTexture1D
{
public:

        FTexture1D(){}

        void show()
        {
                cout << "Texture1D"<< endl;
        }
};

class FTexture2D
{
public:

        FTexture2D() {}

        void show()
        {
                cout << "Texture2D" <<endl;
        }
};

template<class RefType>
class TParmRef
{
public:

        RefType* Reference;
};

typedef FTexture1D FTexture1DNewName;

int main()
{
       
        TParmRef<FTexture1D> Ref1D;
        FTexture1D* Tex1DPtr = new FTexture1D;
        Ref1D.Reference = Tex1DPtr;

        TParmRef<FTexture2D> Ref2D = (const TParmRef<FTexture2D>&)Ref1D;

        Ref2D.Reference->show();

        system("Pause");

        return 0;
}还可以再做一些变化
分别给FTexture2D和FTexture1D一个int data成员然后分别赋值
虚幻4渲染编程(C++篇)【第一卷:类型】-7.jpg 虚幻4渲染编程(C++篇)【第一卷:类型】-8.jpg 虚幻4渲染编程(C++篇)【第一卷:类型】-9.jpg int main()
{
       
        TParmRef<FTexture1D> Ref1D;
        FTexture1D* Tex1DPtr = new FTexture1D;
        Ref1D.Reference = Tex1DPtr;

        TParmRef<FTexture2D> Ref2D = (const TParmRef<FTexture2D>&)Ref1D;

        Ref2D.Reference->show();

        system("Pause");

        return 0;
}最后输出的是10107
如果让FTexture2D的内存布局和FTexture1D不一样
虚幻4渲染编程(C++篇)【第一卷:类型】-10.jpg 我们的操作相当于是把FTexture1D的数据拷贝到FTexture2D上,但是Ftexture1D没有DataY所以DataY输出是一个随机值
虚幻4渲染编程(C++篇)【第一卷:类型】-11.jpg 我们的这句代码
TParmRef<FTexture2D> Ref2D = (const TParmRef<FTexture2D>&)Ref1D;相当于是直接把内存数据拷过去(即使他们类型不同),如果内存布局相同,那么数据拷过去就对了,如果不同那么拷过去就是出错。
用这种方法我们能偷取一个类里的数据。
虚幻4渲染编程(C++篇)【第一卷:类型】-12.jpg 至此我们就能完全理解大部分Unreal渲染部分的代码类型相关的操作了。Enjoy it。

原文地址:https://zhuanlan.zhihu.com/p/66465698
转播转播 分享淘帖
回复

使用道具

成为第一个回答人

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

卡庙寺

注册会员

  • 主题

    1

  • 帖子

    66

  • 关注者

    0