TextureRenderTarget2DからTexture2D作成する
C++でTexture2Dからデータを見れるのか調べる
最終的には、Texture Render Target 2DをOpenCVに渡したい、のでまずはここ見てみる
Unreal Engine | UTextureRenderTarget2D
全然よくわからないのでとりあえず、単純にTexture2DからOpenCVができないのか調べてみる、Answerhubを漁るとスレッドがあった
Accessing pixel values of Texture2D - UE4 AnswerHub
そこの通り作って、loopでRGB値をMatに渡してやれば、UEのTexture→OpenCV→UEのTextureみたいなことができた
で、こうなるとUTextureRenderTarget2DをUTexture2Dとして扱えたら解決する、ただ2つとも継承元はUTextureなんだけれども、なかなか良くわからなくて、調べているうちにこんな関数があることが分かった
Unreal Engine | UTextureRenderTarget2D::ConstructTexture2D
How to get texture pixels using UTextureRenderTarget2D class? - UE4 AnswerHub
これ、API一覧からクリックで辿りつけないし、ヘッダーファイル自分で探せってことなのか、なんにせよ関数があったので解決やなと思ってたらここもなかなかうまくいかない、下が実際に実行したもの
とおもっていろいろいじっていると、Texture Render Targetの設定にHDRってのがあって、そのチェックを外すと正常に読み込めた
後ついでに、ガンマに適当な値入れておくと見たままの色で返ってくる、0のままだとリニアっぽいRGBにしかならない…
この関数を使うと、Texture Render Targetの解像度が2の累乗の正方形に限定されるので、3:2とかでゲーム内に使いたかったらどうしたらいいのかはまた、でも写真ってもともと正方形だし
後気をつけるのが、初期化を何も考えないでコンストラクタに突っ込んでたら、メモリエラーが発生しまくったので、何をBeginPlayに持っていくかみたいなの考えたほうが良かった
ソース
.h
UFUNCTION(BlueprintCallable, Category = "Photo")
UTexture2D* GetTextureRenderTarget(UTextureRenderTarget2D* RTarget);
int i = 0;
.cpp
UTexture2D* ACameraDevelop1::GetTextureRenderTarget(UTextureRenderTarget2D* RTarget) {
// RenderTargetからTexture2Dを作成
UTexture2D* Dst;
Dst = RTarget->ConstructTexture2D(this, "T_TRender512_" + FString::FromInt(i++), EObjectFlags::RF_NoFlags, CTF_DeferCompression);
RTarget->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
#if WITH_EDITORONLY_DATA
Dst->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps;
#endif
Dst->SRGB = 1;
Dst->UpdateResource();
return Dst;
}
iはテクスチャの名前を同じにしてしまうと取得できなくなるので名前変更用、時間とかにするのがよさそう
あと、BPで呼び出す時、直前に位置を更新しているんだけど、変更とGetDstの間に自分の環境では最低0.02sのDelayがないと移動前のレンダリングが返ってきてしまった、この0.02sはマシンスペックに依存してそうなのでこのままだとまずそうだ