使用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();
}