UE 命令行创建与使用

使用UE命令行能运行一些系统内置命令,不如查看不渲染性等等,但是如果我们自己能够定制命令行来控制我们自己的渲染流程将方便很多,具体办法如下:
定义命令:

static TAutoConsoleVariable<int32> CVarMyTest(
	TEXT("r.MyTest"),
	0,
	TEXT("Test My Global Shader,set it to 0 to disable,or 1,2 or 3 for fun.\n"),
	ECVF_RenderThreadSafe
);

将其定义为一个全局变量,命令名为r.MyTest,设置初始值为0;

在流程控制中获取值:

// 获取此时系统中使用r.MyTest设置的数值,到MyTestValue 
// 并以此控制程序是否执行
int32 MyTestValue = CVarMyTest.GetValueOnAnyThread();
	if (MyTestValue!=0)
	{
		FLinearColor Color(MyTestValue == 1, MyTestValue == 2, MyTestValue == 3);
		RenderMyTest(RHICmdList,  Color);
	}

运行UE时使用:

1.按键~调出明亮行;

2.输入:r.MyTest 1(.0) 则将系统值设置为1

SomeThing Rec

//自定义GlobalShader
class FMyVS : public FGlobalShader
{
	DECLARE_SHADER_TYPE(FMyVS, Global);
public:
	FMyVS() {}
	FMyVS(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FGlobalShader(Initializer) {}

	static bool ShouldCache(EShaderPlatform Platform)
	{
		return true;
	}
	static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
	{
		//判断是否支持某一个平台
		//SM5就是DX11
		return IsFeatureLevelSupported(Parameters.Platform, ERHIFeatureLevel::SM5);
	}
};

IMPLEMENT_SHADER_TYPE(, FMyVS, TEXT("/Engine/Private/DownsampleDepthPixelShader.usf"), TEXT("MainVS"), SF_Vertex);

class FMyPS : public FGlobalShader
{
	DECLARE_SHADER_TYPE(FMyPS, Global);
public:
	FMyPS() {}
	FMyPS(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FGlobalShader(Initializer) {
		MyColor.Bind(Initializer.ParameterMap, TEXT("MyColor"), SPF_Mandatory);
	}

	static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
	{
		FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
		OutEnvironment.SetDefine(TEXT("MY_DEFINE"), 1);
	}

	static bool ShouldCache(EShaderPlatform Platform)
	{
		return true;
	}

	void SetColor(FRHICommandList& RHICmdList, const FLinearColor& Color) {
		SetShaderValue(RHICmdList, RHICmdList.GetBoundPixelShader(), MyColor, Color);
	}

	static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
	{
		//判断是否支持某一个平台
		//SM5就是DX11
		return IsFeatureLevelSupported(Parameters.Platform, ERHIFeatureLevel::SM5);
	}
	
private:
	LAYOUT_FIELD(FShaderParameter, MyColor);
};

IMPLEMENT_SHADER_TYPE(, FMyPS, TEXT("/Engine/Private/DownsampleDepthPixelShader.usf"), TEXT("MainPS"), SF_Pixel);

void FDeferredShadingSceneRenderer::RenderMyTest(FRHICommandListImmediate & RHICmdList, const FLinearColor & Color)
{

	//设置渲染目标 
	FSceneRenderTargets& SenceContant = FSceneRenderTargets::Get(RHICmdList);
	FRHITexture2D* RenderTargetTexture = new FRHITexture2D(1, 1, 1, 1, PF_B8G8R8A8, TexCreate_RenderTargetable, FClearValueBinding());
	RHICmdList.TransitionResource(EResourceTransitionAccess::EWritable, RenderTargetTexture);
	FRHIRenderPassInfo RPInfo(RenderTargetTexture, ERenderTargetActions::DontLoad_Store);
	RHICmdList.BeginRenderPass(RPInfo, TEXT("shaderTest"));

	auto ShaderMap = GetGlobalShaderMap(FeatureLevel);

	TShaderMapRef<FMyVS> MyVS(ShaderMap);
	TShaderMapRef<FMyPS> MyPS(ShaderMap);

	// 渲染状态
	FGraphicsPipelineStateInitializer GraphicsPSOInit;
	RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
	GraphicsPSOInit.DepthStencilState = TStaticDepthStencilState<false, CF_Always>::GetRHI();
	GraphicsPSOInit.BlendState = TStaticBlendState<>::GetRHI();
	GraphicsPSOInit.RasterizerState = TStaticRasterizerState<>::GetRHI();
	GraphicsPSOInit.PrimitiveType = PT_TriangleList;
	GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GetVertexDeclarationFVector4();
	GraphicsPSOInit.BoundShaderState.VertexShaderRHI = MyVS.GetVertexShader();
	GraphicsPSOInit.BoundShaderState.PixelShaderRHI = MyPS.GetPixelShader();
	SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);

	MyPS->SetColor(RHICmdList, Color);

	FRHIResourceCreateInfo CreateInfo;
	FVertexBufferRHIRef VertexBufferRHI = RHICreateVertexBuffer(sizeof(FVector4) * 4, BUF_Static, CreateInfo);
	void* VoidPtr = RHILockVertexBuffer(VertexBufferRHI, 0, sizeof(FVector4) * 4, RLM_WriteOnly);
	FVector4* Vertics = reinterpret_cast<FVector4*>(VoidPtr);
	Vertics[0] = FVector4(-1.0f, 1.0f, 0.0f, 1.0f);
	Vertics[1] = FVector4(1.0f, 1.0f, 0.0f, 1.0f);
	Vertics[2] = FVector4(-1.0f, -1.0f, 0.0f, 1.0f);
	Vertics[3] = FVector4(1.0f, -1.0f, 0.0f, 1.0f);
	RHIUnlockVertexBuffer(VertexBufferRHI);

	RHICmdList.SetStreamSource(0, VertexBufferRHI, 0);
	RHICmdList.DrawPrimitive(0, 2, 1);
	RHICmdList.EndRenderPass();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值