お世話になっております。
今回はTextureRendertarget2Dを高速にUTexture2Dへ変換する方法を教えてもらいたいです。
やりたいことはキャラクターの視点画像をcv::Matに変換することです。
色々調べてみたところTextureRendertarget2D->UTexture2D->cv::Matと変換する必要がありそうだったので、以下のようなコードを書きました。
cv::Mat UTextureHelper::TextureToMat(UTextureRenderTarget2D * RTarget)
{
if (!RTarget)
{
return cv::Mat();
}
int i = time(NULL);
// RenderTargetからTexture2Dを作成
auto Dst = RTarget->ConstructTexture2D((UObject*)GetTransientPackage(), "T_TRender512_"+FString::FromInt(i), EObjectFlags::RF_NoFlags, CTF_DeferCompression);//処理に時間がかかる
if (!Dst)
{
return cv::Mat();
}
RTarget->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
#if WITH_EDITORONLY_DATA
Dst->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps;
#endif
Dst->SRGB = 1;
Dst->UpdateResource();//処理に時間がかかる
auto texture = Dst;
FTexture2DMipMap* MyMipMap = &texture->PlatformData->Mips[0];
FByteBulkData* RawImageData = &MyMipMap->BulkData;
FColor* FormatedImageData = static_cast<FColor*>(RawImageData->Lock(LOCK_READ_ONLY));
auto height = MyMipMap->SizeY;
auto width = MyMipMap->SizeX;
cv::Mat mat(height, width, CV_8UC3);
for (int y = 0; y < height; ++y)
{
auto ptr = mat.ptr<cv::Vec3b>(y);
for (int x = 0; x < width; ++x)
{
auto color = FormatedImageData[y * width + x];
ptr[x][0] = color.B;
ptr[x][1] = color.G;
ptr[x][2] = color.R;
}
}
RawImageData->Unlock();
return mat;
}
このようなコードを書いたところ実行におおよそ200ms程かかりました。
一瞬画面が止まってしまうのでどうにか17~34msに収めたいのですが何処かに改善できそうな箇所はないでしょうか?
こちらで調べてみたところ、
UTextureRenderTarget2D::ConstructTexture2D関数
UTexture2D::UpdateResource関数
の2つに時間がかかるようです。
このTextureToMat関数は4フレームごとに呼び出すつもりです。
よろしくお願いします。