Hello, I’m kind of a newbie UE5, and I would like to render an equirectangular image, as shown in the below figure (“RenderTargetCube”), into TextureRenderTarget2D.
So, In order to achieve this function, I’m trying to render an equirectangular image, converted from the captured image from “SceneCaptureCube()”, using the function named “GenerateLongLatUnwrap()” in “CubeMapHelpers.h”.
Build is OK, However the UE Editor got crashed when I pushed the play button with the follwoing log.
LoginId:45f07884463e0979029afdb82798f419
EpicAccountId:
Assertion failed: 0 [File:D:\build\++UE5\Sync\Engine\Source\Runtime\ImageCore\Private\ImageCore.cpp] [Line: 1185]
I’m using my custom camera actor, and Here is the Tick() function that I implemented.
// Called every frame
void AMySensorCamera::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
++FrameNumber;
#if !WITH_EDITOR
return;
#endif
if (PreRollFrames > 0 && FrameNumber < PreRollFrames) {
CubeCapture->bCaptureEveryFrame = false;
return;
}
if (FramesToCapture > 0 && FrameNumber >= PreRollFrames + FramesToCapture) {
CubeCapture->bCaptureEveryFrame = false;
if (bQuitOnFinish) {
UKismetSystemLibrary::QuitGame(this, nullptr, EQuitPreference::Quit,
true);
}
return;
}
if (!CubeCapture->bCaptureEveryFrame) {
if (Timestamp.IsEmpty()) {
Timestamp = FDateTime::Now().ToString();
}
CubeCapture->bCaptureEveryFrame = true;
CubeCapture->UpdateContent();
FlushRenderingCommands();
}
if (bOneFrameCaptureSpinup && !bCaptureSpanUp) {
FrameNumber--;
CubeCapture->UpdateContent();
FlushRenderingCommands();
bCaptureSpanUp = true;
return;
}
if (RenderTargetCube == nullptr) {
return;
}
// Fun fact: SizeX refers to height
const int32 Width = CubeCapture->TextureTarget->SizeX * 2;
const int32 Height = CubeCapture->TextureTarget->SizeX;
TArray64<uint8> RawData; // std::vector<uint8>(64);
{
SCOPE_CYCLE_COUNTER(STAT_ReadRenderTarget);
FTextureRenderTargetResource* RenderTarget =
CubeCapture->TextureTarget->GameThread_GetRenderTargetResource();
RawData.AddUninitialized(Width * Height);
FIntPoint PanoSize;
EPixelFormat PanoPixelFormat;
if (!CubemapHelpers::GenerateLongLatUnwrap(RenderTargetCube, RawData,
PanoSize, PanoPixelFormat)) {
UE_LOG(LogTemp, Warning,
TEXT("The equirectangular image is not created successfully."));
return;
}
// Force Alpha to be 255 as default is a bad value
for (int32 i = 3; i < RawData.Num(); i += 4) {
RawData[i] = 255;
}
/*IImageWrapperModule& ImageWrapperModule =
FModuleManager::LoadModuleChecked<IImageWrapperModule>(
FName("ImageWrapper"));
TSharedPtr<IImageWrapper> ImageWrapper =
ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);*/
//if (ImageWrapper->SetRaw(RawData.GetData(), RawData.Num(), Width, Height, ERGBFormat::RGBA, 8, 0));
UTexture2D* tex =
UTexture2D::CreateTransient(Width, Height, PanoPixelFormat);
if (tex) {
void* TextureData =
tex->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
FMemory::Memcpy(TextureData, RawData.GetData(), RawData.Num());
tex->PlatformData->Mips[0].BulkData.Unlock();
// Update texture
tex->UpdateResource();
RenderTargetPano->UpdateTexture2D(
tex, TSF_RGBA8, CTF_Compress | CTF_AllowMips | CTF_SRGB, nullptr);
}
If I comment out this line,
RenderTargetPano->UpdateTexture2D(
tex, TSF_RGBA8, CTF_Compress | CTF_AllowMips | CTF_SRGB, nullptr);
It will run.