如何将全局着色器添加到UE4
如何将全局着色器添加到UE4 在虚幻引擎4中,全局着色器是可以从C ++方面使用的渲染后处理效果,调度计算着色器,清除屏幕等的着色器(即,不对材质或网格进行操作的着色器)。 有时,需要更高级的功能来实现 所需的外观,并且需要定制着色器传递。 这样做比较简单,我将在这里解释一下。 UE4从引擎/着色器文件夹中读取.usf文件(虚幻着色器文件)。 任何新的着色器都需要将源文件放在这里。 从4.17开始,着色器也可以从插件(插件/着色器)读取。 我建议在您的ConsoleVariables.ini文件中启用r.ShaderDevelopmentMode = 1以便于开发。 查看文档了解更多信息。 我们先从您的引擎/着色器文件夹中添加一个新的.usf文件。 我们称它为MyTest.usf。 然后添加一个简单的直通顶点着色器和一个返回自定义颜色的像素着色器: [C++] 纯文本查看 复制代码 // MyTest.usf// Simple pass-through vertex shadervoid MainVS( in float4 InPosition : ATTRIBUTE0, out float4 Output : SV_POSITION){ Output = InPosition;}// Simple solid color pixel shaderfloat4 MyColor;float4 MainPS() : SV_Target0{ return MyColor;} 现在,为了让UE4拿起着色器并开始编译,我们需要声明一个C ++类。 我们从顶点着色器开始: 这里有一些要求:
随着类声明,我们现在可以将着色器类型注册到UE4的列表中: [C++] 纯文本查看 复制代码 // This needs to go on a cpp fileIMPLEMENT_SHADER_TYPE(, FMyTestVS, TEXT("MyTest"), TEXT("MainVS"), SF_Vertex); 该宏将类型(FMyTestVS)映射到.usf文件(MyTest.usf),着色器入口点(MainVS)和频率/着色器阶段(SF_Vertex)。 只要它的ShouldCache()方法返回true,它也会使着色器被添加到编译列表中。 注意:无论您将FGlobalShader添加到实际引擎启动前必须加载的模块,或者您将得到一个assert,如“引擎初始化之后加载着色器类型,在模块上使用ELoadingPhase :: PostConfigInit以使其早期加载 “我们目前不允许在游戏或编辑器启动后加载自己的着色器类型的动态模块。 现在我们来宣布更有趣的Pixel Shader: [C++] 纯文本查看 复制代码 class FMyTestPS : public FGlobalShader{ DECLARE_EXPORTED_SHADER_TYPE(FMyTestPS, Global, /*MYMODULE_API*/); FShaderParameter MyColorParameter; FMyTestPS() { } FMyTestPS(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FGlobalShader(Initializer) { MyColorParameter.Bind(Initializer.ParameterMap, TEXT("MyColor"), SPF_Mandatory); } static void ModifyCompilationEnvironment(EShaderPlatform Platform, FShaderCompilerEnvironment& OutEnvironment) { FGlobalShader::ModifyCompilationEnvironment(Platform, OutEnvironment); // Add your own defines for the shader code OutEnvironment.SetDefine(TEXT("MY_DEFINE"), 1); } static bool ShouldCache(EShaderPlatform Platform) { // Could skip compiling for Platform == SP_METAL for example return true; } // FShader interface. virtual bool Serialize(FArchive& Ar) override { bool bShaderHasOutdatedParameters = FGlobalShader::Serialize(Ar); Ar SetColor(RHICmdList, Color); // Setup the GPU in prep for drawing a solid quad RHICmdList.SetRasterizerState(TStaticRasterizerState::GetRHI()); RHICmdList.SetBlendState(TStaticBlendState::GetRHI()); RHICmdList.SetDepthStencilState(TStaticDepthStencilState::GetRHI(), 0); // Setup the vertices FVector4 Vertices[4]; Vertices[0].Set(-1.0f, 1.0f, 0, 1.0f); Vertices[1].Set(1.0f, 1.0f, 0, 1.0f); Vertices[2].Set(-1.0f, -1.0f, 0, 1.0f); Vertices[3].Set(1.0f, -1.0f, 0, 1.0f); // Draw the quad DrawPrimitiveUP(RHICmdList, PT_TriangleStrip, 2, Vertices, sizeof(Vertices[0]));} 如果你想在你的代码库中测试这个,你可以尝试声明一个控制台变量,这样它就可以像运行时那样切换: [C++] 纯文本查看 复制代码 static TAutoConsoleVariable CVarMyTest( TEXT("r.MyTest"), 0, TEXT("Test My Global Shader, set it to 0 to disable, or to 1, 2 or 3 for fun!"), ECVF_RenderThreadSafe);void FDeferredShadingSceneRenderer::RenderFinish(FRHICommandListImmediate& RHICmdList){ [...] // *** // Inserted code, just before finishing rendering, so we can overwrite the screen’s contents! int32 MyTestValue = CVarMyTest.GetValueOnAnyThread(); if (MyTestValue != 0) { FLinearColor Color(MyTestValue == 1, MyTestValue == 2, MyTestValue == 3, 1); RenderMyTest(RHICmdList, FeatureLevel, Color); } // End Inserted code // *** FSceneRenderer::RenderFinish(RHICmdList); [...]} 在这一点上,您应该可以测试我们的新的全球着色器! 运行您的项目,然后使用波浪号(〜)拉起控制台并输入r.MyTest 1.然后键入r.MyTest 2和/或r.MyTest 3来更改颜色。 使用r.MyTest 0禁用通行证。 调试生成的源代码 看看博客文章调试着色器编译过程,如果你想能够调试.usf文件的编译和/或看到处理的文件。 总结 您可以在一个未用的游戏/编辑器运行时修改.usf文件,然后按Ctrl + Shift +。 (期间)或类型重编译器在控制台中更改,以拾取并重建您的着色器以进行快速迭代! 原文标题:How to Add Global Shaders to UE4 |
关注CG资源素材