Почему материал единства не обеспечивает должной полупрозрачности? - PullRequest
1 голос
/ 30 марта 2019

У меня есть материал Unity, альбедо которого основано на спрайт-листе.Спрайт имеет полупрозрачность и отформатирован в 32-битном RGBA.Теперь прозрачность отображается в спрайте, но не в материале.Как сделать это, не делая непрозрачными, предположительно, непрозрачные части альбедо?

Я попытался установить режим рендеринга на прозрачный, затемнение и неосвещенный / прозрачный.Результат выглядит следующим образом:

Structures are assigned opaque but acts semi transparent

Structure is assigned to be opaque but acts semi transparent

Я пробовал непрозрачный, но он разрушаеттекстура.Я пробовал вырезать, но полупрозрачность выйдет или станет полностью непрозрачной.(в зависимости от выреза)

Код не указан.

Я ожидаю, что на выходе полупрозрачные части материала станут полупрозрачными, а непрозрачные - непрозрачными.Фактический вывод либо полностью непрозрачный, либо полностью «полупрозрачный», что очень раздражает.

РЕДАКТИРОВАТЬ 4/20/19 Так что да, я отложил работу, но да, я добавил submesh.Итак, это действительно близко к решению проблемы. (Thnx VPellen) Посмотрите на это

enter image description here

да, это все еще делает этот глюк.прямо сейчас я набираю с 1 handsrry кто-то может редактировать эту область

Ответы [ 2 ]

2 голосов
/ 31 марта 2019

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

В трехмерной графике есть фундаментальная проблема: в каком порядке вы рисуете вещи? Если вы рисуете обычную картину в реальной жизни, очевидный ответ - вы рисуете вещи, основываясь на том, насколько они далеко от зрителя. Какое-то время это прекрасно работает, но что вы делаете с объектами, которые не находятся "чисто перед" другими вещами? Рассмотрим следующее изображение:

A photograph of a basket containing fruit

Фрукты в этой корзине перед чашей или позади нее? Это вроде как нет, верно? И даже если вы можете разбить объекты на переднюю и заднюю части, как вы справляетесь с пересекающимися объектами? Введите Z-буфер:

A simple 3D scene containing several meshes above a greyscale representation of the Z-Buffer of that scene

Z-буфер является простой идеей: рисуя пиксели объекта, вы также рисуете глубину этих пикселей. То есть как далеко от камеры они. Когда вы рисуете новый объект на сцене, вы проверяете глубину основного пикселя и сравниваете его с глубиной нового. Если новый пиксель ближе, вы перезаписываете старый. Если старый пиксель ближе, вы ничего не делаете. Z-буфер, как правило, представляет собой одноканальное изображение (читай: в оттенках серого), которое никогда не отображается напрямую. Помимо сортировки по глубине, она также может использоваться для различных эффектов постобработки, таких как туман или окклюзия окружающей среды.

Теперь, одним из ключевых компонентов буфера глубины является то, что он может хранить только одно значение на пиксель. В большинстве случаев это нормально; В конце концов, если вы просто пытаетесь отсортировать кучу объектов, единственная глубина, которая вас действительно волнует, - это глубина самого переднего. Все, что находится за этим передним объектом, станет невидимым, и это все, что вам нужно знать или заботиться.

То есть, если ваш передний объект не прозрачен.

Four images illustrating various intersecting transparent planes

Проблема в том, что средство визуализации не знает, как справиться с рисованием объекта за прозрачным. Чтобы избежать этого, умный рендерер (в том числе Unity) проходит следующие шаги:

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

Таким образом, шансы столкнуться со странными проблемами глубинной сортировки сводятся к минимуму. Но это все равно развалится в нескольких местах. Когда вы заставляете ваш объект использовать прозрачный материал, тот факт, что 99% объекта на самом деле является сплошным , совершенно не имеет значения. Что касается Unity, весь ваш объект прозрачен, и поэтому он рисуется согласно на его глубину относительно других прозрачных объектов в сцене. Если у вас много прозрачных объектов, у вас будет проблем, когда вы пересекаете сетки.

Итак, как вы справляетесь с этими проблемами? У вас есть несколько вариантов.

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

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

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

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

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

Удачи.

0 голосов
/ 30 марта 2019

Вы сказали, что пробовали режим прозрачного шейдера, но пытались ли после него изменять значения альфа-канала в цвете материала? Второе изображение выглядит так, как будто альфа в RGBA равно 0, попробуйте изменить его.

...