LoginSignup
1

More than 3 years have passed since last update.

UE4 RenderTargetから任意の座標のRGBA値を取得する

Last updated at Posted at 2019-11-11

調べてもそう簡単にはわからない内容。C++を使用する。
英語ができるUnreal C++の使い手なら調べて分かるかもしれんが、BP勢は死ぬ。
ちなみに僕はC++を使えないも同然の初心者。4、5日ざっと勉強した程度。
ここではC++が使える人に向けた説明をする。僕は使えないけど。

使えない人のための記事もおいおい書く。
そのときはちょっと複雑なものを実装しながら色々とカバーしようかな。

ヘッダーファイル

当然レンダーターゲットのヘッダーファイルはインクルードする。
#include "Engine/TextureRenderTarget2D.h"
で、適当に関数を宣言する。
UFUNCTION(BlueprintCallable, Category = "任意")
変数型 関数の名前(UTextureRenderTarget2D* RenderTarget, 以降任意);

Cppでする処理

レンダーターゲットリソース

レンダーターゲットのピクセルの情報はUTextureRenderTarget2Dではなく、
FTextureRenderTarget2DResourceというものに格納されている。
したがって適当に変数を宣言して、引数からそいつを呼びだして格納する。
作った関数に以下のコードを記載することでそれができる。
FTextureRenderTarget2DResource* Resource;
Resource = (FTextureRenderTarget2DResource*)RenderTarget->GameThread_GetRenderTargetResource();

RGBA値の取得

テクスチャの各ピクセルは配列のインデックスで、色の情報なんかはその配列の要素として格納されている。
それを取り出すために、まずこっちの方で色だけの配列を宣言する。
TArray<FLinearColor> Color;
その配列にRenderTargetResourceのRGB値をそのまま流し込むには以下のコードなどを使う。
Resource->ReadLinearColorPixels(Color);
レンダーターゲットリソースの関数にこういうのがあって、引数にFLinearColorのTArrayを入れるとその配列に色を代入していく。
色は今回FLinearColorを使ったが、FColorでも同様にいける。

Colorは一次元の配列なわけだが、これは左上のピクセルから順に色情報が格納されているので、
例えば(X, Y)のピクセルの色が欲しければ、
float HogeHoge = Color[X + Y * Resource->GetSizeX()]
でいける。

あとは適当に色を処理して出力すればいい。
僕はDepthを取得してそれを利用して「目に見えている空間(ヴォイド)の体積」を算出した。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1