[UE4] 동적 텍스처
Dynamic Material Instance
매터리얼 및 텍스처 파라미터 만들기 : TextureSampleParameter2D
해당 머터리얼의 인스턴스 생성.
Construction Script
static mesh 를 가져와 해당 메시의 매터리얼을 동적 매터리얼 인스턴스를 생성
Dynamic Material 에 설정한 파라미터 변경
파일에서 텍스처 만들기 : 참조 Rama's Victory plugin - https://wiki.unrealengine.com/File:VictoryPlugin.zip
#include <IImageWrapperModule.h>
UTexture2D* Sample::Test( const FString& FullPath, int32& Width, int32& Height)
{
UTexture2D* LoadedTexture2D = NULL;
IImageWrapperModule& ImageWrapperModule =
FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
IImageWrapperPtr ImageWrapper =
ImageWrapperModule.CreateImageWrapper(EImageFormat::Type::JPEG);
// read raw data from file
TArray<uint8> RawFileData;
if(!FFileHelper::LoadFileToArray(RawFileData, *FullPath))
{
return NULL;
}
// set raw data to image wrapper
if( ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()))
{
// gets uncompressed raw data of image
const TArray<uint8>* UncompressedBGRA = NULL;
// GetRaw( ERGBFormat::Type, 채널별 비트수, 출력 배열)
if(ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))
{
// create 32bit texture
LoadedTexture2D = UTexture2D::CreateTransient(
ImageWrapper->GetWidth(),
ImageWrapper->GetHeight(),
PF_B8G8G8A8);
if( !LoadedTexture2D )
{
return NULL;
}
// output
Width = ImageWrapper->GetWidth();
Height = ImageWrapper->GetHeight();
// FTexturePlaformData
// TIndirectArray<struct FTexture2DMipMap>
// FTexture2DMipMap
// FByteBulkData
void* TextureData = LoadedTextuer2D->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
FMemory::Memcpy(TextureData, UncompressedBGRA0>GetData(), UncompressedBGRA->Num());
LoadedTexture2D->PlatformData->Mips[0].BulData.Unlock();
LoadedTexture2D->UpdateResource();
}
}
return LoadedTexture2D;
}
이미지포맷 ENUM 값
EImageFormat::Type
Invalid = -1,
PNG = 0,
JPEG,
GrayscaleJPEG,
BMP,
EXP,
ICNS,