UE4.24 材质Custom节点链接.usf文件

UE4材质编辑器中的Custom节点可以写hlsl代码,方便进行一些复杂计算,比如for循环。可以保证材质面板简洁可读性高。UE4之前的版本直接在Custom节点中用#include包含Shaders文件夹下的ush或usf文件,这样可以用外部的代码编辑器编写shader文件。但是最近的版本有所改动,Custom节点无法识别Shaders路径下的文件。所以需要修改工程模块来包含任意路径。

准备工作

  • 首先创建C++工程,如果是蓝图工程可以添加新的C++类,会自动转成C++工程。假设项目名称为MotionBlur。
  • 修改MotionBlur.Build.cs:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnrealBuildTool;
public class MotionBlur : ModuleRules
{
public MotionBlur(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[]
{ "Core", "CoreUObject", "Engine", "InputCore",
// 添加依赖模块,旧版是ShaderCore,现在改为RenderCore
"RHI", "RenderCore"
});

// 添加依赖项Projects,可以识别工程路径
PrivateDependencyModuleNames.AddRange(new string[] {"Projects"});
}
}
  • 修改MotionBlur.h:
1
2
3
4
5
6
7
8
9
#pragma once
#include "CoreMinimal.h"

class FMotionBlurModule : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
  • 修改MotionBlur.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "MotionBlur.h"
#include "Modules/ModuleManager.h"
#include "Misc/Paths.h"
#include "ShaderCore.h"

IMPLEMENT_MODULE(FMotionBlurModule, MotionBlur);

void FMotionBlurModule::StartupModule()
{
// 获取工程路径,并指定usf文件存放的路径为工程的Shaders文件夹
FString ShaderDirectory = FPaths::Combine(FPaths::ProjectDir(), TEXT("Shaders"));
// 路径映射Csutom节点直接写#include"/Project/xxx.usf"即可
AddShaderSourceDirectoryMapping("/Project", ShaderDirectory);
}

void FMotionBlurModule::ShutdownModule()
{
ResetAllShaderSourceDirectoryMappings();
}

使用

  • 函数可以放在统一的Custom节点,只有主要执行节点才可以识别输入的参数
    customnode path

  • .usf文件要放在工程路径下的Shaders文件夹(之前在CPP里自定义的路径)

总要恰饭的嘛