读取摄像机像素

UCLASS()
class LHCVCTEST_API UMyGameViewportClient : public UGameViewportClient
{
	GENERATED_BODY()
	
protected:
	void TakeScreenShot();

	virtual void Draw(FViewport* Viewport, FCanvas* SceneCanvas) override;
	char m_buf[1920 * 1080 * 3];
};
void UMyGameViewportClient::TakeScreenShot()
{
	UWorld * world = GetWorld();
	if (world)
	{
		UGameViewportClient  * viewportClient = GEngine->GameViewportForWorld(world);
		FSceneViewport * svp = viewportClient->GetGameViewport();

		if (svp)
		{
			TArray <FColor> pixel;
			svp->ReadPixels(pixel, FReadSurfaceDataFlags());

			int AlignmentWidth = svp->GetSize().X * 3;
			while (AlignmentWidth % 4 != 0)
				++AlignmentWidth;
			int align = AlignmentWidth - svp->GetSize().X * 3;

			int j = 0;
			for (int i = 0; i < pixel.Num(); i++)
			{
				m_buf[j++] = pixel[i].B;
				m_buf[j++] = pixel[i].G;
				m_buf[j++] = pixel[i].R;

				if ((i + 1) % svp->GetSize().X == 0)
				{
					for (int k = 0; k < align; k++)
					{
						m_buf[j++] = 0;
					}
				}
			}

			grabBmp(svp->GetSize().X, svp->GetSize().Y, 0, m_buf);
			GEngine->AddOnScreenDebugMessage((uint64)-1, 2.0f, FColor::Emerald, FString::Printf(TEXT("width = %d height = %d num = %d"), svp->GetSize().X, svp->GetSize().Y));
		}
	}
}

void UMyGameViewportClient::Draw(FViewport* Viewport, FCanvas* SceneCanvas)
{
	Super::Draw(Viewport, SceneCanvas);
	TakeScreenShot();
}
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_ThirdPerson",NewGameName="/Script/lhcVCTest")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPerson",NewGameName="/Script/lhcVCTest")
+ActiveClassRedirects=(OldClassName="TP_ThirdPersonGameMode",NewClassName="lhcVCTestGameMode")
+ActiveClassRedirects=(OldClassName="TP_ThirdPersonCharacter",NewClassName="lhcVCTestCharacter")
GameViewportClientClassName=/Script/Test.MyGameViewportClient

DefaultEngine.ini

猜你喜欢

转载自blog.csdn.net/SUKHOI27SMK/article/details/82665567