Hey guys, I have been trying to solve this problem of reading pixels and updating them to a texture using RHIUpdateTexture2D( ) efficiently since last 2 months. my current code:
TArray<FColor> PixelArray;
Something->ReadPixels(PixelArray);
UpdateTextureRegions(SomeTexture2d, (int32)0, (uint32)1, VideoUpdateTextureRegion, (uint32)(sizeof(FColor) * BufferResolution.X), (uint32)sizeof(FColor), (uint8*)PixelArray.GetData(), false)
UpdateTextureRegions(UTexture2D* Texture, int32 MipIndex, uint32 NumRegions, FUpdateTextureRegion2D* Regions, uint32 SrcPitch, uint32 SrcBpp, uint8* SrcData, bool bFreeData)
{
//if (1) { return; }
if (Texture->GetResource() && SrcData)
{
if (GEngine) // Check if GEngine is available
{
// Display the length on screen with a unique key, a duration, and a color
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("Readingframe")));
}
struct FUpdateTextureRegionsData
{
FTexture2DResource* Texture2DResource;
int32 MipIndex;
uint32 NumRegions;
FUpdateTextureRegion2D* Regions;
uint32 SrcPitch;
uint32 SrcBpp;
uint8* SrcData;
};
FUpdateTextureRegionsData* RegionData = new FUpdateTextureRegionsData;
RegionData->Texture2DResource = (FTexture2DResource*)Texture->GetResource();
RegionData->MipIndex = MipIndex;
RegionData->NumRegions = NumRegions;
RegionData->Regions = Regions;
RegionData->SrcPitch = SrcPitch;
RegionData->SrcBpp = SrcBpp;
RegionData->SrcData = SrcData;
//RegionData->Regions[0].
ENQUEUE_RENDER_COMMAND(UpdateTextureRegionsData)(
[RegionData, bFreeData, Texture](FRHICommandListImmediate& RHICmdList)
{
for (uint32 RegionIndex = 0; RegionIndex < RegionData->NumRegions; ++RegionIndex)
{
int32 CurrentFirstMip = Texture->FirstResourceMemMip;
if (RegionData->MipIndex >= CurrentFirstMip)
{
RHIUpdateTexture2D(
Texture->GetResource()->GetTexture2DRHI(),
RegionData->MipIndex - CurrentFirstMip,
RegionData->Regions[RegionIndex],
RegionData->SrcPitch,
RegionData->SrcData
+ RegionData->Regions[RegionIndex].SrcY * RegionData->SrcPitch
+ RegionData->Regions[RegionIndex].SrcX * RegionData->SrcBpp
);
}
}
if (bFreeData) {
FMemory::Free(RegionData->Regions);
FMemory::Free(RegionData->SrcData);
}
delete RegionData;
});
}
Now the issue I am facing is whenever I directly use PixelArray in UpdateTextureRegions() just like above example, my game crashes. Only workaround to this problem I was able to find was to use a For loop and assign individual variable of PixelArray to a new FColor array and using it in the UpdateTextureRegions() function. All this leads to huge performance loss. Is there any way to directly use PixelArray in the UpdateTextureRegions() without crashing?