UTexture2D* texture = UTexture2D::CreateTransient(w, h, PF_G32R32F);
texture->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
texture->SRGB = 0;
texture->AddToRoot();
texture->UpdateResource();
FTextureResource* DestTextureResource = (FTextureResource*)texture->Resource;
ENQUEUE_RENDER_COMMAND(copyTextureBuffer)(
[DestTextureResource, buffer](FRHICommandListImmediate& RHICmdList)
{
FTexture2DRHIRef Texture2DRHI = DestTextureResource->TextureRHI->GetTexture2D();
uint32 DestPitch = 0;
float* DestinationBuffer = (float*)RHILockTexture2D(
Texture2DRHI,
0,
RLM_WriteOnly,
DestPitch,
false);
if (DestinationBuffer) {
const float* SourceBuffer = buffer;
const int32 MaxRow = FMath::Min(Texture2DRHI->GetSizeY(), (uint32)your_row_here);
if (DestPitch == your_pitch_here)
{
FMemory::Memcpy(DestinationBuffer, SourceBuffer, DestPitch * MaxRow);
}
else for (int32 Row = 0; Row < MaxRow; ++Row)
{
FMemory::Memcpy(DestinationBuffer, SourceBuffer, FMath::Min((uint32)(your_pitch_here), DestPitch));
DestinationBuffer += DestPitch;
SourceBuffer += your_pitch_here;
}
}
RHIUnlockTexture2D(Texture2DRHI, 0, false);
}
);
}