A stencil használata az unity3d shaderlab-ban

Üdvözlet. A következő feladat emelkedett: sötétebbé téve a teljes képernyőt, de valamilyen ponton egy lyukat készít.

Hogyan lehet ezt tenni?

1 opció - "Latent" képernyő

A képernyőt darabokra rögzítjük - úgy gondolom, hogy itt világos). Van egy kör textúrája, a maradék pedig darabokkal van felvéve. Nem kell mást csinálnia, csak pótolja. DE! Ha szükséges néhány "lyuk", az elrendezés bonyolultabbá válik. És ha dinamikusan kell kiemelned a képernyő egy részét?

2 Opció - Shaders

Az árnyékolókkal sokat tehet. De csak egy kis részükre van szükségük - levágási képpontok. Mit szeretnék látni?
1. Néhány textúra az egész képernyőn, melyet a szín és az áttetszőség kiválasztására használunk
2. A második textúra, amely már meghatározza a "lyuk" alakját, mozgatható, elforgatható stb., Szükség esetén le lehet tiltani / engedélyezni.
3. Mindennek az NGUI és UITexture keretében kell működnie

Először azt javaslom olvasni Stencilről:
Stencil buffer (stencil buffer - puffer sablont vagy stencil puffer) - egy további puffer méretének megfelelő a kimeneti keret, azaz mindegyik pixel a kép a képernyőn lévő értéknek felel meg a stencil buffer. Minden alkalommal, amikor a pontot rajzolja a képernyőre, a teszteken kívül, mint például a Z-puffer mélységével összehasonlítva, szintén átmegy a stencil teszten. Ez azt jelenti például, hogy a pont csak akkor rajzolódik meg, ha a stencil értéke nagyobb, mint egy. Másrészt elmondhatja, hogyan változtathatja meg a stencil értékét, miután a helyszínen megjelenő pixel megjelenik. 1. www.gamedev.ru/terms/StencilBuffer
2. docs.unity3d.com/Manual/SL-Stencil.html

Alapvetően vettem a kódot a második linkből.

Így néz ki az UITexture shader kódja, ami lyuk


Mit kell figyelembe venni?
1. Hozzáadott egy textúrát
2. Módosította a várólistát és a renderelés típusát - Átlátható
3. Az elegyet úgy adtuk hozzá, hogy az alfa látható legyen, és megfelelően kevertük
4. Módosította a fragment shader-et. Általánosságban ez nem feltétlenül helyes, de azért tettem, hogy a textúra átlátszó része színnel és alfa színnel tüntesse fel az UITexture színét, és az átlátszatlan rész átlátszóvá válik. 0,1 az átlátszó és átlátszó közötti különbség. A mancs van rövidebb)
5. Stencil paraméterek azt mondják, hogy rajzoljuk az összes képpontot, és helyezzük el az értéket 2

Most a mágia a teljes képernyős UITexture shaderje


Észrevehetjük, hogy itt a textúra ajánlott, vagyis egyszerűen kitöltem a teljes hálót színnel, anélkül, hogy a képpontról a képpontról származó adatokat használnám (igen, ott nem).

1. A legfontosabb különbség a Stencil paraméterek. Most csak azokat a képpontokat húzzuk ki, amelyek nem egyenlőek a 2-vel, ez minden, kivéve azt a területet, amelyben az előző hálót húzzuk. Cool?)
2. A szín az UITexture színparaméteréből származik

Ez mindent) Az alábbi munka példája. Az egyetlen dolog, ha két maszk egymásra helyezkedik, nem kiderül szépen (a textúrák metszéspontja nagyobb sűrűséget ad, és a terület homályos). Fix, úgy gondolom, Blend paraméterekre van szükséged. Ha valaki megosztani akar - örülök és hálás leszek!

A stencil használata az unity3d shaderlab-ban

Kapcsolódó cikkek