04.05.2009
Ilgi nebiju kaut ko šeit ierakstījis.. tad nu varētu sākt ar pēdējo spēles daļu, kuru veidoju.
Nesen domāju par apgaismojumu. Nonācu pie pavisam vienkārša plāna. Pamatā ir parastā diffuse tekstūra un lightmape (par šo nedaudz vēlāk, citā atskaitē, pastāstīšu). Ja dators ir pietiekami spēcīgs, varēs uzlikt arī bump mapping'u.
Apgaismojuma zīmēšanas sistēma ir diezgan vienkārša - šeiderī lietotas 4 tekstūras - diffuse map, normal map, lightmap un speciālā apgaismojuma tekstūra, kuras rgb kanālos ir vidējais virziens no punkta uz gaismām, un alpha kanālā ir attālums līdz tuvākajai gaismai, prasa tādas pašas tekstūru koordinātas kā lightmape. Domāju, ka tas, kas tiek darīts šeiderī jau visiem ir apmēram skaidrs. Pielikumā var apskatīt lietotās tekstūras un rezultātu.
Pie specular mappinga ir jautājuma zīme tāpēc, ka nezinu, vai radīsies ideja, kā to ielikt šajā apgaismošanas sistēmā, un, ja radīsies ideja, nav zināms, vai iederēsies labi spēlē..
----
Ir izveidoti specular highlighti, darbojas pēc līdzīgiem principiem un viss tiek vienreiz uzzīmēts. Lai gan ir iespēja, ka spēlē tie varētu neizskatīties tikpat labi, visticamāk tie tomēr tur būs.
Šeiderī visi highlight'i tiek rēķināti pēc tiem pašiem principiem kā citās spēlēs. Vienīgās atšķirības - virziens no punkta uz gaismu ir aprēķināts jau iepriekš un highlighta krāsošana notiek nedaudz citādāk. Pielikumā var redzēt rezultātu.
| Pielikums | Izmērs |
|---|---|
| graphics.jpg | 320.14 KB |
| graphics_spec.jpg | 289.91 KB |


Komentāri
Storm:
Kaarteejais mans rants:
Ja jau tu saki ka "speciaalajaa apgaismojuma tekstuuraa" tiek glabaats videejais virziens uz gaismaam un attaalums liidz tuvaakajai gaismai, tad jautaajums ir taads - tu to visu prekalkulee vai izreekini katru freimu? Jo ja tu prekalkulee (kaa light maps) tad kaada jeega vispaar kaut ko taadu glabaat, nevis vienkaarsu kraasu saglabaat) otrais - ja tu izmantojot render targetus nstuff katru feimu visu to paareekini - tev taapat saderii (tajaa reekinaasanas) ir jaaiziet cauri visaam gaismaam, janosaka virziens, jaarizreekina videejais utt, ko es ar to gribu pateikt - jebkuraa gadiijumaa, vienalga, vai gaismas ir statiskas vai dinamiskas sitaa sisteema ir pilniigs craps jo prekalkulaacijas gadiijumaa tu vari vienkaarsi gatavu kraasu ierakstiit un dinamiskajaa gadiijumaa taa izmantotaa tekstuuru atminja un laiks reekinot ir lieks, jo tu to pasu vari izdariit netaisot nekaadas "speciaalaas apgaismojuma teksturas", bet vienkaarsi izreekinot gaismu kaadai tai jaabuut - izreekini virzienu un attaalumu liidz katrai gaismai un atieciigi arii pieskir apgaismojumu pikselim.
snake5:
Virzieni uz gaismām ir iepriekš aprēķināti. Vienkārši krāsu glabājot sanāktu nenormālas izšķirtspējas lightmapes (ņemot vērā to, ka ļoti daudzas gaismas vajadzēs izslēgt un ieslēgt) -- paņemtu ļoti daudz videokartes atmiņas + es nevarētu uztaisīt specular mapping'u. Tāpēc neuztraucies, viss būs OK. :)
Storm:
Redzi, specular mappings *arii* ir "ieburnots" tajaa light mapee - un aiznemtu TIESI tikpat vietas cik sobriid. Viens RGBA32 bufferis, kas glabaa gaismas. Un vienkaarsi saderis - viena kraasa (tekstuura) reiz gaisma no gaismas teksturas. Kaarteejais snake tev te izgudrojums, kad tu domaa ka taa buus aatraak/smukaak, bet effekts ir tiesi otraadaaks - leenak, nesmukaak... Nu kad buus kaut kas gatavs tad jau redzeesim.
snake5:
Kā tu "ieburnosi" lightmapē specular highlightus? Tie ir atkarīgi no kameras/acs atrašanās vietas.
Ok, varam jau arī parēķināt, cik aizņemtu tāds lightmaps. Zemas izšķirtspējas lightmaps ir piemēram 512x512 līmenim.
512 * 512 * 3 (rgb) lightmapa izmēra attiecība pret tekstūras izmēru: 1:16, tātad katru izmēru pareizinam ar 16. Rezultātā ir 512 * 512 * 16 * 16 * 3 baiti jeb 201'326'592 baiti = 196'608 kB = 192 MB. Nemaz nerunājot par to, ka D3D9 neatbalsta tik lielas tekstūras.
Manā variantā: 2 lightmapi, katrs 512 * 512 * 3 => 512 * 512 * 3 * 2 baiti = 1'572'864 baiti = 1'536 kB = 1.5 MB. Katra tekstūra 3/4 MB.
Storm:
Pirmaamkaartaam, tava matemaatika ir geiza no logiskaa viedoklja -> Ja es sapratu pareizi tad tev uz liimeni buus izreekinaats taa tava uber apgaismes tekstuura - kipa taa kaa normaalaas speelees ir light maps, bet tikai satur savaadaaku informaaciju. Tad es nesaprotu ko tu tur reizini ar 16 to normaalo light mapu lol. Ja tev liimenja "surfaces" ir noklaatas ar lightmap, kuras kopeejais izmeers ir 512x512, tad tik arii vinja aiznem - 512x512rgb prieks viena liimenja. Taapat arii tavs uber light tekstuura - pieks viena liimenja ka tu saki 1.5mb. So - Vai nu tev ir normaals light maps un viena instrukcija saderii, vai arii tavs uber maps un smags saderis, kas veel bonusaa aiznem nevajadziigu vietu. Un ko noziimee - nevar uztaisiit tik lielu tekstuuru lol, tu domaa ka visam ir jaabuut vienaa tekstuuraa savadaak dators uzspraags, vai arii tu nemaaki uztaisiit lai ligtmaps vareetu sastaaveet no vairaakaam tekstuuraam? Paskaidro siikaak varbuut kaa tad tiesi straadaas taa tava uber light tekstuura.
snake5:
Kad iznāks demo versija, varēs redzēt, šeidera kodu neslēpšu.
Bet tas, ko tu tur sauc par normālo lightmapu, nav nekas normāls. Es negribu visu apgaismojumu pārrēķināt katru reizi, kad nomainu tekstūru..
Es apgaismojumam lietoju 2 globālas tekstūras - lightmapu un tekstūru, kurā glabājas virzieni uz gaismām. Tā kā man pagaidām spēle vairāk lieto CPU, ne GPU, tad vairākas lightmapes noteikti nebūs. Labāk uzrenderē vienu tādu lightmapi, kādu tu gribi, lai lietoju, citādāk es nesaprotu, kādu tu īsti to domā..
EDDY:
Liec tik iekšā, gan būs labi.
snake5:
Paldies! :) Pēc tam, kad to pateici, diezgan skeptiski noskatījos uz iespējām, bet tad iesāku strādāt, dažas stundas pamocījos, un šķiet, ka ir iegūti lietojami specular highlight'i. Vairāk par to šajā pašā atskaitē.