Unreal Engineで実行時にテクスチャの色を変更できたら便利かなと思って試したもの。できたはできたが思ったようにうまくはいかなかった。ためしに白色を他の色に変えようと思ったのだが、ムラができてしまった。元の画像がそうなのか、UEに取り込まれてミップマップ化された時にそうなったのかはわからない。検証するかもしれないししないかもしれないのでとりあえずメモだけ。
UPrimitiveComponent* Primitive = Cast<UPrimitiveComponent>(GetComponentByClass(UPrimitiveComponent::StaticClass()));
UMaterialInstanceDynamic* Material = Primitive->CreateAndSetMaterialInstanceDynamicFromMaterial(
0,
Cast<UMaterial>(StaticLoadObject(UMaterial::StaticClass(), nullptr, TEXT("/Game/Materials/MyMaterial")))
);
UTexture2D* Texture = Cast<UTexture2D>(StaticLoadObject(
UTexture2D::StaticClass(), nullptr, TEXT("/Game/Model/train/Textures/MyTexture")
));
Texture->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
Texture->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps;
Texture->SRGB = false;
Texture->UpdateResource();
struct RGBA { uint8 R, G, B, A; };
RGBA* Data = (RGBA*)Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
int DataSize = Texture->PlatformData->Mips[0].SizeX
* Texture->PlatformData->Mips[0].SizeY;
for (int Index = 0; Index < DataSize; Index++)
{
RGBA* Color = Data + Index * sizeof(RGBA);
// UE_LOG(LogTemp, Log, TEXT("RGBA %d %d %d"), Color->R, Color->G, Color->B);
if (Color->R > 200 && Color->G > 200 && Color->B > 200)
{
Color->G = 0;
}
}
Texture->PlatformData->Mips[0].BulkData.Unlock();
Texture->UpdateResource();
Material->SetTextureParameterValue(TEXT("BaseColor Map"), Texture);
このActorを画面上に配置してモデルのコンポーネントを追加して動かす。しかしそれにしても失敗するとすぐエディタが落ちる……。
詳しく調べてないけどそのマテリアル自体が変わってしまって同時に複数の色にはできない場合、そうしたい人は別のやり方が必要なのかもしれない。
下記を参考にした。
UE4/C++: メッシュのマテリアルやテクスチャーをC++コードで制御する方法 - C++ ときどき ごはん、わりとてぃーぶれいく☆
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント