Я хочу добиться в Unity сквозного эффекта, подобного приведенному в следующих примерах:
В моем конкретном сценарии есть пара требований:
- Спрайты используют альфа-смешение, а спрайты имеют прозрачные области.
- Есть 2 вида элементов, которые закрывают персонажа. Один должен создать эффект силуэта, а другой должен вести себя как обычно.
Для окклюзирующих элементов, которые создают силуэт, я включаю ZWrite и отключаю его для элементов, которые этого не делают.
Для персонажа я попытался установить очередь шейдера в + 1 и добавил этот проход:
Pass
{
ZTest Greater
Lighting Off
Color [_Color]
}
И эффект работает частично:
Силуэт нарисован на всем протяжении персонажа, даже на прозрачных частях. Прозрачные части не должны создавать силуэт.
Силуэт создается, когда персонаж находится за спрайтом, даже если эта часть спрайта прозрачна. Нахождение за прозрачной частью спрайта не должно создавать силуэт.
Персонаж появляется перед остальными элементами, даже если он находится позади них. Я предполагаю, что это потому, что установка очереди в Прозрачный + 1. Но если я оставлю это как Прозрачный, персонаж будет нарисован в правильном порядке, но силуэт никогда не будет виден.
Я пытался следовать этим советам, которые кто-то дал мне, но я не могу заставить его работать:
1) Оставьте проход, который отображает спрайтов как есть.
2) Добавьте проход, который записывает в z-буфер, но имеет шейдер, который использует clip () для отбрасывания пикселей на основе альфа. Вы не можете использовать z-буфер для создания мягких z-тестов без использования MSAA и альфа-покрытия. Качество этого не будет отличным, но это лучшее, что вы можете сделать. Более быстрая альтернатива - шаблон или сглаживание шума, или старый добрый порог, если все ваши спрайты имеют довольно острые края.
3) Добавьте третий проход к окклюдируемым объектам, которые рисуют цвет окклюзии, используя z-тест, и убедитесь, что он нарисован как последний проход.
Я немного новичок в шейдерах, особенно в Unity, и я просто не могу понять, как заставить его работать должным образом.