Я хочу досягти в Єдності бачення ефекту, подібного до цього в цих прикладах:
У моєму конкретному сценарії є кілька вимог:
- Для спрайтів використовується альфа-змішування, а у спрайтів прозорі ділянки.
- Є 2 різновиди елементів, що окулюють персонажа. Один повинен створити силуетний ефект, а інший повинен вести себе як нормально.
Для оклюзійних елементів, що створюють силует, я вмикаю ZWrite і відключаю його для елементів, які не мають.
Для персонажа я спробував встановити чергу шайдера на прозорий + 1, і додав цей пропуск:
Pass
{
ZTest Greater
Lighting Off
Color [_Color]
}
І ефект працює частково:
Силует намальований усього персонажа, навіть частин, які прозорі. Прозорі деталі не повинні створювати силует.
Силует створюється, коли персонаж стоїть за спрайтом, навіть якщо ця частина спрайту прозора. Перебуваючи за прозорою частиною спрайту, не слід створювати силует.
Персонаж з'являється перед усіма елементами, навіть якщо він знаходиться за ними. Я думаю, це тому, що встановлення черги на Transparent + 1. Але якщо я залишу це як прозорий, персонаж намальований у правильному порядку, але силует ніколи не видно.
Я намагався дотримуватися цих порад, які хтось мені дав, але я не можу змусити його працювати:
1) Залиште пропуск, який надає спрайтів таким, як є.
2) Додайте пропуск, який пише в z-буфер, але має шейдер, який використовує clip () для відкидання пікселів на основі альфа. Ви не можете використовувати z-буфер для того, щоб робити м'які z-тести без використання MSAA та альфа-покриття. Якість цього не буде великою, але це найкраще, що ви можете зробити. Більш швидкою альтернативою є візерунок або шумовий шум або добрий старомодний поріг, якщо всі ваші спрайти мають досить гострі краї.
3) Додайте третій прохід до оклюзійних об'єктів, який малює колір оклюзії за допомогою z-тесту та переконайтеся, що він намальований як кінцевий прохід.
Я щось нове в шейдерах, особливо в Unity, і я просто не можу зрозуміти, як змусити його працювати належним чином.