#unity3d #transparency
#unity3d #прозрачность
Вопрос:
У меня есть материал Unity, альбедо которого основано на таблице спрайтов. Спрайт имеет полупрозрачность и отформатирован в 32-битном формате RGBA. Теперь прозрачность отображается в спрайте, но не в материале. Как мне это сделать, не делая также непрозрачные части альбедо непрозрачными?
Я попытался установить режим рендеринга на прозрачный, затемненный и неосвещенный / прозрачный. Результат выглядит следующим образом:
Я пробовал непрозрачный, но это портит текстуру. Я попробовал cutout, но полупрозрачность исчезнет или станет полностью непрозрачной. (в зависимости от выреза)
Для этого нет кода.
Я ожидаю, что на выходе полупрозрачные части материала станут полупрозрачными, а непрозрачные — непрозрачными. Фактический результат либо полностью непрозрачен, либо полностью «полупрозрачен», что очень раздражает.
Редактировать
Итак, я отложил работу и добавил подрешетку. Итак, это действительно близко к решению проблемы.
Это все еще вызывает этот сбой.
Комментарии:
1. Вместо этого вы пытаетесь
Fade
2. @derHugo эм, да, я уже пробовал, не работает
3. Обратная связь: вопросы написаны для будущих читателей по Stack Overflow . «я печатаю одной рукой, пожалуйста, исправьте это» требует как редактирования, так и понижения. В целом, опытные читатели расценят это как форму вандализма с контентом.
4. Я не знал, что нам нужно было менять все наши публикации после изменения рекомендаций. Это сообщение было годичной давности.
Ответ №1:
Итак, хорошие новости и плохие новости. Хорошая новость в том, что эта проблема не редкость. Это даже не уникально для Unity. Плохая новость в том, что причина, по которой это не редкость или уникально для Unity, заключается в том, что это универсальная проблема, не имеющая идеального решения. Но, возможно, мы сможем найти для вас обходной путь, так что давайте пройдем через это вместе.
В 3D-графике существует фундаментальная проблема: в каком порядке вы рисуете объекты? Если вы рисуете обычную картинку в реальной жизни, очевидный ответ заключается в том, что вы рисуете объекты, основываясь на том, насколько они удалены от зрителя. Какое-то время это работает нормально, но что вы делаете с объектами, которые не находятся прямо «перед» другими объектами? Рассмотрим следующее изображение:
Фрукты в этой корзине находятся перед чашей или за ней? Это вроде ни того, ни другого, верно? И даже если вы можете разделить объекты на передние и задние, как вы справляетесь с пересекающимися объектами? Введите Z-буфер:
Z-буфер — это простая идея: при рисовании пикселей объекта вы также рисуете глубину этих пикселей. То есть, как далеко они находятся от камеры. Когда вы рисуете новый объект в сцене, вы проверяете глубину базового пикселя и сравниваете его с глубиной нового. Если новый пиксель ближе, вы перезаписываете старый. Если старый пиксель находится ближе, вы ничего не делаете. Буфер Z обычно представляет собой изображение с одним каналом (читай: в оттенках серого), которое никогда не отображается напрямую. Помимо сортировки по глубине, его также можно использовать для различных эффектов постобработки, таких как туман или окклюзия окружающей среды.
Итак, одним из ключевых компонентов буфера глубины является то, что он может хранить только одно значение на пиксель. В большинстве случаев это нормально; В конце концов, если вы просто пытаетесь отсортировать кучу объектов, единственная глубина, о которой вы действительно заботитесь, — это глубина самого переднего объекта. Все, что находится за этим самым передним объектом, будет отображаться невидимым, и это все, что вам нужно знать или о чем нужно заботиться.
То есть, если ваш самый передний объект не прозрачен.
Проблема здесь в том, что программа визуализации не знает, как отрисовывать объект за прозрачным. Чтобы избежать этого, интеллектуальный рендерер (включая unity) выполняет следующие шаги:
- Нарисуйте все непрозрачные объекты в любом порядке.
- Отсортируйте все прозрачные объекты по расстоянию от камеры.
- Нарисуйте все прозрачные объекты, от самых дальних к самым близким.
Таким образом, вероятность столкнуться со странными проблемами сортировки по глубине сводится к минимуму. Но это все равно развалится в паре мест. Когда вы создаете свой объект с использованием прозрачного материала, тот факт, что 99% объекта на самом деле сплошные , совершенно не имеет значения.Что касается Unity, весь ваш объект прозрачный, и поэтому он прорисовывается в соответствии с его глубиной относительно других прозрачных объектов в сцене. Если у вас много прозрачных объектов, у вас возникнут проблемы в тот момент, когда у вас появятся пересекающиеся сетки.
Итак, как вы справляетесь с этими проблемами? У вас есть несколько вариантов.
Первое и самое важное, что вы можете сделать, это ограничить прозрачные материалы областями, которые являются явно прозрачными. Я полагаю, что порядок рендеринга основан прежде всего на материалах, поэтому наличие сетки с несколькими непрозрачными материалами и одним прозрачным, вероятно, будет работать нормально, при этом непрозрачные части отображаются перед единственной прозрачной частью, но не цитируйте меня по этому поводу.
Во-вторых, если у вас есть альтернативы, используйте их. Причина, по которой режим «выреза» кажется двоичной маской, а не реальной прозрачностью, заключается в том, что это так.Поскольку он на самом деле не прозрачный, вы не столкнетесь с какими-либо проблемами сортировки по глубине, которые обычно возникают. Это компромисс.
В-третьих, старайтесь избегать больших пересекающихся объектов с прозрачными материалами. Большие водоемы печально известны тем, что вызывают проблемы в этом отношении. Тщательно подумайте о том, с чем вам предстоит работать.
Наконец, если вам абсолютно необходимо иметь несколько больших пересекающихся прозрачных объектов, рассмотрите возможность разбиения их на несколько частей.
Я ценю, что ни один из этих ответов по-настоящему не удовлетворяет, но ключевой вывод из всего этого заключается в том, что это не столько ошибка, сколько ограничение среды. Если вы действительно заинтересованы, вы могли бы попробовать разобраться в пользовательских конвейерах рендеринга, которые явно решают вашу проблему, но имейте в виду, что вы будете платить премию за производительность, если вы это сделаете.
Удачи.
Комментарии:
1. Ну, в игре много больших водоемов. Возможно ли, чтобы сетка имела две текстуры? (на основе uvs и ресурсов) Я имею в виду вот что. Один предположительно непрозрачный квадрат имеет непрозрачную текстуру в одном материале. Затем есть другой прозрачный квадрат, который имеет прозрачную текстуру в другом материале. Возможно ли это?
2. Я полагаю, что да. По сути, каждая сетка может иметь несколько «подсетей», которые в основном представляют собой списки треугольников, использующих общий материал. В программах 3D-моделирования они могут называться «слотами материала» или чем-то подобным.
3. насколько вызовы draw задерживают время выполнения
Ответ №2:
Вы сказали, что пробовали режим прозрачных шейдеров, но пытались ли вы изменить значения альфа-канала в цвете вашего материала после этого? На втором изображении кажется, что альфа в RGBA равна 0, попробуйте изменить это.
Комментарии:
1. Что вы имеете в виду? Мой sprite Maker сохраняет спрайты вместе со своим альфа-каналом.
2. Читая последний ответ, я просто могу подумать, что недооценил вашу проблему. ха-ха.. Но у меня были некоторые проблемы, подобные тем, что были в моделях humanoid, которые я решил, установив альфа-канал моей текстуры равным 255, я подумал, что если вы попробуете что-то подобное, это поможет .. но я больше не знаю, так ли это. Извините, что потратил ваше время.