BETA

Ghid

Coordonatele UV și 3 exemple de ce se poate face cu ele

Postat de pe 1 noiembrie 2019

Salut! Sunt Daniel, lucrez la Rift Frigate, și ăsta e un articol scurt despre ce stă la baza a 90% din shaderele pe care le folosim pentru efecte. Conceptul nu-i nou deloc, a fost folosit de veteranii industriei de decenii, dar se pare că pe partea de indie e folosit rar, și poate nu chiar la potențialul maxim.
Dar înainte, o scurtă pregătire o să explic principiul de bază. 

Modelele 3d din jocuri sunt făcute din geometrie simplă – o rețea de puncte (vertex, plural vertecși) definesc triunghiuri la diferite coordonate în spațiu, iar acele triunghiuri conectate definesc o formă. Pe forma aceea se proiectează o imagine bidimensională, mai des numită textură. Dar cum se face acea proiecție? Cum se înfășoară o imagine 2D pe un model 3D? Simplu – cu un set de coordonate înscris în informația modelului 3D.

Un vertex poate să aibă mai multe atribute, cel de bază fiind poziția, coordonatele în spațiu (trei valori, pe axele X, Y, Z). Pe lângă acestea, conține un set de 3 coordonate planare care definește cum se înfășoară textura pe formă, denumite UVW-uri. W se referă la adâncime și este rar folosit – deci mai des coordonatele de textură se vor numi UV-uri.

Diagrama asta descrie coordonatele UV – în majoritatea programelor 3d încep din colțul din stânga-jos, U reprezentând axa orizontală, iar V cea verticală. 

Imaginea asta arată cum s-ar desfășura fețele unui cub pe aceste coordonate planare.


Să zicem că avem un cub, și vrem să punem pe el o textură.

Aceste coordonate UV definesc unde și cum se aplică textura pe model. Astfel:

Fiecare dintre acei vertecși au o poziție în spațiul UV și definesc proiecția texturii pe model.

În funcție de unde se află coordonatele fiecărui vertex, textura se proiectează perpendicular pe model.

Dacă mișcăm coordonatele vertecșilor, acea distorsiune se reflectă pe model… interesant!

Coordonatele de UV ale modelului pot fi mișcate în spațiu pe cele 2 axe, iar când depășesc marginile spațiului 0-1, iau textura de la capăt, deoarece textura se repetă la infinit pe ambele axe. Setul de coordonate UV ale modelului se editează în programul 3d și sunt informații proprii modelului. 

Într-un game engine (cum ar fi Unity, Unreal) citirea coordonatelor se face prin intermediul unui shader, un mini-program care ia informațiile modelului 3d și ale texturilor și trimite instrucțiuni plăcii video referitoare la cum să afișeze obiectul pe ecran. Cu un shader editor putem să specificăm mai direct aceste instrucțiuni.

Aceasta e o diagramă a unui shader simplu creat cu Amplify Shader Editor, prin care folosind niște noduri de informații, specificăm un set de coordonate și o referință a imaginii ce o dorim proiectată pe model.

Și dacă avem acces la coordonatele UV…. ce facem cu ele? Hai să vedem niște idei de bază.

Dimensiunea (eng. Scale)

Un efect simplu de realizat cu coordonatele de UV e să le creștem sau micșorăm proporțional dimensiunea (Scale), și obținem asta:

Cu o funcție de cosinus adăugată valorilor de UV, în timp, coordonatele pulsează.

Deplasarea (eng. Offset)

În funcție de cum sunt dispuse coordonatele, putem să afectăm direcția în care se deplasează textura.

Aici am adăugat un factor de timp constant pe axa V, ceea ce înseamnă că acele coordonate se vor deplasa pe axa V constant, în timp ce pe axa U vor sta nemișcate.

Distorsiunea (eng. Distortion)

Coordonatele UV pot fi afectate și prin calcule impuse matricei, dar și printr-o textură ce ar putea suprascrie acele valori din matrice, iar distorsiunea de pe imagine va afecta proiecția texturii pe model, astfel:

Singurul dezavantaj în a folosi o textură pentru distorsionarea UV-urilor este rezoluția, dacă e mult prea mică apar artefacte ca în exemplul de mai sus.

Și acum, un exemplu în acțiune: deplasare dublă!

O tehnică avansată (veche de 20+ de ani) e derularea simultană a două texturi aditive, care creează un ciclu perpetuu de animație în care nu se poate depista începutul și sfârșitul:

Voilà, pufuri de fum ce se derulează pe axa U a coordonatelor la viteze diferite.

Acest shader folosește aceeași textură, accesează de două ori setul de coordonate al sferei, adaugă un factor de timp diferit fiecărui set iar apoi câte o culoare, la final adăugând rezultatul. Foarte simplu, eficient la cost și bun de pus bazele unor efecte mai spectaculoase.

În concluzie, coordonatele de UV sunt intermediarul dintre textura 2D și modelul 3D – dacă le manipulăm cu un pic de creativitate obținem efecte impresionante care par complexe cu doar câteva funcții, valori și texturi.

Spor la muncă!