forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Эффекты/Шейдеры (http://forum.boolean.name/forumdisplay.php?f=170)
-   -   Проваливание текстуры под другую (http://forum.boolean.name/showthread.php?t=20847)

Crystal 28.09.2020 14:12

Проваливание текстуры под другую
 
Вложений: 1
Столкнулся с болезнью. При определённом угле поворота камеры,
и на определённой удалённости (оба условия важны)
текстура объекта находящегося к камере ближе, чем
объект находящийся позади, проваливается под его текстуру.

Как задать порядок отрисовки текстуры, чтобы её не перекрывали
текстуры находящиеся за ней?

Проблема со всеми стандартными шейдерами текстур,
которые применяются для текстур с пустыми областями (PNG формат),
и которые сглаживают края зарисованной части текстуры граничащие
с пустыми (полностью прозрачными областями).
На скрине ниже например зелёное поле это (Mobile/Particles/AlphaBlended),
а на хелсбаре (UI.Unlit.Detail). Пробовал и другие подобные шейдеры,
эффект одинаковый. Исключение, это при выбранном параметре шейдеров
"Cutout", тогда текстура не перекрывается той текстурой, что позади,
однако такая настройка мне не подходит, так-как текстура не сглаживается, идёт лесенкой.

В общем, что за болезнь, и как её лечить? Кто сталкивался?

pax 28.09.2020 14:54

Ответ: Проваливание текстуры под другую
 
Это в целом не болезнь, а фича. Все что рисуется в качестве прозрачности сортируется по центру объекта и рисуется от дальнего к ближнему. В твоем случае скорее всего проблема в том, что твоя зеленая сетка это единый объект, у которого центр ближе к камере, чем хэлсбар.
Как простое решение - выстави материалу сетки очередь равную 3000-1 (Transparent-1).
PHP код:

renderer.material.renderQueue 3000-1

В шейдерах очередь задается тегом Queue

Crystal 28.09.2020 18:32

Ответ: Проваливание текстуры под другую
 
Цитата:

Сообщение от pax (Сообщение 317629)
Это в целом не болезнь, а фича. Все что рисуется в качестве прозрачности сортируется по центру объекта и рисуется от дальнего к ближнему. В твоем случае скорее всего проблема в том, что твоя зеленая сетка это единый объект, у которого центр ближе к камере, чем хэлсбар.
Как простое решение - выстави материалу сетки очередь равную 3000-1 (Transparent-1).
PHP код:

renderer.material.renderQueue 3000-1

В шейдерах очередь задается тегом Queue

Очередная палка в колесо от юнити. Яб сказал говнофича.
Есил у материалов одинаковое Queue, то поверх должен
отрисовываться ближний к камере участок текстуры,
в нормальных движках имхо, без учёта, где чей центр.

Спасибо. Через интерфейс задал 3001 хелсбаровым текстурам.
Я играл с этим параметром на сетке, и не догадался, что нужно на хелсбаре.
3000 тут минимальное, 2999 уже прозрачность всей текстуры.

pax 28.09.2020 18:48

Ответ: Проваливание текстуры под другую
 
Если бы твоя сетка строилась бы отдельными квадами, у которых центр был бы в центре ячеек сетки, то все отрисовалось бы хорошо. Отрисовка прозрачной геометрии всегда большая проблема. И это фича не только юнити. Сортировка полигонов Меша по расстоянию до камеры - это ресурсоемкая задача и не надо ждать от движков чудес, что они такое делают по умолчанию.

Crystal 28.09.2020 19:26

Ответ: Проваливание текстуры под другую
 
Цитата:

Сообщение от pax (Сообщение 317631)
Если бы твоя сетка строилась бы отдельными квадами, у которых центр был бы в центре сетки, то все отрисовалось бы хорошо. Отрисовка прозрачной геометрии всегда большая проблема. И это фича не только юнити. Сортировка полигонов Меша по расстоянию до камеры - это ресурсоемкая задача и не надо ждать от движков чудес, что они такое делают по умолчанию.

Мне кажется, что это неправильно работает.
Например я уровень загружу монолитный одним мешем,
и он тогда вылезет поверх объектов расположенных
над ним, на которые натянуты текстуры с прозрачностью.

Больше всего раздражает в этой ситуации то,
что мне теперь всем объектом с прозрачностью нужно повышать
приоритет отрисовки, вместо того, чтобы разово понизить сетке.

pax 28.09.2020 19:29

Ответ: Проваливание текстуры под другую
 
Я не очень понимаю почему у тебя не получилось сетке назначить 2999, почему 3000 минимальное?

Crystal 28.09.2020 19:32

Ответ: Проваливание текстуры под другую
 
Цитата:

Сообщение от pax (Сообщение 317633)
Я не очень понимаю почему у тебя не получилось сетке назначить 2999, почему 3000 минимальное?

При 2999 у меня становится вся текстура прозрачной,
при 3000 (по умолчанию) прозрачны только не закрашенные места на текстуре.

pax 28.09.2020 19:35

Ответ: Проваливание текстуры под другую
 
Цитата:

Сообщение от Crystal (Сообщение 317634)
При 2999 у меня становится вся текстура прозрачной,
при 3000 (по умолчанию) прозрачны только не закрашенные места на текстуре.

Скорее всего ты имеешь ввиду, что пол рисуется выше твоей текстуры сетки? Тебе наверное надо полу сделать тоже 2999 или меньше.

Crystal 28.09.2020 19:56

Ответ: Проваливание текстуры под другую
 
Вложений: 1
Цитата:

Сообщение от pax (Сообщение 317635)
Скорее всего ты имеешь ввиду, что пол рисуется выше твоей текстуры сетки? Тебе наверное надо полу сделать тоже 2999 или меньше.

У меня при 3000 на всех материалах хелсбар рисуется под сеткой.
Если я ставлю сетке 3000 а хелсбару 3001 то всё отрисовывается верно.
Если я поставлю сетке 2999 а хелсбару 3000 то хелсбар тоже не нырнёт под сетку, но вот сетка станет прозрачной.

pax 28.09.2020 19:59

Ответ: Проваливание текстуры под другую
 
Цитата:

Сообщение от Crystal (Сообщение 317636)
У меня при 3000 на всех материалах хелсбар рисуется под сеткой.
Если я ставлю сетке 3000 а хелсбару 3001 то всё отрисовывается верно.
Если я поставлю сетке 2999 а хелсбару 3000 то хелсбар тоже не нырнёт под сетку, но вот сетка станет прозрачной.

Синяя сетка же тоже прозрачная? Сделай ей 2998, зеленой сделатьй 2999 и остальное не трогай.

Crystal 28.09.2020 20:11

Ответ: Проваливание текстуры под другую
 
Вложений: 1
Цитата:

Сообщение от pax (Сообщение 317637)
Синяя сетка же тоже прозрачная? Сделай ей 2998, зеленой сделатьй 2999 и остальное не трогай.

В общем понизил и эффект такой:

Crystal 28.09.2020 20:13

Ответ: Проваливание текстуры под другую
 
Вложений: 1
Но позже я вкурил, что у меня ниже ещё три плейна с прозрачным шейдером,
я отключил их отрисовку, и синяя сетка нормализовалась.
В общем нужно заменить шейдеры на космосе,
и тоже понизить им очерёдность отрисовки.

Спасибо.

pax 28.09.2020 20:14

Ответ: Проваливание текстуры под другую
 
Цитата:

Сообщение от Crystal (Сообщение 317638)
В общем понизил и эффект такой:

Такое ощущение, что у тебя еще что-то на весь экран полупрозрачное рисуется. Что-то типа фона. Ты можешь смотреть как все рисуется в Frame Debugger'е

Crystal 28.09.2020 20:28

Ответ: Проваливание текстуры под другую
 
Вложений: 1
Цитата:

Сообщение от pax (Сообщение 317640)
Такое ощущение, что у тебя еще что-то на весь экран полупрозрачное рисуется. Что-то типа фона. Ты можешь смотреть как все рисуется в Frame Debugger'е

Ну вот три плейна космоса с прозрачностью и было фоном, больше ничего.
Канвас разве что ещё висит, но он тут не при чём.

Заменил космосу шейдеры на те, в которых есть транспарент
с возможностью изменения приоритета отрисовки, понизил ниже сеток.

Баг вылечен.

Arton 29.09.2020 01:02

Ответ: Проваливание текстуры под другую
 
Цитата:

Сообщение от Crystal (Сообщение 317632)
объектом с прозрачностью нужно повышать

Там где тебе не нужна плавная прозрачность, можно обойтись обрезкой «по маске».
Всегда так делаю.
Это есть в любых движках.


Часовой пояс GMT +4, время: 01:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot