在Unreal中不能直接对模型使用自定义hlsl shader,但是可以使用材质编辑器下的Custom节点并配合外部hlsl文件结合使用。外部hlsl文件一般存放于usf、ush中,其中usf存放代码段较常用,本文就来讲一讲。
注:该案例使用UE5.4实现
1.配置插件
首先新建蓝图库插件,用于在插件StartupModule阶段加载指定目录内容:
此处插件命名为MyUsfLoader。
找到MyUsfLoader.cpp,在StartupModule函数中增加路径映射:
void FMyUsfLoaderModule::StartupModule()
{
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
FString ShaderDir = FPaths::Combine(FPaths::ProjectDir(), TEXT("/Shaders"));
AddShaderSourceDirectoryMapping("/Project/Shaders", ShaderDir);
}
并在对应"项目/Shaders"路径下补充对于文件夹和文件:
注意 - 如果不想用全局Shader目录,例如加载插件内某个目录下的usf文件,可以这么写:
#include "Interfaces/IPluginManager.h"
void FMyUsfLoaderModule::StartupModule()
{
const FString ShaderDir = FPaths::Combine(IPluginManager::Get().FindPlugin(TEXT("MyUsfLoader"))->GetBaseDir()
, TEXT("Shaders"));
AddShaderSourceDirectoryMapping("/Project/Shaders", ShaderDir);
}
然后添加build.cs依赖库:
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
"RenderCore"
}
);
在创建的usf文件中写一些hlsl测试函数:
half3 GetColor() {
return half3(0, 1, 1);
}
最后编译脚本,UE5可使用快捷键ctrl+alt+f11进行Live Coding编译。
2.加载运行
重启UE后,在UE中创建材质,添加Custom节点,在Include File Paths出增加usf文件包含,并调用函数做测试: