|
28.09.2020, 14:12
|
#1
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Проваливание текстуры под другую
Столкнулся с болезнью. При определённом угле поворота камеры,
и на определённой удалённости (оба условия важны)
текстура объекта находящегося к камере ближе, чем
объект находящийся позади, проваливается под его текстуру.
Как задать порядок отрисовки текстуры, чтобы её не перекрывали
текстуры находящиеся за ней?
Проблема со всеми стандартными шейдерами текстур,
которые применяются для текстур с пустыми областями (PNG формат),
и которые сглаживают края зарисованной части текстуры граничащие
с пустыми (полностью прозрачными областями).
На скрине ниже например зелёное поле это (Mobile/Particles/AlphaBlended),
а на хелсбаре (UI.Unlit.Detail). Пробовал и другие подобные шейдеры,
эффект одинаковый. Исключение, это при выбранном параметре шейдеров
"Cutout", тогда текстура не перекрывается той текстурой, что позади,
однако такая настройка мне не подходит, так-как текстура не сглаживается, идёт лесенкой.
В общем, что за болезнь, и как её лечить? Кто сталкивался?
|
(Offline)
|
|
28.09.2020, 14:54
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проваливание текстуры под другую
Это в целом не болезнь, а фича. Все что рисуется в качестве прозрачности сортируется по центру объекта и рисуется от дальнего к ближнему. В твоем случае скорее всего проблема в том, что твоя зеленая сетка это единый объект, у которого центр ближе к камере, чем хэлсбар.
Как простое решение - выстави материалу сетки очередь равную 3000-1 (Transparent-1).
renderer.material.renderQueue = 3000-1;
В шейдерах очередь задается тегом Queue
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.09.2020, 18:32
|
#3
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от pax
Это в целом не болезнь, а фича. Все что рисуется в качестве прозрачности сортируется по центру объекта и рисуется от дальнего к ближнему. В твоем случае скорее всего проблема в том, что твоя зеленая сетка это единый объект, у которого центр ближе к камере, чем хэлсбар.
Как простое решение - выстави материалу сетки очередь равную 3000-1 (Transparent-1).
renderer.material.renderQueue = 3000-1;
В шейдерах очередь задается тегом Queue
|
Очередная палка в колесо от юнити. Яб сказал говнофича.
Есил у материалов одинаковое Queue, то поверх должен
отрисовываться ближний к камере участок текстуры,
в нормальных движках имхо, без учёта, где чей центр.
Спасибо. Через интерфейс задал 3001 хелсбаровым текстурам.
Я играл с этим параметром на сетке, и не догадался, что нужно на хелсбаре.
3000 тут минимальное, 2999 уже прозрачность всей текстуры.
|
(Offline)
|
|
28.09.2020, 18:48
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проваливание текстуры под другую
Если бы твоя сетка строилась бы отдельными квадами, у которых центр был бы в центре ячеек сетки, то все отрисовалось бы хорошо. Отрисовка прозрачной геометрии всегда большая проблема. И это фича не только юнити. Сортировка полигонов Меша по расстоянию до камеры - это ресурсоемкая задача и не надо ждать от движков чудес, что они такое делают по умолчанию.
Последний раз редактировалось pax, 28.09.2020 в 20:09.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.09.2020, 19:26
|
#5
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от pax
Если бы твоя сетка строилась бы отдельными квадами, у которых центр был бы в центре сетки, то все отрисовалось бы хорошо. Отрисовка прозрачной геометрии всегда большая проблема. И это фича не только юнити. Сортировка полигонов Меша по расстоянию до камеры - это ресурсоемкая задача и не надо ждать от движков чудес, что они такое делают по умолчанию.
|
Мне кажется, что это неправильно работает.
Например я уровень загружу монолитный одним мешем,
и он тогда вылезет поверх объектов расположенных
над ним, на которые натянуты текстуры с прозрачностью.
Больше всего раздражает в этой ситуации то,
что мне теперь всем объектом с прозрачностью нужно повышать
приоритет отрисовки, вместо того, чтобы разово понизить сетке.
|
(Offline)
|
|
28.09.2020, 19:29
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проваливание текстуры под другую
Я не очень понимаю почему у тебя не получилось сетке назначить 2999, почему 3000 минимальное?
|
(Offline)
|
|
28.09.2020, 19:32
|
#7
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от pax
Я не очень понимаю почему у тебя не получилось сетке назначить 2999, почему 3000 минимальное?
|
При 2999 у меня становится вся текстура прозрачной,
при 3000 (по умолчанию) прозрачны только не закрашенные места на текстуре.
|
(Offline)
|
|
28.09.2020, 19:35
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от Crystal
При 2999 у меня становится вся текстура прозрачной,
при 3000 (по умолчанию) прозрачны только не закрашенные места на текстуре.
|
Скорее всего ты имеешь ввиду, что пол рисуется выше твоей текстуры сетки? Тебе наверное надо полу сделать тоже 2999 или меньше.
|
(Offline)
|
|
28.09.2020, 19:56
|
#9
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от pax
Скорее всего ты имеешь ввиду, что пол рисуется выше твоей текстуры сетки? Тебе наверное надо полу сделать тоже 2999 или меньше.
|
У меня при 3000 на всех материалах хелсбар рисуется под сеткой.
Если я ставлю сетке 3000 а хелсбару 3001 то всё отрисовывается верно.
Если я поставлю сетке 2999 а хелсбару 3000 то хелсбар тоже не нырнёт под сетку, но вот сетка станет прозрачной.
|
(Offline)
|
|
28.09.2020, 19:59
|
#10
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от Crystal
У меня при 3000 на всех материалах хелсбар рисуется под сеткой.
Если я ставлю сетке 3000 а хелсбару 3001 то всё отрисовывается верно.
Если я поставлю сетке 2999 а хелсбару 3000 то хелсбар тоже не нырнёт под сетку, но вот сетка станет прозрачной.
|
Синяя сетка же тоже прозрачная? Сделай ей 2998, зеленой сделатьй 2999 и остальное не трогай.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.09.2020, 20:11
|
#11
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от pax
Синяя сетка же тоже прозрачная? Сделай ей 2998, зеленой сделатьй 2999 и остальное не трогай.
|
В общем понизил и эффект такой:
|
(Offline)
|
|
28.09.2020, 20:13
|
#12
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: Проваливание текстуры под другую
Но позже я вкурил, что у меня ниже ещё три плейна с прозрачным шейдером,
я отключил их отрисовку, и синяя сетка нормализовалась.
В общем нужно заменить шейдеры на космосе,
и тоже понизить им очерёдность отрисовки.
Спасибо.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.09.2020, 20:14
|
#13
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от Crystal
В общем понизил и эффект такой:
|
Такое ощущение, что у тебя еще что-то на весь экран полупрозрачное рисуется. Что-то типа фона. Ты можешь смотреть как все рисуется в Frame Debugger'е
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.09.2020, 20:28
|
#14
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от pax
Такое ощущение, что у тебя еще что-то на весь экран полупрозрачное рисуется. Что-то типа фона. Ты можешь смотреть как все рисуется в Frame Debugger'е
|
Ну вот три плейна космоса с прозрачностью и было фоном, больше ничего.
Канвас разве что ещё висит, но он тут не при чём.
Заменил космосу шейдеры на те, в которых есть транспарент
с возможностью изменения приоритета отрисовки, понизил ниже сеток.
Баг вылечен.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.09.2020, 01:02
|
#15
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,024
Написано 2,313 полезных сообщений (для 5,350 пользователей)
|
Ответ: Проваливание текстуры под другую
Сообщение от Crystal
объектом с прозрачностью нужно повышать
|
Там где тебе не нужна плавная прозрачность, можно обойтись обрезкой «по маске».
Всегда так делаю.
Это есть в любых движках.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:48.
|