お世話になっております。
レンダーターゲットがRTF_R8の場合、読み出しできないようになっている(アサートになる)のですが、何らかの理由があって対応していないのでしょうか。
特に問題がない場合、読み出しをしようと思いますが、エンジン側のコードを書き換えたくないため、読み取る直前にフォーマットをRGBA8横サイズを1/4に書き換えて読み出すことに問題はないでしょうか。
以上、よろしくお願いします
お世話になっております。
レンダーターゲットがRTF_R8の場合、読み出しできないようになっている(アサートになる)のですが、何らかの理由があって対応していないのでしょうか。
特に問題がない場合、読み出しをしようと思いますが、エンジン側のコードを書き換えたくないため、読み取る直前にフォーマットをRGBA8横サイズを1/4に書き換えて読み出すことに問題はないでしょうか。
以上、よろしくお願いします
お世話になっております。
恐縮ですがRTF_R8を使用できない認識がなかったのですが、
こちらはどのような方法で読み込みを行った時に発生しているアサートでしょうか?
またアサート発生時のメッセージなどがありましたらあわせて教えていただけますと幸いです。
よろしくお願いいたします。
紛らわしい書き込みで申し訳ありません。
レンダーターゲットとしては使用できております。FRenderTarget::ReadPixelsPtr()を使用してピクセルデータを読み出すと内部の関数で下記のアサートになっていました。
D3D11RenderTarget.cpp
ConvertRAWSurfaceDataToFLinearColor()
// not supported yet
check(0);
迷っている時間もなかったため、方針を変更して以下のようにエンジンを書き換えたのですが、間違いなどあれば教えていただけないでしょうか。
下記コードはWindowsのものですが、他のプラットフォームも同じように書き換えました。
D3D11RenderTarget.cpp
ConvertRAWSurfaceDataToFLinearColor()
// どれ使っているか不明
else if ( (Format == PF_G8) || (Format == PF_A8) || (Format == PF_R8_UINT) || (Format == PF_L8) )
{
for (uint32 Y = 0; Y < Height; Y++)
{
uint8* SrcPtr = (In + Y * SrcPitch);
FLinearColor* DestPtr = Out + Y * Width;
for (uint32 X = 0; X < Width; X++)
{
uint8 SrcVal = *SrcPtr;
*DestPtr = FLinearColor( SrcVal, SrcVal, SrcVal, SrcVal );
++SrcPtr;
++DestPtr;
}
}
}
呼び出し側
FRenderTarget* RenderTarget = _TexRT->GameThread_GetRenderTargetResource();
EPixelFormat Format = _TexRT->GetFormat();
int32 ImageBytes = CalculateImageBytes(_TexRT->SizeX, _TexRT->SizeY, 0, Format);
_RawData.AddUninitialized(ImageBytes);
bool bReadSuccess = false;
switch (Format)
{
// どれ使っているか不明
case PF_G8:
case PF_A8:
case PF_R8_UINT:
case PF_L8:
{
// RRRR で読み出すためのバッファを用意
TArray tmpData;
EPixelFormat tmpFormat = GetPixelFormatFromRenderTargetFormat( RTF_RGBA8 );
int32 tmpBytes = CalculateImageBytes(_TexRT->SizeX, _TexRT->SizeY, 0, tmpFormat);
tmpData.AddUninitialized(tmpBytes);
// ピクセル R が RRRR で読み込まれる(Win64は対応追加、XXXは仮対応っぽい)
bReadSuccess = RenderTarget->ReadPixelsPtr( tmpData.GetData() );
// R だけを読み出す
uint32 pixelNum = _TexRT->SizeX * _TexRT->SizeY;
for ( uint32 i = 0; i < pixelNum; i++ )
{
_RawData[i] = tmpData[i].R;
}
tmpData.Empty();
}
break;
}
if (bReadSuccess == false)
{
_RawData.Empty();
}
お世話になっております。 状況承知いたしました。
実装と、過去に何らかの問題がなかったか確認しましたが、
特に理由があっての未対応ではなさそうです。
エンジンの修正に関しまして拝見させていただきましたが、
ご提示していただいた実装方法で問題ないかと思います。
お手数おかけしますが、よろしくお願いいたします。