![]() |
Проваливание текстуры под другую
Вложений: 1
Столкнулся с болезнью. При определённом угле поворота камеры,
и на определённой удалённости (оба условия важны) текстура объекта находящегося к камере ближе, чем объект находящийся позади, проваливается под его текстуру. Как задать порядок отрисовки текстуры, чтобы её не перекрывали текстуры находящиеся за ней? Проблема со всеми стандартными шейдерами текстур, которые применяются для текстур с пустыми областями (PNG формат), и которые сглаживают края зарисованной части текстуры граничащие с пустыми (полностью прозрачными областями). На скрине ниже например зелёное поле это (Mobile/Particles/AlphaBlended), а на хелсбаре (UI.Unlit.Detail). Пробовал и другие подобные шейдеры, эффект одинаковый. Исключение, это при выбранном параметре шейдеров "Cutout", тогда текстура не перекрывается той текстурой, что позади, однако такая настройка мне не подходит, так-как текстура не сглаживается, идёт лесенкой. В общем, что за болезнь, и как её лечить? Кто сталкивался? |
Ответ: Проваливание текстуры под другую
Это в целом не болезнь, а фича. Все что рисуется в качестве прозрачности сортируется по центру объекта и рисуется от дальнего к ближнему. В твоем случае скорее всего проблема в том, что твоя зеленая сетка это единый объект, у которого центр ближе к камере, чем хэлсбар.
Как простое решение - выстави материалу сетки очередь равную 3000-1 (Transparent-1). PHP код:
|
Ответ: Проваливание текстуры под другую
Цитата:
Есил у материалов одинаковое Queue, то поверх должен отрисовываться ближний к камере участок текстуры, в нормальных движках имхо, без учёта, где чей центр. Спасибо. Через интерфейс задал 3001 хелсбаровым текстурам. Я играл с этим параметром на сетке, и не догадался, что нужно на хелсбаре. 3000 тут минимальное, 2999 уже прозрачность всей текстуры. |
Ответ: Проваливание текстуры под другую
Если бы твоя сетка строилась бы отдельными квадами, у которых центр был бы в центре ячеек сетки, то все отрисовалось бы хорошо. Отрисовка прозрачной геометрии всегда большая проблема. И это фича не только юнити. Сортировка полигонов Меша по расстоянию до камеры - это ресурсоемкая задача и не надо ждать от движков чудес, что они такое делают по умолчанию.
|
Ответ: Проваливание текстуры под другую
Цитата:
Например я уровень загружу монолитный одним мешем, и он тогда вылезет поверх объектов расположенных над ним, на которые натянуты текстуры с прозрачностью. Больше всего раздражает в этой ситуации то, что мне теперь всем объектом с прозрачностью нужно повышать приоритет отрисовки, вместо того, чтобы разово понизить сетке. |
Ответ: Проваливание текстуры под другую
Я не очень понимаю почему у тебя не получилось сетке назначить 2999, почему 3000 минимальное?
|
Ответ: Проваливание текстуры под другую
Цитата:
при 3000 (по умолчанию) прозрачны только не закрашенные места на текстуре. |
Ответ: Проваливание текстуры под другую
Цитата:
|
Ответ: Проваливание текстуры под другую
Вложений: 1
Цитата:
Если я ставлю сетке 3000 а хелсбару 3001 то всё отрисовывается верно. Если я поставлю сетке 2999 а хелсбару 3000 то хелсбар тоже не нырнёт под сетку, но вот сетка станет прозрачной. |
Ответ: Проваливание текстуры под другую
Цитата:
|
Ответ: Проваливание текстуры под другую
Вложений: 1
Цитата:
|
Ответ: Проваливание текстуры под другую
Вложений: 1
Но позже я вкурил, что у меня ниже ещё три плейна с прозрачным шейдером,
я отключил их отрисовку, и синяя сетка нормализовалась. В общем нужно заменить шейдеры на космосе, и тоже понизить им очерёдность отрисовки. Спасибо. |
Ответ: Проваливание текстуры под другую
Цитата:
|
Ответ: Проваливание текстуры под другую
Вложений: 1
Цитата:
Канвас разве что ещё висит, но он тут не при чём. Заменил космосу шейдеры на те, в которых есть транспарент с возможностью изменения приоритета отрисовки, понизил ниже сеток. Баг вылечен. |
Ответ: Проваливание текстуры под другую
Цитата:
Всегда так делаю. Это есть в любых движках. |
Ответ: Проваливание текстуры под другую
Цитата:
Алсо этот баг есть во всех движках, и в Блице тоже был. Он находится в самом принципе работы видеокарты. Простых решений нет, к сожалению. Единственное, что толкового со времён Блица изобрели на эту тему — это Alpha To Coverage. При полноэкранном сглаживании и включённой этой фичей субпиксели сглаживания заполняются в соответствии с альфой. То есть как будто у тебя разрешение увеличено так, что 1 пиксель растянут в 4. Если альфа 25% то закрашивается 1 пиксель из 4, если 50% то 2, если 75% то 3 и если альфа 100% то все 4 пикселя. А потом сжимают и получается "как бы альфа" из 4 градаций. Полноценную альфу в несколько слоёв, понятное дело, так не сделать, но от лесенок по краям избавляет вполне. Возможно, можно подумать об использовании этой фичи, в Юнитях она есть. |
Ответ: Проваливание текстуры под другую
Цитата:
ту, которую я вырисовываю альфой, и от альфы отказаться. Если она продолжит создавать трудности, так и сделаю, но не факт, что это будет так же красиво, как альфа со сглаживанием. Однако это применимо только к зелёной сетке, если так же делать сетку под ней, то уйдёт слишком много полигонов, усложнится код, и так далее. Так что совсем без альфы мне похоже не обойтись, если только не делать клетки полностью закрашенными как шахматную доску, но это некрасиво, через дырки должна быть видна текстура локации на плейне как в HoMM7: ![]() Ну, в данный момент меня всё устраивает. Кстати, подозреваю, что в HoMM7 каждая ячейка отдельный квад с альфой, текстура на котором подменяется в нужный момент, а не как у меня строится меш въезжающий в плейн с альфадырками. |
Ответ: Проваливание текстуры под другую
![]() По моему эта проблема называется Z-fighting. Дело в том, что Z-буфер если, он имеет малое разрешение, то рендер на определенных расстояниях уже не понимает что рисовать поверх чего и идет смешивание. В Unity в шейдерах используется параметр Offset для устранения этой траблы. https://docs.unity3d.com/Manual/SL-CullAndDepth.html |
Ответ: Проваливание текстуры под другую
Цитата:
|
Ответ: Проваливание текстуры под другую
Цитата:
|
Часовой пояс GMT +4, время: 07:40. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot