gpt4 book ai didi

c++ - 如何在C++中动态更新UTextureRenderTarget2D?

转载 作者:行者123 更新时间:2023-12-02 10:07:11 33 4
gpt4 key购买 nike

我一直在尝试,但是没有用这段代码来做

UTextureRenderTarget2D *renderTarget; // In header

void UMyActorComponent::BeginPlay()
{
Super::BeginPlay();
texture = UTexture2D::CreateTransient(1, 1);
FTexture2DMipMap& Mip = texture->PlatformData->Mips[0];
void* Data = Mip.BulkData.Lock(LOCK_READ_WRITE);
uint8 red[4] = { 255, 255, 255, 255 };
FMemory::Memcpy(Data, &red, sizeof(red));
Mip.BulkData.Unlock();
texture->UpdateResource();

renderTarget->UpdateTexture2D(texture, TSF_BGRA8);
}

我至少知道一个事实,即我具有正确的renderTarget句柄,因为我已经能够清除渲染目标。我可能会错过一些简单的东西,感谢任何帮助。

最佳答案

我找到了解决方案,看来这是正确的方法。
免责声明
使用纹理渲染目标可能不是最好的方法,因为通常渲染目标会将您的渲染从gpu传达到gpu。在这种情况下,我将数据从cpu写入gpu。因此,如果采用这种方法,您可能会遇到一些无法预料的问题。可能创建 transient 纹理是执行此操作的正确方法。

动态初始化渲染目标的资源
因此,首先需要使用此函数将UTextureRenderTarget2D初始化为所需的分辨率。将此放在有意义的位置。

RenderTarget->InitCustomFormat(2, 2, PF_B8G8R8A8, true);
在此示例中,我使用的是具有BGRA8像素格式和线性色彩空间的2x2图像
更新渲染目标的功能
然后,您需要将此函数放置在代码中可访问的位置
void UpdateTextureRegion(FTexture2DRHIRef TextureRHI, int32 MipIndex, uint32 NumRegions, FUpdateTextureRegion2D Region, uint32 SrcPitch, uint32 SrcBpp, uint8* SrcData, TFunction<void(uint8* SrcData)> DataCleanupFunc = [](uint8*) {})
{
ENQUEUE_RENDER_COMMAND(UpdateTextureRegionsData)(
[=](FRHICommandListImmediate& RHICmdList)
{
check(TextureRHI.IsValid());
RHIUpdateTexture2D(
TextureRHI,
MipIndex,
Region,
SrcPitch,
SrcData
+ Region.SrcY * SrcPitch
+ Region.SrcX * SrcBpp
);

DataCleanupFunc(SrcData);
});
}
更新渲染目标
该代码将写入红色,绿色,蓝色和白色
static uint8 rgbw[4 * 4] = {
0, 0, 255, 255,
0, 255, 0, 255,
255, 0, 0, 255,
255, 255, 255, 255

};
auto region = FUpdateTextureRegion2D(0, 0, 0, 0, 2, 2);
UpdateTextureRegion(RenderTarget, 0, 1, region, 2*4, 4, rgbw);
将“渲染目标”附加到编辑器中的平面上,完成所有步骤后,它应该看起来像这样
In game
因此,您应该具有一些可运行的代码。

关于c++ - 如何在C++中动态更新UTextureRenderTarget2D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59638346/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com