Renderinimo principai

Iš Wikibooks.
Jump to navigation Jump to search

Vienas renderinimo būdas yra tikrinti kiekvieno trikampio atstumą nuo kameros. Pradėti renderinti nuo to trikampio, kurio atstumas iki kameros didžiausias (nerenderinami tie trikampiai, kurių normalės vektorius neigiamas palyginus su ViewVector). Kiekvienas trikampis, sudarytas iš trijų vertex'ų, yra atstumu nuo kameros pagal vidutinį trijų vertex'ų atstumą nuo kameros. Jeigu scenoje yra 100 trikampių tai reikia patikrinti (palyginti) kiekvieną trikampį su 100 kitų trikampių. Todėl, jei scenoje yra 100 trikampių, tai reikia 100*100=10000 palyginimų. Jei scenoje yra 1000 trikampių, tai reikia milijono palyginimų. Jei scenoje yra 10000 trikampių, tai reikia palyginimų. Trikampių skaičių scenoje reikia pakelti kvadratu, kad gauti patikrinimų (trikampių palyginimų) skaičių.


Kitas renderinimo būdas yra renderinti kiekvieną objektą (daiktą) atskirai. Reikia tik žinoti, kuris objektas toliausiai nuo kameros. Tada pradėti renderinti nuo toliausiai nutolusio nuo kameros objekto. Jei objektas turi iššokusių dalių kaip nosis ar rankos, tada reikia atskirti bet kokias truputi daugiau iškištas dalis (vieną objektą padalinti į daug mažesnių objektų). Objekto skaidymas į dalis labai palengvina šešėlių renderinimą. Renderinami visi trikampiai vieno atskiro objekto bet kokia tvarka išskyrus neigiamos normalės trikampiai, kurių normalė pagal kameros koordinačių sistemą yra priešingo ženklo nei ViewVector gylio koordinatė.


Trečias būdas yra kaip pirmas būdas ir turi quadratic overheat (trikampių atstumo [nuo kameros] palyginimų skaičius yra trikampių skaičius pakeltas kvadratu), bet naudoja kažką tokio kaip tessellation. Patikrinami (koks trikampis toliausiai nuo kameros) objektai (scena) su mažai trikampių, o renderinami objektai su ant kiekvieno didelio trikampio 100 mažų trikampių. Tada, jeigu yra ant kiekvieno trikampio 100 mažesnių trikampių, tai jei scenoje yra 1000 pagrindinių (neteseliuotų) trikampių, tai reikia iš viso renderinti 1000*1000*100=10^8 trikampių, kai scenoje yra 1000*100=10^5 trikampių.


Update 1. Gali būti, kad tai kas aukščiau parašyta yra nesamonė, nes taip trikampių į atmintį negalima sudėti... Paprasčiausias būdas yra renderinti visus trikampius išeilės ir kartu su pixelio spalva išsaugoti to pixelio gylio koordinatę (z koordinatę ant trikampio). Paskui, kai renderinamas kitas trikampis (arba kito trikampio pixelis), tai naujo trikampio pixelio z koordinatę palyginti su esamo pixelio z koordinate. Kurio [trikampio] pixelio z koordinatė yra arčiau kameros, to trikampio pixelio spalva ir išsaugoma. Taip renderinant, reikia renderinti visus scenoje esančius trikampius, bet kai trikampių scenoje padaugėja 1000 kartų, tai scenos renderinimo skaičiavimų reikia 1000 kartų daugiau, o ne milijoną kartų daugiau kaip parašyta aukščiau (trikampių skaičiui scenoje augant linijiniai skaičiavimų skaičius irgi auga linijiniai, o ne kvadratu). Gal dar galima nustatyti objektų konturus ir nerenderinti objektų, kurie aiškiai visiškai yra už arčiau kameros esančio objekto. Bet žolės, gėlių, medžių vieno už kito visiškai nepaslėpsi, todėl čia greičiausiai reikia lyginti visus [spraitų ar trikampių] pixelius. Gal dar galima optimizuoti ir atmesti trikampius kurių pixeliai yra toliau ir nebus matomi...


High Level Shading Language