Войти
Unreal EngineФорумПрограммирование

Изменить текстуру у материала в рантайме

#0
(Правка: 17:41) 17:38, 7 апр. 2021

Привет всем! Возникла необходимость выводить на произвольный объект постоянно обновляемую текстуру (здесь она в переменной dynamicCanvas). Всё нужно сделать в рантайме на C++. Пытаюсь сделать так:

          UStaticMesh* StaticMesh = StaticMeshComponent->GetStaticMesh();

          UMaterialInterface* material = StaticMesh->GetMaterial(0);
          
          UMaterialInstanceDynamic* DynamicMaterial = UMaterialInstanceDynamic::Create(material, GetWorld());

          StaticMesh->SetMaterial(0, DynamicMaterial);

          StaticMeshComponent->SetMaterial(0, DynamicMaterial);

          DynamicMaterial->SetTextureParameterValue(FName("BaseColor"), dynamicCanvas);
однако материал у меша заменяется, а текстура - нет, значит я неправильно назначаю текстуру в последней строке. Что я делаю не так?


#1
17:50, 7 апр. 2021

проверяй dynamicCanvas

#2
18:06, 7 апр. 2021

Osiris
dynamicCanvas создаю следующим образом один раз:

  dynamicCanvas = UTexture2D::CreateTransient(320, 240);
  dynamicCanvas->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
  dynamicCanvas->SRGB = 1;
  dynamicCanvas->AddToRoot();
  dynamicCanvas->Filter = TextureFilter::TF_Nearest;
проверил, он не nullptr, т.е. живой. Может, я неправильные флаги указал? И правильно ли я понял, что BaseColor есть почти у всех материалов, и на него можно задавать текстуру?
#3
18:46, 7 апр. 2021

Проверяй все по этапам - сналчаа создай DynamicMaterialInstance отличный от того, что на меше - чтобы првоерить ставится ли материал (хотя ты говоришь, что ставится), далее попроубй просто текстуру сменить, не ту что ты создал

#4
(Правка: 19:21) 19:20, 7 апр. 2021

Спасибо! Сделал свой материал, создал у него кастомный параметр-текстуру с именем "Param", назначил компоненту. После этого заменил

    DynamicMaterial->SetTextureParameterValue(FName("BaseColor"), dynamicCanvas)
на
    DynamicMaterial->SetTextureParameterValue(FName("Param"), dynamicCanvas)
и оно заработало. Видимо требуется явно указывать свойства материалов, и по умолчанию свойств-текстур у материалов нет, либо я неправильно к ним обращался.

Возник новый вопрос: по каким причинам текстура после вызова

dynamicCanvas->UpdateTextureRegions((int32)0, (uint32)1, echoUpdateTextureRegion.get(), (uint32)bufferPitch, (uint32)bytesPerPixel, bytesData);
dynamicCanvas->UpdateResource();
может не обновляться? Я пытаюсь запихнуть в неё RAW-байты.

#5
19:29, 7 апр. 2021

SetTextureParameterValue для TextureParameter в материале, касательно текстуры обычно текстура для обновления должна быть динамической, на уровне API. Как там в Unreal не помню, возможно что они все по-умолчанию динамические, кроме RT.

#6
18:45, 9 апр. 2021

Спасибо, справился.

Unreal EngineФорумПрограммирование