UI камера в стэке камер ест больше основной. Это контрится в frame scripts. Причём она рисует только ui layer и там вообще ни о чём. Какие-то сердечки, ключики, цифры, текст. А mainCamera - наоборот, кучу всего, постпроцессинг, туман и прочее. ЧЗНХ? Кто-нибудь сталкивался, как побороть?
Рендери UI-камерой только когда есть изменение в UI, всё остальное время держи ее выключенной.
Камеру выкл - всё исчезает, она не рендерит какбэ...
Хм. Почитал. К сожалению такого решения из коробки - нет. Только через костыли. На форумах юнити пишут разные варианты исполнения скриптов-костылей. Вплоть до скриншота.
Код 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");
}
}
Dmitry_togliatti
Отдельная камера на UI у тебя чтобы что?
Ducat
Чтобы отделить перспективу от ортогонального канваса. Так говорили все гайды. Но я чёт только сегодня узнал что оказывается можно просто делать оверлэй канвас с канвас рендерером вместо стэка камер в urp. И управлять его рендером из скрипта, что я и сделаю. А проблему с спрайтами всё же придется решать рендер фичей. Пока не сделал, но должно получиться. Должно?
Dmitry_togliatti
Если ты не выпендриваешься с перспективой на интерфейсе, а делаешь его обычным, плоским - никакая доп камера для него не нужна.
Ну и чтобы у тебя все рисовалось за один дроуколл - все спрайты стоит запихать в один атлас, и проследить, чтобы у всего было единое значение координаты Z (0)
Ducat
ок
С оверлей камерой эффектов и пост процессинга на UI не будет.
ДобрыйБарин
> это самое плохое решение. Она жрет как не в себя. Лучшее решение. Для UI - оверлей канвас без камеры с канв рендерером. А для спрайтов в перспективе - добавить стандартную render feature render objects. Стэк камер в URP - самое немыслимое решение из коробки, т.к. URP - всегда про экономию.
Dmitry_togliatti
это к чему написано? Выше была лишь констатация факта что пост процессинг ты не используешь с оверлей камерой, а кто че жрет это дело последнее. Выбор между красотой и оптимизацией это вечный выбор.
ДобрыйБарин
Не совсем так, не последнее. Да, это констатация факта. Но это плохое решение. Именно в ветках про URP родного Юнити форума это предлагают. И это приводит к тому, что ты платишь за HUD (в котором околоничего) +15-40% от нагрузки основной камеры. Я не пытаюсь спорить, но эту горькую правду должны помнить адепты URP. Не забываем, что URP именно для экономии, компромисс.
Dmitry_togliatti
> Но это плохое решение.
Это не плохое решение, это выбор который каждый для себя должен однажды сделать.
Dmitry_togliatti
> Не забываем, что URP именно для экономии, компромисс.
Все зависит от конкретики, если этот UI используется буквально как оверлей, т.е. перекрывает полностью всю картинку с внешней камеры и рисует поверх всего инвентарь персонажа, это может быть оправданно для создание эффектной картинки даже в URP. Одновременно будет работать лишь одна камера в сцене. Во время скроллинга UI не всегда нужно иметь 200 фпс, зачастую хватит менее 100.
Я сделал в URP поверх основного рендера еще SSR, чтобы улучшить визуал проекта. Все зависит конечно же от задач. В вашем проекте видимо это все лишено смысла, но это не всегда будет плохим решением, если другие люди предлагают, видимо знаю о чем говорят.
В Unity это наверно даже как правило - что камера UI жрет либо столько же, либо даже больше основной. И это плата за красоту.
Ваша мотивация мне понятна, лишь написал то, что написал: "С оверлей камерой эффектов и пост процессинга на UI не будет". Это не плохо и не хорошо, данность, и компромиссы на которые вы пошли ради оптимизации.
URP позволяет делать очень красивую картинку с высокой производительностью. Так, что тезисы про вечную оптимизацию на URP тоже можно парировать, но я не буду продолжать делать это. Все это описано не чтобы поспорить.
ДобрыйБарин
> URP позволяет делать очень красивую картинку с высокой производительностью.
Если не жалко, ссыль на основные фишки. Просто я уже давно на urp, пробовал всякое, качал шейдеры, туманы... И до сих пор мне он кажется овном даже в сравнении с BRP по визуалу. Или хоть обозначь секретные подходы (если не жалко), тайные техники, палец смерти и всё такое
Dmitry_togliatti
Я сам написал SSR, адаптировал из разных источников, можешь в лс написать сразу с контактами, если такое интересует. У меня и обьемный свет работает, и рейтрейсинг отражения, все в URP прекрасно выдает 200-300 фпс в простых сценах на кубах. От сложности сцены это все будет вести себя по разному, но в целом быстро. Все дело в знаниях, можно и без доп контента хорошо настроить цветокоррекцию по аналогии с реальной камерой. У меня получалось делать картинку интересной и без сильных наворотов рендера. Все примеры могу покидать в лс. Конкретных ссылок нету, потому что опыт годами нарабатывался.