2016-06-01 56 views
1

Unreal Engine C++プロジェクトのデータが入っているUTexture2Dからピクセルデータを読み取ろうとしています。ここで質問を投稿する前に、このリンクに記載されているメソッドを使用しようとしました:https://answers.unrealengine.com/questions/25594/accessing-pixel-values-of-texture2d.htmlしかし、それは私のためには機能しません。テクスチャから取得したピクセル値はすべてガベージデータです。C++でUTexture2Dからデータを読み取る方法

SceneCapture2DとSceneTexture:Depthノードを含む後処理マテリアルから深さの値を取得したいだけです。 OpenCVでさらに処理できるように、C++で使用可能な深度値が必要です。 Directx11ではステージングテクスチャをCPUの読み込みに使用できますが、UnrealエンジンではDx11のように「ステージングテクスチャ」を作成する方法がわかりません。現在のメソッドから正しいピクセル値を取得できないため、CPUが読み込めないテクスチャにアクセスしようとする可能性があります。

ここでは、RGB UTexture2Dからデータを読み取るための実験コードを示します。

はRGBテクスチャを初期化:

VideoTextureColor= UTexture2D::CreateTransient(640, 480, PF_B8G8R8A8); 
VideoTextureColor->UpdateResource(); 
VideoUpdateTextureRegionColor = new FUpdateTextureRegion2D(0, 0, 0, 0, 640, 480); 
ColorRegionData = new FUpdateTextureRegionsData; 

PixelDepthData.Init(FColor(0, 0, 0, 255), 640 * 480); 

// Populate the texture with blue color 
for (int i = 0; i < 640; i++) { 
    for (int j = 0; j < 480; j++) { 
     int idx = j * 640 + i; 
     PixelDepthData[idx].B = 255; 
     PixelDepthData[idx].G = 0; 
     PixelDepthData[idx].R = 0; 
     PixelDepthData[idx].A = 255; 
    } 
} 

UpdateTextureRegions(
    VideoTextureColor, 
    (int32)0, 
    (uint32)1, 
    VideoUpdateTextureRegionColor, 
    (uint32)(4 * 640), 
    (uint32)4, 
    (uint8*)PixelDepthData.GetData(), 
    false, 
    ColorRegionData 
); 

そして、更新はバックPixelDepthData(TARRAY型)配列にその値を読み込み、その以前の値であるPixelDepthDataに格納する値とこのテクスチャを更新します。

UpdateTextureRegions(
    VideoTextureColor, 
    (int32)0, 
    (uint32)1, 
    VideoUpdateTextureRegionColor, 
    (uint32)(4 * 640), 
    (uint32)4, 
    (uint8*)PixelDepthData.GetData(), 
    false, 
    ColorRegionData 
); 

ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(
    FRealSenseDelegator, 
    ARealSenseDelegator*, RealSenseDelegator, this, 
    { 
     FColor* tmpImageDataPtr = static_cast<FColor*>((RealSenseDelegator->VideoTextureColor)->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_ONLY)); 
     for (uint32 j = 0; j < 480; j++) { 
      for (uint32 i = 0; i < 640; i++) { 
       uint32 idx = j * 640 + i; 
       RealSenseDelegator->PixelDepthData[idx] = tmpImageDataPtr[idx]; 
       RealSenseDelegator->PixelDepthData[idx].A = 255; 
      } 
     } 
     (RealSenseDelegator->VideoTextureColor)->PlatformData->Mips[0].BulkData.Unlock(); 
    } 
); 

私が入手したのは、視覚化シーンの青色のテクスチャではなく、白色のテクスチャです。

誰でもUTexture2Dオブジェクトのデータを読む方法を知っていますか?

答えて

3

私はそれを理解しました。最初にUTexture2DのRHIテクスチャ参照を取得してから、RHILockTexture2Dを使用してそのデータを読み込む必要があります.RenderThreadでそれを行う必要があります。次のコードだけ例:

FTexture2DResource* uTex2DRes = (FTexture2DResource*)(RealSenseDelegator->VideoTexturePixelDepth)->Resource; 
float* cpuDataPtr = (float*)RHILockTexture2D(
     uTex2DRes->GetTexture2DRHI(), 
     0, 
     RLM_ReadOnly, 
     destStride, 
     false); 

for (uint32 j = 0; j < 480; j++) { 
    for (uint32 i = 0; i < 640; i++) { 
     uint32 idx = j * 640 + i; 

     // TODO Read the pixel data right here 

    } 
} 
RHIUnlockTexture2D(uTex2DRes->GetTexture2DRHI(), 0, false); 

は、レンダリングスレッドでこれを行うには、あなたはただ一つ、レンダリングスレッドに一つのパラメータを渡し、このいずれかを使用する場合は、このようなENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER //などのマクロを使用する必要があります。 +

関連する問題