Как визуализировать текстуру непосредственно на камеру в Unity

#unity3d #shader #textures

Вопрос:

В единстве у меня есть 2 изображения в виде текстуры, которые я объединяю вместе (одно накладывается на другое). Я делаю это в вычислении Shader и помещаю результаты на RenderTexture . Я хочу, чтобы это RenderTexture было все, что видит выходная камера.

Я нашел статьи, в которых говорится об использовании ReplacementShader свойства камеры, но я не смог заставить это работать должным образом.

В настоящее время я просто поместил RenderTexture изображение на a UIRawImage , которое покрывает весь холст пользовательского интерфейса, чтобы вся камера была заполнена. Однако это имеет большое отставание и, очевидно, является неоптимальным решением.

Итак, как выводить Rendertexture или вычислять Shader результат непосредственно на камеру. Спасибо.

Комментарии:

1. Вы пытались добавить эту текстуру к изображению пользовательского интерфейса? Должно быть, все работает нормально

2. Также возможно, что производительность снижается в процессе создания рендертекста. Если вы закомментируете только ту часть кода, в которой вы назначаете текстуру визуализации для RawImage, действительно ли это устраняет снижение производительности? Потому что если нет, проблема не связана с RawImage.

3. @yasirkula, оказалось, что задержка на самом деле возникла из-за передачи данных текстуры рендеринга между процессором и графическим процессором, чтобы использовать их в Texture2D (поскольку текстура рендеринга была относительно большой).

Ответ №1:

Вы, вероятно, могли бы использовать OnRenderImage

Функция события, вызываемая Unity после завершения рендеринга камеры, которая позволяет изменять конечное изображение камеры.

и использовать Graphics.Blit

Копирует исходную текстуру в целевую текстуру рендеринга с помощью шейдера.

и сделайте что-нибудь вроде, например

 // This script goes onto your according Camera
public class RenderReplacement : MonoBehaviour
{
    public RenderTexture replacement;

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        // To overwrite the entire screen
        Graphics.Blit(replacement, null);

        // Or to overwrite only what this specific Camera renders
        //Graphics.Blit(replacement, dest);
    }
}
 

Где

дест

Пункт назначения RenderTexture . Установите это null значение, чтобы мигать прямо на экране. Дополнительную информацию смотрите в описании.


Примечание. Как указано в API OnRenderImage , вызов вызывается после того, как эта камера уже закончила рендеринг. Поэтому, чтобы сделать это более эффективным — поскольку мы в основном отбрасываем этот рендеринг — просто убедитесь, что камера в основном ничего не рендерит, отключив все слои и, например, разрешив ей отображать только один цветной фон