动态更新纹理

1. 创建C++类继承自AStaticMeshActor

2. 定义用于渲染队列的数据结构

struct FUpdateTextureData
{
	FTexture2DResource* Texture2DResource;
	FUpdateTextureRegion2D* UpdateTextureRegion;
	uint8* DynamicColors;
	int32 w;
};

3. 增加成员变量

        UMaterialInstanceDynamic* mDynamicMaterials;
	UTexture2D *mDynamicTexture;	
	FUpdateTextureRegion2D* mUpdateTextureRegion;
	uint8* mDynamicColors;       //BGRA

	const int32 w = 650;
	const int32 h = 650;

	FUpdateTextureData mTextureData;

4. 在PostInitializeComponents函数中初始化材质,颜色内存

        mDynamicMaterials = GetStaticMeshComponent()->CreateAndSetMaterialInstanceDynamic(0);
	if (mDynamicMaterials == nullptr)
		return;

	mUpdateTextureRegion = new FUpdateTextureRegion2D(0, 0, 0, 0, w, h);

	mDynamicTexture = UTexture2D::CreateTransient(w, h);
	if (mDynamicTexture == nullptr)
		return;
	mDynamicTexture->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
	mDynamicTexture->SRGB = 0;
	mDynamicTexture->Filter = TextureFilter::TF_Nearest;
	mDynamicTexture->AddToRoot();
	mDynamicTexture->UpdateResource();

	mDynamicMaterials->SetTextureParameterValue("DynamicTextureParam", mDynamicTexture);

	mDynamicColors = (uint8*)CreatePixelMemory(w, h);

	mTextureData.Texture2DResource = (FTexture2DResource*)mDynamicTexture->Resource;
	mTextureData.UpdateTextureRegion = mUpdateTextureRegion;
	mTextureData.DynamicColors = mDynamicColors;
	mTextureData.w = w;

5. 创建更新函数

void AMyStaticMeshActor::UpdateTexture()
{
	if (mDynamicMaterials == nullptr || mDynamicTexture == nullptr || mDynamicTexture->Resource == nullptr || mUpdateTextureRegion == nullptr || mDynamicColors == nullptr)
		return;

	ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER
	(
		UpdateTexture,
		FUpdateTextureData, TextureData, mTextureData,
		{
			RHIUpdateTexture2D(
				TextureData.Texture2DResource->GetTexture2DRHI(),
				0,
				*TextureData.UpdateTextureRegion,
				TextureData.w * 4,
				TextureData.DynamicColors
			);
		}
	);
	mDynamicMaterials->SetTextureParameterValue("DynamicTextureParam", mDynamicTexture);
}

6. 在tick函数中调用更新函数

7. 在endplay函数中释放内存

    if (mUpdateTextureRegion)
    {
        delete mUpdateTextureRegion;
        mUpdateTextureRegion = nullptr;
    }

8. 直接将此类拖入的场景中,并且设置其static mesh,材质,并且设置材质的空白纹理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值