tft每日頭條

 > 科技

 > ue5如何添加材質裡的元素

ue5如何添加材質裡的元素

科技 更新时间:2025-01-12 08:40:53
目标:UE5在runtime下現實加載PNG,JPG等圖片資源

先看效果:

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)1

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)2

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)3

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)4

步驟1. 創建UE5工程

新建UE5的C 空白項目TestPicturePro,記得選擇C ,初學者包可以根據自己需要選擇是否勾選。

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)5

步驟2. 創建空白插件,命名為SimplePictureTools

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)6

插件創建成功後可以看到如下目錄:

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)7

步驟3. 創建的藍圖靜态方法類

C 文件夾下右擊,創建C 類

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)8

選擇藍圖靜态方法類,點擊下一步

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)9

修改文件文件夾路徑,我們這裡修改到新創建的插件文件夾下

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)10

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)11

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)12

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)13

技巧:選擇公共的話,UE會把頭文件放到public文件夾下面,cpp文件放到Private文件夾下面,如果選擇私有的話,UE會把頭文件 cpp文件都放到Private文件夾下面。

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)14

同樣創建成功後會出現

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)15

步驟4. 在SimplePictureToolsLibrary.h定義LoadImageToTexture2D方法

public: UFUNCTION(BlueprintCallable, Category="Picture Tool") static bool LoadImageToTexture2D(const FString& ImagePath, UTexture2D* &InTexture, float& Width, float& Height);

據說UTexture2D是一個指針,我們需要把他傳到藍圖中,所以需要添加引用&InTexture

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)16

在LoadImageToTexture2D方法中添加用于:取出ImagePath文件的二進制數據的代碼

// 取出ImagePath文件的二進制數據 TArray<uint8> ImageResultData; FFileHelper::LoadFileToArray(ImageResultData,*ImagePath);

加載圖片處理模塊

// 加載圖片處理模塊 // 使用模塊管理器的帶有檢測功能的模塊加載方法LoadModuleChecked IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>("ImageWrapper");

找到runtime下的ImageWrapper模塊的方法如下:

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)17

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)18

模塊名

并且要在TestPicturePro.Build.cs中添加模塊ImageWrapper。

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)19

根據不同的文件格式創建不同的文件處理類

TSharedPtr<IImageWrapper> ImageWrapper= ImageWrapperModule.CreateImageWrapper(EImageFormat::BMP);

UE目前支持的格式如下:

enum class EImageFormat : int8 { /** Invalid or unrecognized format. */ Invalid = -1, /** Portable Network Graphics. */ PNG = 0, /** Joint Photographic Experts Group. */ JPEG, /** Single channel JPEG. */ GrayscaleJPEG, /** Windows Bitmap. */ BMP, /** Windows Icon resource. */ ICO, /** OpenEXR (HDR) image File format. */ EXR, /** Mac icon. */ ICNS, /** Truevision TGA / TARGA */ TGA, /** Hdr file from radiance using RGBE */ HDR, /** Tag Image File Format files */ TIFF, };

判斷傳進來的文件格式,獲取文件名後綴,判斷文件格式,并且傳給圖片處理類

//獲取文件名後綴,判斷文件格式 FString Ex =FPaths::GetExtension(ImagePath,false); EImageFormat ImageFormat = EImageFormat::Invalid; if (Ex.Equals(TEXT("jpg"),ESearchCase::IgnoreCase) || Ex.Equals(TEXT("jpeg"),ESearchCase::IgnoreCase)) { ImageFormat = EImageFormat::JPEG; } else if(Ex.Equals(TEXT("png"),ESearchCase::IgnoreCase)) { ImageFormat = EImageFormat::PNG; } else if(Ex.Equals(TEXT("bmp"),ESearchCase::IgnoreCase)) { ImageFormat = EImageFormat::BMP; } // 加載圖片處理模塊 // 使用模塊管理器的帶有檢測功能的模塊加載方法LoadModuleChecked IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>("ImageWrapper"); // 根據不同文件格式創建不同的文件處理類 TSharedPtr<IImageWrapper> ImageWrapper= ImageWrapperModule.CreateImageWrapper(ImageFormat);

根據壓縮文件,解析圖片

// 根據壓縮文件,解析圖片 if (ImageWrapperPtr.IsValid() && ImageWrapperPtr->SetCompressed(ImageResultData.GetData(),ImageResultData.Num())) { }

内存分配的時候

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)20

,也可以把ImageResultDataNum()換成ImageResultData.GetAllocatedSize()

接下來去獲取BGRA的顔色數據

TArray<uint8> OutRawData; // 此數據跟格式無關 ImageWrapperPtr->GetRaw(ERGBFormat::BGRA, 8,OutRawData);

最後把顔色數據拷貝到需要的貼圖中

// 最後把顔色數據拷貝到需要的貼圖中 Width = ImageWrapperPtr->GetWidth(); Height = ImageWrapperPtr->GetHeight(); InTexture = UTexture2D::CreateTransient(Width,Height, PF_B8G8R8A8); if (InTexture) { //數據拷貝時候,如果是多線程的話,不加鎖可能會引起崩潰哦 // 加鎖,LOCK_READ_WRITE可讀可寫 void* TextureData = InTexture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE); // 賦值,把OutRawData顔色數據賦值給到InTexture FMemory::Memcpy(TextureData, OutRawData.GetData(), OutRawData.Num()); //解鎖 InTexture->PlatformData->Mips[0].BulkData.Unlock(); // 刷新資源 InTexture->UpdateResource(); return true; }

到此,LoadImageToTexture2D函數功能已經寫完,編譯運行

步驟5. 創建UI進行測試

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)21

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)22

創建4個按鈕,用來分别測試不同圖片

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)23

使用藍圖定義函數BP_LoadImageToTexture2D,定義4個按鈕事件,分别調用BP_LoadImageToTexture2D測試JPG,PNG,BMP等圖片

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)24

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)25

好了,最近這一節這麼多了,大家課後自己嘗試其他類型圖片,希望今天的内容對你有所幫助! 最後效果如下:

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)1

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)3

ue5如何添加材質裡的元素(UE5開發室内設計軟件RunTime資源加載)28

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved