#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
, вызов вызывается после того, как эта камера уже закончила рендеринг. Поэтому, чтобы сделать это более эффективным — поскольку мы в основном отбрасываем этот рендеринг — просто убедитесь, что камера в основном ничего не рендерит, отключив все слои и, например, разрешив ей отображать только один цветной фон