Pamācības

Atliktā renderēšana

Elviss Strazdiņš, 07.08.2010

Komentāri: 6

Motivācija

Mūsdienās, lai turētu līdzi jau tā augsti paceltajai grafisko izvirtību latiņai, ir jāveido dažādas tehnikas, kas varētu ietaupīt datora resursus. Gaisma un ēnas parasti ir pats prasīgākais efekts (ja to tā varētu saukt), un atliktā renderēšana (deferred rendering) ir viens no veidiem, kā taupīt video kartes resursus.

Kādu laiku atpakaļ radās doma apkopot atliktās renderēšanas principu vienā īsā rakstā. Tā nu tapa šis raksts, bet laika trūkuma dēļ tā arī nesanāca viņu nopublicēt. Beidzot notraucu putekļus no šī raksta un publicēju to šeit.

Atliktās renderēšanas pamatideja

3D objektu attēlošanai mūsdienās parasti izmanto trīsstūrus. Katram trīsstūrim var būt krāsa, faktūra, caurspīdīgums, gaismas atstarošanās īpašības un dažādi efekti. 3D objektu un gaismas avotu kopumu parasti sauc arī par scēnu. Visbiežāk scēna tiek renderēta ņemot katru objektu un to renderējot apgaismotu ar katru gaismas avotu, kas ir scēnā t.i. katrs objekts tiek renderēts tik reizes, cik gaismas avotu ir scēnā.

Lai samazinātu šo darbību skaitu, tiek izmantoti dažādi algoritmi, viens no tiem ir atliktā renderēšana. Atliktā renderēšana izmanto nedaudz citādāku piegājienu scēnas renderēšanai, sākumā visu objektu ar gaismu saistītās īpašības tiek norenderētas buferī, kas tiek saukts par G buferi. Tās ir krāsa, vienības vektori, dziļumi un cita informācija, kas varētu ietekmēt objekta fināla izskatu. Kad informācija ir saglabāta buferī, tiek renderētas katra gaisma atsevišķi kā ģeometrija. Līdz ar šīs renderēšanas metodes izmantošanu ObjektuSkaits * GaismuSkaits renderēšanu skaita vietā tiek iegūts ObjektuSkaits + GaismuSkaits.

Tehnika

Visvienkāršākajā piemērā G buferim tiek izmantotas 2 faktūras. Tā kā katras faktūras pikselis var sevī glabāt 4 kanālus, sarkanajai, zilajai, zaļajai (RGB) un alfa (A) krāsai, tad izmantojot 2 buferus, katrs pikselis sevī var glabāt 8 kanālus informācijai. Pirmās faktūras RGB kanāli sevī glabās objekta krāsu, bet A kanāls atspīdēšanas intensitāti, otrās faktūras RGB kanāli glabās skata telpas vienības vektoru, bet A - dziļumu.

Sākumā G buferī tiek renderēti visi objekti, kurus ietekmēs apgaismojums. Šeit arī parādās viens no šīs tehnikas trūkumiem - tas nedarbojas ar caurspīdīgiem objektiem, līdz ar to caurspīdīgus objektus ir jārenderē pašās beigās (gaisma tos neietekmēs).

Kad G buferis ir izveidots, tad tam pa virsu tiek renderētas visas gaismas un scēnas renderēšana ir pabeigta.

Papildinājumi

Lai papildinātu scēnu ar ēnām, kas krīt no objektiem, ir jāizveido atsevišķs ēnu buferis, kurā pēc kārtas visas gaismas ierenderē sevis veidotās ēnas.

Otra lieta, kas iespējams būs vajadzīga ir caurspīdīgo vai dažādu citu objektu, kam nav vajadzīgs apgaismojums, renderēšana pēc atliktās renderēšanas tehnikas. Šādā gadījumā der izveidot atsevišķā buferi, kurā pieglabāt katra pikseļa dziļumu, lai pēc tam var testēt, vai klāt nākošie objekti ir redzami.

Kopsavilkums

Lai arī šis algoritms ietaupa daudz laika uz renderēšanas rēķina, tomēr tam ir vairāki trūkumi, piemēram, nespēja strādā ar caurspīdīgiem objektiem. Algoritms arī nav tik saprotams un loģisks, kā klasiskā renderēšana, taču tam ir tieši tik pat daudz plusu, cik mīnusu. Sīkāk ar tiem var iepazīties dažādos interneta resursos.

Jūs varētu interesēt arī šādi raksti:

Aptauja

Vai Tu apmeklēji gamedev.lv konferenci [0]



Citas aptaujas

Autorizācija

Lietotājs

Parole


Reģistrēties Aizmirsi paroli?