Principiul construirii umbrelor este destul de simplu. Tot ceea ce este vizibil din poziția sursei de lumină este iluminat, restul este la umbră.
Principiul de funcționare poate fi împărțit în două etape:
1. Conservarea adâncimii scenei în textura din poziția sursei de lumină. O astfel de textură se numește o hartă de umbră.
2. Refaceți scenariul cu umbre, utilizând datele obținute în prima etapă.
În exemplul, faza două articole în RenderToShadowMap separat () și RenderShadowedScene ().
În exemplu, vor fi utilizate două opțiuni de randare a shaderilor care diferă în implementare. Diferența dintre opțiuni este că în primul caz vom stoca adâncimea în textura cu ajutorul shader-ului și atunci când aplicăm o umbră pe scena faceți o comparație manuală cu textura. În cel de-al doilea caz, redarea este efectuată imediat în textura adâncimii fără implicarea shaderelor în acest proces, iar pentru comparație se utilizează modul de comparare a texturii, ceea ce ne eliberează de comparația manuală în shader.
Inițializarea și shader model banal, aveți posibilitatea să le rezolve pe cont propriu, așa că nu voi descrie. Dar inițializarea texturilor merită descrisă în detaliu.
Să începem cu ambele opțiuni pentru randarea umbrelor:
Opțiunea # 1: Atașați textura la FBO ca tampon de culoare. Pentru testul de adâncime folosim tamponul de redare.
În acest caz, avem de a produce adâncimea de intrare utilizând shaderului. În plus, putem înregistra profunzimea dorită. Putem salva ceva, în plus față de adâncimi, la componentele rămase ale texturii, dacă nu avem o singură componentă.
Opțiunea # 2: Atașați textura la FBO ca tampon de adâncime. Tamponul de culoare nu este utilizat.
Aici, nu mai avem nevoie de un shader pentru a păstra adâncimea. Faceți doar scena.
Ambele opțiuni au plusurile și minusurile.
Inițializare pentru opțiunea # 1
Să începem cu inițierea pentru opțiunea # 1. Să creați o textură care va fi atașată ca un tampon de culoare:
Cred că unele explicații necesită formatul texturii folosite.
Să începem cu amărăciune. Cu cât rata de biți este mai mică, cu atât este mai mică precizia. Prin urmare, la o rată de biți scăzută, mai multă atenție trebuie acordată planul de tăiere, aveți nevoie de aproape și plan cât mai aproape posibil de scena, mai ales vecinul. În caz contrar, aceasta poate provoca artefacte neplăcute din cauza lipsei de precizie. În acest exemplu, voi folosi 16 biți. Deși succesul poate fi realizat cu o textură pe 8 biți.
Tipul de argument penultim. pentru funcția glTexImage2D (). nu contează în acest caz, iar tipurile sunt aranjate pentru frumusețe.
Acum creați un tampon de randare, avem nevoie de el pentru testul de adâncime: