免费教程┆免费渲染┆免费模型免费软件┆下载中心┆ 资源QQ群┆学习QQ群 ┆在线课堂

3dmax吧

UE4教程(虚幻4)使用IPlatformFile进行Shader文件在开发团队间的共享
2018-02-15 09:46:30   来源:网络    评论:0 点击:

文章名称:“UE4教程(虚幻4)使用IPlatformFile进行Shader文件在开发团队间的共享”,您有不懂之处可以在文章末尾参与回复提问喔。
UE4教程(虚幻4)使用IPlatformFile进行Shader文件在开发团队间的共享
这篇文章介绍了如何使用IPlatformFile来实现Shaders文件在开发团队间的共享。
 
这篇文章所涉及的代码来自Temaran的UE4ShaderPluginDemo里面的ShaderCopyHelper插件。
 
背景
 
虽然UE4的材质编辑器已经足够强大并且可以支持大部分的需求了,但是有时候我们还是需要自定义自己的Shader。
 
但是由于UE4的着色器必须位于Engine/Shaders/文件夹下,这样一来针对那些不进行定制化UE4的开发团队来说,对Shaders文件夹进行代码管理就不太方便了。
 
解决方案
 
对于开发团队来说,最好的解决方案便是在项目文件夹下维护一个Shaders文件夹。由于Shaders文件夹位于项目文件夹下,因此对其进行代码管理就是一件非常容易的事。
 
那么我们要做的便是在引擎打开时,将项目下的Shaders下的文件复制到Engine/Shaders/文件夹中,并且在引擎关闭时,将这些文件删除。
 
使用插件uplugin
 
由于UE4的插件可以将StartupModule()和ShutdownModule()直接暴露出来,并且可以指定其只在编辑器(Developer)下启用,因此无疑成为了这个功能实现的最好平台。
 

[代码]:

1 "Modules" :
2 [
3     {
4         "Name" "ShaderCopyHelper",
5         "Type" "Developer",
6         "LoadingPhase" "PostConfigInit"
7     }
8 ]
 
代码实现
 
了解原理后,具体的实现就很简单了。先遍历项目文件夹下的Shaders文件夹并获得所有的Shader文件名:
 

[代码]:

1 bool FShaderFileVisitor::Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory)
2 {
3     if (!bIsDirectory)
4     {
5         ShaderFilePaths.Add(FPaths::GetCleanFilename(FilenameOrDirectory));
6     }
7  
8     return true;
9 }
 
在整个模块startup时,使用IPlatformFile::CopyFile(const TCHAR* To, const TCHAR* From)函数进行文件的拷贝:
 

[代码]:

01 void FShaderCopyHelperModule::StartupModule()
02 {
03     UE_LOG(ShaderCopyHelper, Log, TEXT("Shader Copy Helper Plugin loaded!"));
04  
05     FString GameShadersDirectory = FPaths::Combine(*FPaths::GameDir(), TEXT("Shaders"));
06     FString EngineShadersDirectory = FPaths::Combine(*FPaths::EngineDir(), TEXT("Shaders"));
07  
08     ShaderFiles = new FShaderFileVisitor();
09     IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
10     PlatformFile.IterateDirectoryRecursively(*GameShadersDirectory, *ShaderFiles);
11  
12     UE_LOG(ShaderCopyHelper, Log, TEXT("Copying project shader files to Engine/Shaders/"));
13     for (int32 ShaderFileIndex = 0; ShaderFileIndex < ShaderFiles->ShaderFilePaths.Num(); ShaderFileIndex++)
14     {
15         FString CurrentShaderFile = ShaderFiles->ShaderFilePaths[ShaderFileIndex];
16         FString GameShaderFullPath = FPaths::Combine(*GameShadersDirectory, *CurrentShaderFile);
17         FString EngineShaderFullPath = FPaths::Combine(*EngineShadersDirectory, *CurrentShaderFile);
18  
19         if (PlatformFile.CopyFile(*EngineShaderFullPath, *GameShaderFullPath))
20         {
21             UE_LOG(ShaderCopyHelper, Log, TEXT("Shader file %s copied to %s."), *GameShaderFullPath, *EngineShaderFullPath);
22         }
23         else
24         {
25             UE_LOG(ShaderCopyHelper, Warning, TEXT("Could not copy %s to %s!"), *GameShaderFullPath, *EngineShaderFullPath);
26         }
27     }
28 }
 
同样的,在模块退出时,将这些文件删除:
 

[代码]:

01 void FShaderCopyHelperModule::ShutdownModule()
02 {
03     FString EngineShadersDirectory = FPaths::Combine(*FPaths::EngineDir(), TEXT("Shaders"));
04     IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
05  
06     UE_LOG(ShaderCopyHelper, Log, TEXT("Deleting project shaders from Engine/Shaders/"));
07     for (int32 ShaderFileIndex = 0; ShaderFileIndex < ShaderFiles->ShaderFilePaths.Num(); ShaderFileIndex++)
08     {
09         FString EngineShaderFullPath = FPaths::Combine(*EngineShadersDirectory, *ShaderFiles->ShaderFilePaths[ShaderFileIndex]);
10  
11         if (PlatformFile.DeleteFile(*EngineShaderFullPath))
12         {
13             UE_LOG(ShaderCopyHelper, Log, TEXT("Shader file %s deleted."), *EngineShaderFullPath);
14         }
15         else
16         {
17             UE_LOG(ShaderCopyHelper, Warning, TEXT("Could not delete %s!"), *EngineShaderFullPath);
18         }
19     }
20  
21     delete ShaderFiles;
22  
23     UE_LOG(ShaderCopyHelper, Log, TEXT("Shader Copy Helper Plugin unloaded!"));
24 }
 
这样一来,团队中的成员只需要启用这个插件,然后维护Shaders文件夹就可以了。

上一篇:UE4教程(虚幻4)使用ProceduralMeshComponent实现模型实时切割
下一篇:UE4教程(虚幻4)UMG设置组件自适应居中或靠边

评论排行

版权声明:除本站原创外,本站提供的教程和资源均收集整理自网络,其版权归原始作者或原始出处所有!如有侵权请联系管理员删除(QQ:735017475)

本站提供的所有教程及模型素材等资料均用于免费分享,但是不可以盗链本站图片,也不可用于任何商业应用,否则后果自负.

版权所有:3dmax吧设计网(www.3dmax8.com)申请友情链接QQ:735017475,要求百度PR4以上。

湘ICP备05001069号-1 3DMAX吧(since-2002)