UnityФорумОбщее

Unity URP камеры

#0
14:32, 1 апр 2025

UI камера в стэке камер ест больше основной. Это контрится в frame scripts. Причём она рисует только ui layer и там вообще ни о чём. Какие-то сердечки, ключики, цифры, текст. А mainCamera - наоборот, кучу всего, постпроцессинг, туман и прочее. ЧЗНХ? Кто-нибудь сталкивался, как побороть?

#1
15:47, 2 апр 2025

Рендери UI-камерой только когда есть изменение в UI, всё остальное время держи ее выключенной.

#2
18:39, 2 апр 2025

Камеру выкл - всё исчезает, она не рендерит какбэ...

Хм. Почитал. К сожалению такого решения из коробки - нет. Только через костыли. На форумах юнити пишут разные варианты исполнения скриптов-костылей. Вплоть до скриншота.

#3
12:43, 25 июля 2025

Код UI камеры

[RequireComponent(typeof(Camera))]
    public class DDUICameraController : MonoBehaviour
    {
        [SerializeField] private Camera uiCamera;
        [SerializeField] private RawImage uiDisplay;
        [SerializeField] private Canvas uiCanvas;
        [SerializeField] private RenderTexture uiRenderTexture;
        private bool needsRender;

        void Start()
        {
            if (uiCamera == null || uiDisplay == null || uiCanvas == null || uiRenderTexture == null)
            {
                Debug.LogError($"Ошибка: uiCamera={uiCamera}, uiDisplay={uiDisplay}, uiCanvas={uiCanvas}, uiRenderTexture={uiRenderTexture}");
                return;
            }

            // Настройка UI Canvas
            uiCanvas.renderMode = RenderMode.ScreenSpaceCamera;
            uiCanvas.worldCamera = uiCamera;

            // Настройка камеры
            uiCamera.enabled = false;
            uiCamera.clearFlags = CameraClearFlags.Nothing;
            uiCamera.cullingMask = 1 <<LayerMask.NameToLayer("UI");
            uiCamera.targetTexture = uiRenderTexture;

            uiRenderTexture.memorylessMode = RenderTextureMemoryless.None;

            // Настройка RawImage
            uiDisplay.gameObject.layer = LayerMask.NameToLayer("Default");
            uiDisplay.color = new Color(1, 1, 1, 1);
            uiDisplay.texture = uiRenderTexture;

            // Проверка, что RenderTexture активна
            if (!uiRenderTexture.IsCreated())
            {
                uiRenderTexture.Create();
                Debug.Log("RenderTexture создана");
            }

            RenderUI();
            Debug.Log("UI отрендерен при старте");
        }

        public void RequestUIRender()
        {
            needsRender = true;
            Debug.Log("Запрошен рендер UI");
        }

        void LateUpdate()
        {
            if (needsRender)
            {
                RenderUI();
                needsRender = false;
            }
        }

        private void RenderUI()
        {
            if (uiCamera == null || uiCanvas == null || uiRenderTexture == null) return;
            Canvas.ForceUpdateCanvases();
            uiCamera.Render();
            Debug.Log("UI отрендерен");
        }

        void OnDestroy()
        {
            if (uiRenderTexture != null && uiRenderTexture.IsCreated())
            {
                uiRenderTexture.Release();
                Debug.Log("RenderTexture освобождена");
            }
        }

        [Button]
        private void DebugRenderTexture()
        {

            Canvas.ForceUpdateCanvases();
            uiCamera.Render();
            //uiCamera.targetTexture = null;

            RenderTexture.active = uiRenderTexture;
            Texture2D tex = new Texture2D(uiRenderTexture.width, uiRenderTexture.height, TextureFormat.RGBA32, false);
            tex.ReadPixels(new Rect(0, 0, uiRenderTexture.width, uiRenderTexture.height), 0, 0);
            tex.Apply();
            System.IO.File.WriteAllBytes("RenderTextureDebug.png", tex.EncodeToPNG());
            Object.Destroy(tex);
            RenderTexture.active = null;
            Debug.Log("RenderTexture сохранена как RenderTextureDebug.png");
        }
    }

#4
17:41, 25 июля 2025

Dmitry_togliatti
Отдельная камера на UI у тебя чтобы что?

#5
20:22, 25 июля 2025

Ducat
Чтобы отделить перспективу от ортогонального канваса. Так говорили все гайды. Но я чёт только сегодня узнал что оказывается можно просто делать оверлэй канвас с канвас рендерером вместо стэка камер в urp. И управлять его рендером из скрипта, что я и сделаю. А проблему с спрайтами всё же придется решать рендер фичей. Пока не сделал, но должно получиться. Должно?

#6
20:25, 25 июля 2025

Dmitry_togliatti
Если ты не выпендриваешься с перспективой на интерфейсе, а делаешь его обычным, плоским - никакая доп камера для него не нужна.
Ну и чтобы у тебя все рисовалось за один дроуколл - все спрайты стоит запихать в один атлас, и проследить, чтобы у всего было единое значение координаты Z (0)

#7
10:22, 26 июля 2025

Ducat
ок

#8
15:24, 27 июля 2025

С оверлей камерой эффектов и пост процессинга на UI не будет.

#9
19:22, 27 июля 2025

ДобрыйБарин
> это самое плохое решение. Она жрет как не в себя. Лучшее решение. Для UI - оверлей канвас без камеры с канв рендерером. А для спрайтов в перспективе - добавить стандартную render feature render objects. Стэк камер в URP - самое немыслимое решение из коробки, т.к. URP - всегда про экономию.

#10
11:10, 28 июля 2025

Dmitry_togliatti
это к чему написано? Выше была лишь констатация факта что пост процессинг ты не используешь с оверлей камерой, а кто че жрет это дело последнее. Выбор между красотой и оптимизацией это вечный выбор.

#11
12:38, 28 июля 2025

ДобрыйБарин
Не совсем так, не последнее. Да, это констатация факта. Но это плохое решение. Именно в ветках про URP родного Юнити форума это предлагают. И это приводит к тому, что ты платишь за HUD (в котором околоничего) +15-40% от нагрузки основной камеры. Я не пытаюсь спорить, но эту горькую правду должны помнить адепты URP. Не забываем, что URP именно для экономии, компромисс.

#12
(Правка: 13:33) 13:25, 28 июля 2025

Dmitry_togliatti
> Но это плохое решение.
Это не плохое решение, это выбор который каждый для себя должен однажды сделать.
Dmitry_togliatti
> Не забываем, что URP именно для экономии, компромисс.
Все зависит от конкретики, если этот UI используется буквально как оверлей, т.е. перекрывает полностью всю картинку с внешней камеры и рисует поверх всего инвентарь персонажа, это может быть оправданно для создание эффектной картинки даже в URP. Одновременно будет работать лишь одна камера в сцене. Во время скроллинга UI не всегда нужно иметь 200 фпс, зачастую хватит менее 100.
Я сделал в URP поверх основного рендера еще SSR, чтобы улучшить визуал проекта. Все зависит конечно же от задач. В вашем проекте видимо это все лишено смысла, но это не всегда будет плохим решением, если другие люди предлагают, видимо знаю о чем говорят.
В Unity это наверно даже как правило - что камера UI жрет либо столько же, либо даже больше основной. И это плата за красоту.
Ваша мотивация мне понятна, лишь написал то, что написал: "С оверлей камерой эффектов и пост процессинга на UI не будет". Это не плохо и не хорошо, данность, и компромиссы на которые вы пошли ради оптимизации.
URP позволяет делать очень красивую картинку с высокой производительностью. Так, что тезисы про вечную оптимизацию на URP тоже можно парировать, но я не буду продолжать делать это. Все это описано не чтобы поспорить.

#13
15:25, 29 июля 2025

ДобрыйБарин
> URP позволяет делать очень красивую картинку с высокой производительностью.
Если не жалко, ссыль на основные фишки. Просто я уже давно на urp, пробовал всякое, качал шейдеры, туманы... И до сих пор мне он кажется овном даже в сравнении с BRP по визуалу. Или хоть обозначь секретные подходы (если не жалко), тайные техники, палец смерти и всё такое

#14
(Правка: 30 июля 2025, 16:21) 19:51, 29 июля 2025

Dmitry_togliatti
Я сам написал SSR, адаптировал из разных источников, можешь в лс написать сразу с контактами, если такое интересует. У меня и обьемный свет работает, и рейтрейсинг отражения, все в URP прекрасно выдает 200-300 фпс в простых сценах на кубах. От сложности сцены это все будет вести себя по разному, но в целом быстро. Все дело в знаниях, можно и без доп контента хорошо настроить цветокоррекцию по аналогии с реальной камерой. У меня получалось делать картинку интересной и без сильных наворотов рендера. Все примеры могу покидать  в лс. Конкретных ссылок нету, потому что опыт годами нарабатывался.

UnityФорумОбщее