? 一本大道香蕉视频在线观看,日韩亚洲欧美国产制服,红豆视频高清在线观看
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

使用IPlatformFile進(jìn)行Shader文件在開發(fā)協(xié)同

來源: 52vr | 責(zé)任編輯:傳說的落葉 | 發(fā)布時(shí)間: 2019-06-13 08:18 | 瀏覽量:

Unreal Engine 4 —— 使用IPlatformFile進(jìn)行Shader文件在開發(fā)團(tuán)隊(duì)間的共享

 
這篇文章介紹了如何使用IPlatformFile來實(shí)現(xiàn)Shaders文件在開發(fā)團(tuán)隊(duì)間的共享。
 
這篇文章所涉及的代碼來自Temaran的UE4ShaderPluginDemo里面的ShaderCopyHelper插件。
 
背景
 
雖然UE4的材質(zhì)編輯器已經(jīng)足夠強(qiáng)大并且可以支持大部分的需求了,但是有時(shí)候我們還是需要自定義自己的Shader。
 
但是由于UE4的著色器必須位于Engine/Shaders/文件夾下,這樣一來針對(duì)那些不進(jìn)行定制化UE4的開發(fā)團(tuán)隊(duì)來說,對(duì)Shaders文件夾進(jìn)行代碼管理就不太方便了。
 
解決方案
 
對(duì)于開發(fā)團(tuán)隊(duì)來說,最好的解決方案便是在項(xiàng)目文件夾下維護(hù)一個(gè)Shaders文件夾。由于Shaders文件夾位于項(xiàng)目文件夾下,因此對(duì)其進(jìn)行代碼管理就是一件非常容易的事。
 
那么我們要做的便是在引擎打開時(shí),將項(xiàng)目下的Shaders下的文件復(fù)制到Engine/Shaders/文件夾中,并且在引擎關(guān)閉時(shí),將這些文件刪除。
 
使用插件uplugin
 
由于UE4的插件可以將StartupModule()和ShutdownModule()直接暴露出來,并且可以指定其只在編輯器(Developer)下啟用,因此無疑成為了這個(gè)功能實(shí)現(xiàn)的最好平臺(tái)。
 

[代碼]:

1 "Modules" :
2 [
3     {
4         "Name" "ShaderCopyHelper",
5         "Type" "Developer",
6         "LoadingPhase" "PostConfigInit"
7     }
8 ]
 
代碼實(shí)現(xiàn)
 
了解原理后,具體的實(shí)現(xiàn)就很簡單了。先遍歷項(xiàng)目文件夾下的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 }
 
在整個(gè)模塊startup時(shí),使用IPlatformFile::CopyFile(const TCHAR* To, const TCHAR* From)函數(shù)進(jìn)行文件的拷貝:
 

[代碼]:

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 }
 
同樣的,在模塊退出時(shí),將這些文件刪除:
 

[代碼]:

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 }
 
這樣一來,團(tuán)隊(duì)中的成員只需要啟用這個(gè)插件,然后維護(hù)Shaders文件夾就可以了。

相關(guān)文章
網(wǎng)友評(píng)論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)

關(guān)閉

全部評(píng)論:0條

推薦
熱門