UE4 创建Viewport

UE4 创建Viewport

创建自定义的ViewportClient,并显示TextureRenderTarget2D对象。
ViewPort

创建TextureRenderTarget2D

设置蓝色背景。

UTextureRenderTarget2D*RenderTarget = NewObject<UTextureRenderTarget2D>(GetTransientPackage(), NAME_None, RF_Transient);
RenderTarget->RenderTargetFormat = RTF_RGBA8;
RenderTarget->InitAutoFormat(1024, 1024);
RenderTarget->ClearColor = FLinearColor::Blue;
RenderTarget->UpdateResource();

ViewPort绘制

ViewportClient::Draw(FViewport* Viewport,FCanvas* Canvas)中进行绘制。
绘制RenderTarget相当于绘制“栅格图像”。

//绘制RenderTarget
	FCanvasTileItem Tile(FVector2D::ZeroVector, RenderTarget->Resource, Viewport->GetSizeXY(), FLinearColor(1, 1, 1, 1));
	Canvas->DrawItem(Tile);

绘制一段线。

FCanvasLineItem Line(FVector2D(0, 0), FVector2D(Viewport->GetSizeXY().X, Viewport->GetSizeXY().Y));
	Line.SetColor(FLinearColor::Blue);
	Canvas->DrawItem(Line);

创建项目

创建Standalone Window插件来显示Viewport
Standalone Window
Plugins\TPViewport\Source\TPViewport\Public\RenderTestViewportClient.h

#include "CoreMinimal.h"
#include "UnrealClient.h"

class FRenderTestViewportClient : public FViewportClient
{
public:
	FRenderTestViewportClient();

	virtual void Draw(FViewport* Viewport, FCanvas* Canvas)override;

	class UTextureRenderTarget2D* RenderTarget;
};

Plugins\TPViewport\Source\TPViewport\Public\RenderTestViewportClient.cpp

#include "RenderTestViewportClient.h"
#include "Runtime/Engine/Public/CanvasTypes.h"
#include "Runtime/Engine/Public/CanvasItem.h"
#include "Engine/TextureRenderTarget2D.h"

#include "SimpleShader.h"

FRenderTestViewportClient::FRenderTestViewportClient()
{
	RenderTarget = NewObject<UTextureRenderTarget2D>(GetTransientPackage(), NAME_None, RF_Transient);
	RenderTarget->RenderTargetFormat = RTF_RGBA8;
	RenderTarget->InitAutoFormat(1024, 1024);
	RenderTarget->ClearColor = FLinearColor::Blue;
	RenderTarget->UpdateResource();
}

void FRenderTestViewportClient::Draw(FViewport* Viewport, FCanvas* Canvas)
{
	//绘制RenderTarget
	FCanvasTileItem Tile(FVector2D::ZeroVector, RenderTarget->Resource, Viewport->GetSizeXY(), FLinearColor(1, 1, 1, 1));
	Canvas->DrawItem(Tile);
}

Plugins\TPViewport\Source\TPViewport\Public\TPViewport.h
三者之间的关系
ViewportWidget--->FSceneViewport---->FViewportClient

///
    ///......
    ///
	TSharedPtr<class FSceneViewport> Viewport;
	TSharedPtr<class SViewport> ViewportWidget;
	TSharedPtr<class FRenderTestViewportClient> ViewportClient;

Plugins\TPViewport\Source\TPViewport\Public\TPViewport.cpp
创建SDockTab

TSharedRef<SDockTab> FTPViewportModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{
	TSharedRef<SDockTab> Tab = SNew(SDockTab)
		.TabRole(ETabRole::NomadTab)
		[
			SNew(SBox)
			.HAlign(HAlign_Fill)
			.VAlign(VAlign_Fill)
			[
				SAssignNew(ViewportWidget, SViewport)
			]
		];

	ViewportClient = MakeShareable(new FRenderTestViewportClient());
	Viewport = MakeShareable(new FSceneViewport(ViewportClient.Get(), ViewportWidget));
	ViewportWidget->SetViewportInterface(Viewport.ToSharedRef());

	return Tab;
}
void FTPViewportModule::StartupModule()
{
	// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
	
	 ///
    ///......
    ///
	
	FGlobalTabmanager::Get()->RegisterNomadTabSpawner(TPViewportTabName, FOnSpawnTab::CreateRaw(this, &FTPViewportModule::OnSpawnPluginTab))
		.SetDisplayName(LOCTEXT("FTPViewportTabTitle", "TPViewport"))
		.SetMenuType(ETabSpawnerMenuType::Hidden);
}

参考链接

  1. UE4 创建Viewport
  2. 源码:https://gitee.com/wblong/ue4_-viewport.git
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值