4.3. Izrada mreže volumena sjene Da bi smo lakše shvatili kako se izrađuje volumen sjene, objašnjavanje ćemo izvršavati na jednom ilustrativnom primjeru. Recimo npr. da se naša mreža koja baca sjenu sastoji od 1000 trokuta i 1000 vrhova na koje djeluje 5 matrica (deformacijska mreža). Mreža volumena sjene sadržavati će sedam puta više trokuta i 2000 vrhova na koje djeluje dva puta više matrica. Prvih 1000 vrhova biti će jednaki originalnima, dok će ostalih 1000 biti njihova projicirana slika u smjeru sjene. Projekcija tih točaka će se vršiti s 5 novouvedenih matrica koje su jednake originalnim pomnoženim s projekcijskom matricom svijetla. Da bi smo takvu projekciju vrhova postigli indekse matrica koje posjeduje gornja polovica vrhova moramo uvećati za broj matrica (5). Tako npr. ako je neki vrh originalno deformiran 0., 1. i 3. matricom, moramo te indekse zamijeniti vrijednostima 5, 6 i 8. tako da postignemo projekciju. Zašto sedam puta više trokuta? Kako ne vršimo proračuna volumena sjene za svaku novu sliku, svaki trokut mora biti zadužen za stvaranje svoje sjene. Dakle, kako svaki trokut baca svoju sjenu, svaki trokut mora imati i svoj vlastiti volumen sjene. Za svaki rub takvog trokuta (ima ih 3) sva nova trokuta su volumena sjene su stvorena tako da se na svaki trokut koji baca sjenu troši 6 trokuta volumena sjene. Dodatni sedmi trokut je dodan da se ispravi problem s vlastitim osjenjivanjem (područje A) i jednak je kao originalni. U slijedećem isječku običnog C koda objasniti ćemo kako se konstruira mreža volumena sjene uz pretpostavku da su vrhovi već stvoreni. // POMOC // // Broj trokuta
originalne mreže int triangleNumber; // Broj vrhova
originalne mreže int
dotNumber; // Polje indeksa vrhova
za svaki trokut originalne mreže short *indices; // Polje indeksa vrhova
za svaki trokut mreže volumena sjene short *SMIndices; // KOD // SMIndices=(short*)malloc(7*triangleNumber*3*sizeof(short)); int i=0; // Za svaki trokut,
sedam trokuta je stvroreno for(int r=0; r<indiceNumber; r++) { // 1. rub trokuta = 2 nova trokuta volumena
sjene
SMIndices[i++]=indices[r*3+1];
SMIndices[i++]=indices[r*3+0];
SMIndices[i++]=indices[r*3+0]+dotNumber;
SMIndices[i++]=indices[r*3+0]+dotNumber;
SMIndices[i++]=indices[r*3+1]+dotNumber;
SMIndices[i++]=indices[r*3+1]; // 2. rub trokuta = 2 nova trokuta
volumena sjene
SMIndices[i++]=indices[r*3+2];
SMIndices[i++]=indices[r*3+1];
SMIndices[i++]=indices[r*3+1]+dotNumber;
SMIndices[i++]=indices[r*3+1]+dotNumber;
SMIndices[i++]=indices[r*3+2]+dotNumber;
SMIndices[i++]=indices[r*3+2]; // 3. rub trokuta = 2 nova trokuta
volumena sjene
SMIndices[i++]=indices[r*3+0];
SMIndices[i++]=indices[r*3+2];
SMIndices[i++]=indices[r*3+2]+dotNumber;
SMIndices[i++]=indices[r*3+2]+dotNumber;
SMIndices[i++]=indices[r*3+0]+dotNumber;
SMIndices[i++]=indices[r*3+0]; // 1 novi trokut volumena sjene – sedmi trokut
SMIndices[i++]=indices[r*3+0];
SMIndices[i++]=indices[r*3+1];
SMIndices[i++]=indices[r*3+2]; } |