2020-06-10に更新

Unreal Engineで実行中にテクスチャを更新するサンプル

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開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, Vue.js, React, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!
ボードとは?

関連記事

コメント